diff --git a/src/JuMP.jl b/src/JuMP.jl index 8a37a291a71..f2e52eeddbd 100644 --- a/src/JuMP.jl +++ b/src/JuMP.jl @@ -236,15 +236,30 @@ mutable struct Model <: AbstractModel end """ - Model(; caching_mode::MOIU.CachingOptimizerMode=MOIU.AUTOMATIC) + Model( + [optimizer_factory]; + caching_mode::MOIU.CachingOptimizerMode = MOIU.AUTOMATIC, + bridge_constraints::Bool = true, + auto_bridge::Bool = false, + ) + +Return a new JuMP model based on a `CachingOptimizer` in `caching_mode`. + +See [`set_optimizer`](@ref) for the description of the `optimizer_factory` and +`bridge_constraints` arguments. + +If `optimizer_factory` is not provided, use [`set_optimizer`](@ref) to set the +optimizer before calling [`optimize!`](@ref). -Return a new JuMP model without any optimizer; the model is stored the model in -a cache. The mode of the `CachingOptimizer` storing this cache is -`caching_mode`. Use [`set_optimizer`](@ref) to set the optimizer before -calling [`optimize!`](@ref). +If `auto_bridge == true`, the `CachingOptimizer` will automatically add bridges +to the underlying optimizer only if necessary, and ignore the +`bridge_constraints` argument. """ -function Model(; +function Model( + optimizer_factory = nothing; caching_mode::MOIU.CachingOptimizerMode = MOIU.AUTOMATIC, + bridge_constraints::Bool = true, + auto_bridge::Bool = false, solver = nothing, ) if solver !== nothing @@ -254,41 +269,20 @@ function Model(; "(https://jump.dev/JuMP.jl/latest/) for latest syntax.", ) end - universal_fallback = MOIU.UniversalFallback(MOIU.Model{Float64}()) - caching_opt = MOIU.CachingOptimizer(universal_fallback, caching_mode) - return direct_model(caching_opt) -end - -""" - Model(optimizer_factory; - caching_mode::MOIU.CachingOptimizerMode=MOIU.AUTOMATIC, - bridge_constraints::Bool=true) - -Return a new JuMP model with the provided optimizer and bridge settings. This -function is equivalent to: -```julia - model = Model() - set_optimizer(model, optimizer_factory, - bridge_constraints=bridge_constraints) - return model -``` -See [`set_optimizer`](@ref) for the description of the `optimizer_factory` and -`bridge_constraints` arguments. - -## Examples - -The following creates a model with the optimizer set to `Ipopt`: -```julia -model = Model(Ipopt.Optimizer) -``` -""" -function Model(optimizer_factory; bridge_constraints::Bool = true, kwargs...) - model = Model(; kwargs...) - set_optimizer( - model, - optimizer_factory, - bridge_constraints = bridge_constraints, + cache = MOIU.UniversalFallback(MOIU.Model{Float64}()) + caching_opt = MOIU.CachingOptimizer( + cache; + mode = caching_mode, + auto_bridge = auto_bridge, ) + model = direct_model(caching_opt) + if optimizer_factory !== nothing + set_optimizer( + model, + optimizer_factory, + bridge_constraints = !auto_bridge && bridge_constraints + ) + end return model end @@ -718,7 +712,7 @@ the attribute MathOptInterface.SolveTime()" if the attribute is not implemented. """ function solve_time(model::Model) - return MOI.get(model, MOI.SolveTime()) + return MOI.get(model, MOI.SolveTimeSec()) end """ diff --git a/src/aff_expr.jl b/src/aff_expr.jl index 843e1629e5f..7d5155d843a 100644 --- a/src/aff_expr.jl +++ b/src/aff_expr.jl @@ -555,7 +555,7 @@ end function AffExpr(m::Model, f::MOI.ScalarAffineFunction) aff = AffExpr() for t in f.terms - add_to_expression!(aff, t.coefficient, VariableRef(m, t.variable_index)) + add_to_expression!(aff, t.coefficient, VariableRef(m, t.variable)) end aff.constant = f.constant return aff diff --git a/src/quad_expr.jl b/src/quad_expr.jl index 7ca188b8767..17c41dd044a 100644 --- a/src/quad_expr.jl +++ b/src/quad_expr.jl @@ -531,8 +531,8 @@ function QuadExpr(m::Model, f::MOI.ScalarQuadraticFunction) AffExpr(m, MOI.ScalarAffineFunction(f.affine_terms, f.constant)), ) for t in f.quadratic_terms - v1 = t.variable_index_1 - v2 = t.variable_index_2 + v1 = t.variable_1 + v2 = t.variable_2 coef = t.coefficient if v1 == v2 coef /= 2 diff --git a/test/print.jl b/test/print.jl index 5f4d466d315..ac8eb2e0d50 100644 --- a/test/print.jl +++ b/test/print.jl @@ -928,7 +928,7 @@ end MOI.set(mockoptimizer, MOI.SimplexIterations(), 1) MOI.set(mockoptimizer, MOI.BarrierIterations(), 1) MOI.set(mockoptimizer, MOI.NodeCount(), 1) - MOI.set(mockoptimizer, MOI.SolveTime(), 5.0) + MOI.set(mockoptimizer, MOI.SolveTimeSec(), 5.0) @test sprint(show, solution_summary(model)) == """ * Solver : Mock