diff --git a/docs/src/submodules/Utilities/overview.md b/docs/src/submodules/Utilities/overview.md index 36ac7f1d5b..8acf9d3b8f 100644 --- a/docs/src/submodules/Utilities/overview.md +++ b/docs/src/submodules/Utilities/overview.md @@ -374,19 +374,14 @@ function _copy_to( return end -function MOI.copy_to( - dest::Optimizer, - src::Model; - copy_names::Bool = false -) +function MOI.copy_to(dest::Optimizer, src::Model) _copy_to(dest, src) return MOI.Utilities.identity_index_map(src) end function MOI.copy_to( dest::Optimizer, - src::MOI.Utilities.UniversalFallback{Model}; - copy_names::Bool = false + src::MOI.Utilities.UniversalFallback{Model}, ) # Copy attributes from `src` to `dest` and error in case any unsupported # constraints or attributes are set in `UniversalFallback`. @@ -395,8 +390,7 @@ end function MOI.copy_to( dest::Optimizer, - src::MOI.ModelLike; - copy_names::Bool = false + src::MOI.ModelLike, ) model = Model() index_map = MOI.copy_to(model, src) diff --git a/docs/src/tutorials/implementing.md b/docs/src/tutorials/implementing.md index 2560d4dddc..9201ad730d 100644 --- a/docs/src/tutorials/implementing.md +++ b/docs/src/tutorials/implementing.md @@ -464,17 +464,12 @@ If you don't want to implement [`copy_to`](@ref), e.g., because the solver has no API for building the problem in a single function call, define the following fallback: ```julia -# If you support VariableName and ConstraintName... -MOI.supports_incremental_interface(::Optimizer, copy_names::Bool) = true -# Otherwise... -MOI.supports_incremental_interface(::Optimizer, copy_names::Bool) = !copy_names +MOI.supports_incremental_interface(::Optimizer) = true function MOI.copy_to(dest::Optimizer, src::MOI.ModelLike; kwargs...) return MOI.Utilities.default_copy_to(dest, src; kwargs...) end ``` -See [`supports_incremental_interface`](@ref) for more details on whether to -implement the `true` or `!copy_names` version. ## [Names](@id implement_names) diff --git a/src/Bridges/bridge_optimizer.jl b/src/Bridges/bridge_optimizer.jl index b4cf9a49b0..a09bc9c333 100644 --- a/src/Bridges/bridge_optimizer.jl +++ b/src/Bridges/bridge_optimizer.jl @@ -430,11 +430,8 @@ function MOI.copy_to( return MOIU.default_copy_to(dest, src; kwargs...) end -function MOI.supports_incremental_interface( - b::AbstractBridgeOptimizer, - copy_names::Bool, -) - return MOI.supports_incremental_interface(b.model, copy_names) +function MOI.supports_incremental_interface(b::AbstractBridgeOptimizer) + return MOI.supports_incremental_interface(b.model) end function MOIU.final_touch(uf::AbstractBridgeOptimizer, index_map) return MOIU.final_touch(uf.model, index_map) diff --git a/src/DeprecatedTest/contconic.jl b/src/DeprecatedTest/contconic.jl index 0f395532a4..ca636ab9f1 100644 --- a/src/DeprecatedTest/contconic.jl +++ b/src/DeprecatedTest/contconic.jl @@ -10,7 +10,7 @@ function _lin1test(model::MOI.ModelLike, config::Config, vecofvars::Bool) # y + z == 2 # x>=0 y>=0 z>=0 # Opt obj = -11, soln x = 1, y = 0, z = 2 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -147,7 +147,7 @@ function _lin2test(model::MOI.ModelLike, config::Config, vecofvars::Bool) # s zero # Opt solution = -82 # x = -4, y = -3, z = 16, s == 0 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -324,7 +324,7 @@ function lin3test(model::MOI.ModelLike, config::Config) # min 0 # s.t. -1 + x ∈ R₊ # 1 + x ∈ R₋ - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -408,7 +408,7 @@ function lin4test(model::MOI.ModelLike, config::Config) # min 0 # s.t. -1 + x ∈ R₊ # x ∈ R₋ - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -486,7 +486,7 @@ function _norminf1test(model::MOI.ModelLike, config::Config, vecofvars::Bool) # st x == 1 # y == 1/2 # x >= ||(y,z)||_∞ - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -624,7 +624,7 @@ function norminf2test(model::MOI.ModelLike, config::Config) # s.t. -2 + y ∈ R₊ # -1 + x ∈ R₋ # (x,y) ∈ NormInf₂ - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -717,7 +717,7 @@ function norminf3test(model::MOI.ModelLike, config::Config) # st (-1 + x, 2 .+ y) in NormInf(1 + n) # (1 .+ y) in Nonnegatives(n) # let n = 3. optimal solution: y .= -1, x = 2 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports(model, MOI.ObjectiveFunction{MOI.SingleVariable}()) @test MOI.supports(model, MOI.ObjectiveSense()) @test MOI.supports_constraint( @@ -813,7 +813,7 @@ function _normone1test(model::MOI.ModelLike, config::Config, vecofvars::Bool) # st x == 1 # y == 1/2 # x >= ||(y,z)||_1 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -947,7 +947,7 @@ function normone2test(model::MOI.ModelLike, config::Config) # s.t. -2 + y ∈ R₊ # -1 + x ∈ R₋ # (x,y) ∈ NormOne₂ - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -1040,7 +1040,7 @@ function normone3test(model::MOI.ModelLike, config::Config) # st (-1 + x, 2 .+ y) in NormOne(1 + n) # (1 .+ y) in Nonnegatives(n) # let n = 3. optimal solution: y .= -1, x = 4 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports(model, MOI.ObjectiveFunction{MOI.SingleVariable}()) @test MOI.supports(model, MOI.ObjectiveSense()) @test MOI.supports_constraint( @@ -1134,7 +1134,7 @@ function _soc1test(model::MOI.ModelLike, config::Config, vecofvars::Bool) # max 0x + 1y + 1z # st x == 1 # x >= ||(y,z)|| - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -1256,7 +1256,7 @@ function _soc2test(model::MOI.ModelLike, config::Config, nonneg::Bool) # s.t. -1/√2 + y ∈ R₊ # 1 - t ∈ {0} # (t,x,y) ∈ SOC₃ - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -1412,7 +1412,7 @@ function soc3test(model::MOI.ModelLike, config::Config) # s.t. -2 + y ∈ R₊ # -1 + x ∈ R₋ # (x,y) ∈ SOC₂ - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -1512,7 +1512,7 @@ function soc4test(model::MOI.ModelLike, config::Config) # (x[1],x[4],x[5]) ∈ SOC₃ # Like SOCINT1 but with copies of variables and integrality relaxed # Tests out-of-order indices in cones - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -1622,7 +1622,7 @@ function _rotatedsoc1test(model::MOI.ModelLike, config::Config, abvars::Bool) # [1.0] - [ ] SOCRotated # [0.0] - [-y ] SOCRotated # [0.0] - [ -z] SOCRotated - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -1763,7 +1763,7 @@ function rotatedsoc2test(model::MOI.ModelLike, config::Config) # (x,y,z) ∈ SOCRotated b = [-2, -1, 1 / 2] c = [0.0, 0.0, 0.0] - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -1871,7 +1871,7 @@ function rotatedsoc3test(model::MOI.ModelLike, config::Config; n = 2, ub = 3.0) # t2 == 1 # [t1/√2, t2/√2, x] in SOC4 # [x1/√2, u/√2, v] in SOC3 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -2053,7 +2053,7 @@ function rotatedsoc4test(model::MOI.ModelLike, config::Config; n = 2, ub = 3.0) # with equality iff x = y. # We conclude that the optimal solution is x = y = t = u = 1 # with objective value 2. - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -2140,7 +2140,7 @@ function _geomean1test(model::MOI.ModelLike, config::Config, vecofvars, n = 3) # (xyz)^(1/3) ≤ (x+y+z)/3 = 1 # Therefore xyz ≤ 1 # This can be attained using x = y = z = 1 so it is optimal. - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -2245,7 +2245,7 @@ function _geomean2test(model::MOI.ModelLike, config::Config, vecofvars) # st (t,x_1,x_2,...,x_9) ∈ GeometricMeanCone(10) # x_1 == x_2, ..., x_9 == 1 # the optimal solution is 1 with optimal value 1 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -2358,7 +2358,7 @@ function _geomean3test(model::MOI.ModelLike, config::Config, vecofvars) # st (t,x) ∈ GeometricMeanCone(2) # x <= 2 # the optimal solution is (t, x) = (2, 2) with objective value 4 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -2469,7 +2469,7 @@ function _exp1test(model::MOI.ModelLike, config::Config, vecofvars::Bool) # st y e^(x/y) <= z, y > 0 (i.e (x, y, z) are in the exponential primal cone) # x == 1 # y == 2 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -2570,7 +2570,7 @@ function exp2test(model::MOI.ModelLike, config::Config) # A problem where ECOS was failing atol = config.atol rtol = config.rtol - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -2735,7 +2735,7 @@ function exp3test(model::MOI.ModelLike, config::Config) # A problem where ECOS was failing atol = config.atol rtol = config.rtol - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -2836,7 +2836,7 @@ function _dualexp1test(model::MOI.ModelLike, config::Config, vecofvars::Bool) # x_2 + v == 1 # w == 1 # (u, v, w) ∈ DualExponentialCone - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -2969,7 +2969,7 @@ function _pow1test(model::MOI.ModelLike, config::Config, vecofvars::Bool) # v + β = 0 # w = -1 a = 0.9 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -3091,7 +3091,7 @@ function _dualpow1test( # Here the best you can do is u + v == 1 and for that inequality must hold so u = 9v # hence you get v = 0.1 and u = 0.9. # The same works for other values of exponent as key word argument - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -3215,7 +3215,7 @@ function relentr1test(model::MOI.ModelLike, config::Config) # st u >= 2*log(2/1) + 3*log(3/5) (i.e. (u, 1, 5, 2, 3) in RelativeEntropyCone(5)) # Optimal solution is: # u = 2*log(2/1) + 3*log(3/5) ≈ -0.1461825 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports(model, MOI.ObjectiveFunction{MOI.SingleVariable}()) @test MOI.supports(model, MOI.ObjectiveSense()) @test MOI.supports_constraint( @@ -3280,7 +3280,7 @@ function normspec1test(model::MOI.ModelLike, config::Config) # st t >= sigma_1([1 1 0; 1 -1 1]) (i.e (t, 1, 1, 1, -1, 0, 1]) is in NormSpectralCone(2, 3)) # Singular values are [sqrt(3), sqrt(2)], so optimal solution is: # t = sqrt(3) - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports(model, MOI.ObjectiveFunction{MOI.SingleVariable}()) @test MOI.supports(model, MOI.ObjectiveSense()) @test MOI.supports_constraint( @@ -3342,7 +3342,7 @@ function normspec2test(model::MOI.ModelLike, config::Config) # st t >= sigma_1([1 1; 1 -1; 0 1]) (i.e (t, 1, 1, 0, 1, -1, 1]) is in NormSpectralCone(3, 2)) # Singular values are [sqrt(3), sqrt(2)], so optimal solution is: # t = sqrt(3) - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports(model, MOI.ObjectiveFunction{MOI.SingleVariable}()) @test MOI.supports(model, MOI.ObjectiveSense()) @test MOI.supports_constraint( @@ -3408,7 +3408,7 @@ function normnuc1test(model::MOI.ModelLike, config::Config) # st t >= sum_i sigma_i([1 1 0; 1 -1 1]) (i.e (t, 1, 1, 1, -1, 0, 1]) is in NormNuclearCone(2, 3)) # Singular values are [sqrt(3), sqrt(2)], so optimal solution is: # t = sqrt(3) + sqrt(2) - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports(model, MOI.ObjectiveFunction{MOI.SingleVariable}()) @test MOI.supports(model, MOI.ObjectiveSense()) @test MOI.supports_constraint( @@ -3473,7 +3473,7 @@ function normnuc2test(model::MOI.ModelLike, config::Config) # st t >= sum_i sigma_i([1 1; 1 -1; 0 1]) (i.e (t, 1, 1, 0, 1, -1, 1]) is in NormNuclearCone(3, 2)) # Singular values are [sqrt(3), sqrt(2)], so optimal solution is: # t = sqrt(3) + sqrt(2) - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports(model, MOI.ObjectiveFunction{MOI.SingleVariable}()) @test MOI.supports(model, MOI.ObjectiveSense()) @test MOI.supports_constraint( @@ -3551,7 +3551,7 @@ function _psd0test( # ⎛ 1 1 ⎞ # X = ⎜ ⎟ y = 2 # ⎝ 1 1 ⎠ - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -3735,7 +3735,7 @@ function _psd1test( # With (2) we get α = √(3 - 2obj - 4x2) / 2 β = k * α - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -3900,7 +3900,7 @@ function psdt2test(model::MOI.ModelLike, config::Config) atol = config.atol rtol = config.rtol # Caused getdual to fail on SCS and Mosek - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -4071,7 +4071,7 @@ function _psd3test(model::MOI.ModelLike, psdcone, config::Config{T}) where {T} # [1 1 x] atol = config.atol rtol = config.rtol - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports(model, MOI.ObjectiveFunction{MOI.SingleVariable}()) @test MOI.supports(model, MOI.ObjectiveSense()) @test MOI.supports_constraint(model, MOI.VectorAffineFunction{T}, psdcone) @@ -4196,7 +4196,7 @@ function _det1test( # | | # |_________| # -Q22 ≥ -1 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -4357,7 +4357,7 @@ function _det2test(model::MOI.ModelLike, config::Config, detcone) # logdet(mat) ≈ 1.609438 mat = Float64[3 2 1; 2 2 1; 1 1 3] matL = Float64[3, 2, 2, 1, 1, 3] - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports(model, MOI.ObjectiveFunction{MOI.SingleVariable}()) @test MOI.supports(model, MOI.ObjectiveSense()) @test MOI.supports_constraint( diff --git a/src/DeprecatedTest/contlinear.jl b/src/DeprecatedTest/contlinear.jl index 9a013f9dc4..5932441d59 100644 --- a/src/DeprecatedTest/contlinear.jl +++ b/src/DeprecatedTest/contlinear.jl @@ -8,7 +8,7 @@ function linear1test(model::MOI.ModelLike, config::Config{T}) where {T} # min -x # st x + y <= 1 (x + y - 1 ∈ Nonpositives) # x, y >= 0 (x, y ∈ Nonnegatives) - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -498,7 +498,7 @@ function linear2test(model::MOI.ModelLike, config::Config{T}) where {T} # Min -x # s.t. x + y <= 1 # x, y >= 0 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -596,7 +596,7 @@ function linear3test(model::MOI.ModelLike, config::Config{T}) where {T} # min x # s.t. x >= 0 # x >= 3 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -715,7 +715,7 @@ end function linear4test(model::MOI.ModelLike, config::Config{T}) where {T} atol = config.atol rtol = config.rtol - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -810,7 +810,7 @@ function linear5test(model::MOI.ModelLike, config::Config{T}) where {T} # x >= 0, y >= 0 # # solution: x = 1.3333333, y = 1.3333333, objv = 2.66666666 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -950,7 +950,7 @@ end function linear6test(model::MOI.ModelLike, config::Config{T}) where {T} atol = config.atol rtol = config.rtol - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -1069,7 +1069,7 @@ function linear7test(model::MOI.ModelLike, config::Config{T}) where {T} # s.t. - z == - 1 (c1) # w == 1 (c2) # i.e. z == w == 1 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -1202,7 +1202,7 @@ function linear8atest(model::MOI.ModelLike, config::Config{T}) where {T} # min x # s.t. 2x+y <= -1 # x,y >= 0 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -1281,7 +1281,7 @@ function linear8btest(model::MOI.ModelLike, config::Config{T}) where {T} # min -x-y # s.t. -x+2y <= 0 # x,y >= 0 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -1351,7 +1351,7 @@ function linear8ctest(model::MOI.ModelLike, config::Config{T}) where {T} # min -x-y # s.t. x-y == 0 # x,y >= 0 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -1430,7 +1430,7 @@ function linear9test(model::MOI.ModelLike, config::Config{T}) where {T} # # solution: (59.0909, 36.3636) # objv: 71818.1818 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -1523,7 +1523,7 @@ function linear10test(model::MOI.ModelLike, config::Config{T}) where {T} # # s.t. 5 <= x + y <= 10 # x, y >= 0 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -1699,7 +1699,7 @@ function linear10btest(model::MOI.ModelLike, config::Config{T}) where {T} # # s.t. -1 <= x + y <= 10 # x, y >= 0 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -1807,7 +1807,7 @@ function linear11test(model::MOI.ModelLike, config::Config{T}) where {T} # w + z == 1 # w >= 0, z <= 0 # sol: w = 1, z = 0 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -1883,7 +1883,7 @@ function linear12test(model::MOI.ModelLike, config::Config{T}) where {T} # s.t. 2x-3y <= -7 # y <= 2 # x,y >= 0 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -1967,7 +1967,7 @@ function linear13test(model::MOI.ModelLike, config::Config{T}) where {T} # find x, y # s.t. 2x + 3y >= 1 # x - y == 0 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports_constraint( model, MOI.ScalarAffineFunction{T}, @@ -2034,7 +2034,7 @@ function linear14test(model::MOI.ModelLike, config::Config{T}) where {T} # s.t. 3x + 2y + z <= 2 # x, y, z >= 0 # z <= 1 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -2172,7 +2172,7 @@ function linear15test(model::MOI.ModelLike, config::Config{T}) where {T} # minimize 0 # s.t. 0 == 0 # x == 1 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), diff --git a/src/DeprecatedTest/contquadratic.jl b/src/DeprecatedTest/contquadratic.jl index c5e51c2a9c..22099a9a27 100644 --- a/src/DeprecatedTest/contquadratic.jl +++ b/src/DeprecatedTest/contquadratic.jl @@ -8,7 +8,7 @@ function qp1test(model::MOI.ModelLike, config::Config) # st x + 2y + 3z >= 4 (c1) # x + y >= 1 (c2) # x, y, z \in R - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarQuadraticFunction{Float64}}(), @@ -107,7 +107,7 @@ function qp2test(model::MOI.ModelLike, config::Config) # st x + 2y + 3z >= 4 (c1) # x + y >= 1 (c2) # x, y, z \in R - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarQuadraticFunction{Float64}}(), @@ -241,7 +241,7 @@ function qp3test(model::MOI.ModelLike, config::Config) # minimize 2 x^2 + y^2 + xy + x + y + 1 # s.t. x, y >= 0 # x + y = 1 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarQuadraticFunction{Float64}}(), @@ -363,7 +363,7 @@ function qcp1test(model::MOI.ModelLike, config::Config) # x² + y <= 2 (c2) # Optimal solution # x = 1/2, y = 7/4 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -476,7 +476,7 @@ function qcp2test(model::MOI.ModelLike, config::Config) rtol = config.rtol # Max x # s.t. x^2 <= 2 (c) - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -542,7 +542,7 @@ function qcp3test(model::MOI.ModelLike, config::Config) rtol = config.rtol # Min -x # s.t. x^2 <= 2 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -612,7 +612,7 @@ function _qcp4test(model::MOI.ModelLike, config::Config, less_than::Bool) # Max x # s.t. x^2 + x * y + y^2 <= 3 (c) # y == 1 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -716,7 +716,7 @@ function ncqcp1test(model::MOI.ModelLike, config::Config) # Max 2x + y # s.t. x * y <= 4 (c) # x, y >= 1 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -789,7 +789,7 @@ function ncqcp2test(model::MOI.ModelLike, config::Config) # s.t. x * y == 4 (c) # x * x == 4 (c2) # x, y >= 0 - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports_constraint( model, MOI.ScalarQuadraticFunction{Float64}, @@ -864,7 +864,7 @@ function socp1test(model::MOI.ModelLike, config::Config) # s.t. x + y >= 1 (c1) # x^2 + y^2 <= t^2 (c2) # t >= 0 (bound) - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), diff --git a/src/DeprecatedTest/intconic.jl b/src/DeprecatedTest/intconic.jl index b9ef229a08..bee59efbe3 100644 --- a/src/DeprecatedTest/intconic.jl +++ b/src/DeprecatedTest/intconic.jl @@ -8,7 +8,7 @@ function intsoc1test(model::MOI.ModelLike, config::Config) # st x == 1 # x >= ||(y,z)|| # (y,z) binary - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), diff --git a/src/DeprecatedTest/intlinear.jl b/src/DeprecatedTest/intlinear.jl index be9d998617..67fabb8f86 100644 --- a/src/DeprecatedTest/intlinear.jl +++ b/src/DeprecatedTest/intlinear.jl @@ -12,7 +12,7 @@ function int1test(model::MOI.ModelLike, config::Config) # x is continuous: 0 <= x <= 5 # y is integer: 0 <= y <= 10 # z is binary - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -139,7 +139,7 @@ function int2test(model::MOI.ModelLike, config::Config) atol = config.atol rtol = config.rtol @testset "SOSI" begin - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -244,7 +244,7 @@ function int2test(model::MOI.ModelLike, config::Config) end end @testset "SOSII" begin - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -379,7 +379,7 @@ function int3test(model::MOI.ModelLike, config::Config) # z in {0, 1, 2, ..., 100} MOI.empty!(model) @test MOI.is_empty(model) - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -456,7 +456,7 @@ function knapsacktest(model::MOI.ModelLike, config::Config) # a,b,c,d,e ∈ binary MOI.empty!(model) @test MOI.is_empty(model) - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -917,7 +917,7 @@ end function _semitest(model::MOI.ModelLike, config::Config{T}, int::Bool) where {T} atol = config.atol rtol = config.rtol - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), diff --git a/src/DeprecatedTest/modellike.jl b/src/DeprecatedTest/modellike.jl index dd5d50337b..9527b4b596 100644 --- a/src/DeprecatedTest/modellike.jl +++ b/src/DeprecatedTest/modellike.jl @@ -71,7 +71,7 @@ function nametest(model::MOI.ModelLike; delete::Bool = true) end @testset "Name" begin MOI.empty!(model) - @test MOI.supports_incremental_interface(model, true) #=copy_names=# + @test MOI.supports_incremental_interface(model) @test MOI.supports(model, MOI.Name()) @test !(MOI.Name() in MOI.get(model, MOI.ListOfModelAttributesSet())) @test MOI.get(model, MOI.Name()) == "" @@ -290,7 +290,7 @@ end # Taken from https://github.com/jump-dev/MathOptInterfaceUtilities.jl/issues/41 function validtest(model::MOI.ModelLike; delete::Bool = true) MOI.empty!(model) - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) v = MOI.add_variables(model, 2) @test MOI.is_valid(model, v[1]) @test MOI.is_valid(model, v[2]) @@ -344,7 +344,7 @@ end function emptytest(model::MOI.ModelLike) MOI.empty!(model) - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) # Taken from LIN1 v = MOI.add_variables(model, 3) @test MOI.supports_constraint( @@ -623,7 +623,7 @@ end function start_values_test(dest::MOI.ModelLike, src::MOI.ModelLike) MOI.empty!(dest) - @test MOI.supports_incremental_interface(src, false) #=copy_names=# + @test MOI.supports_incremental_interface(src) x, y, z = MOI.add_variables(src, 3) fz = MOI.SingleVariable(z) a = MOI.add_constraint(src, x, MOI.EqualTo(1.0)) @@ -700,7 +700,7 @@ function start_values_test(dest::MOI.ModelLike, src::MOI.ModelLike) end function copytest(dest::MOI.ModelLike, src::MOI.ModelLike; copy_names = false) - @test MOI.supports_incremental_interface(src, true) #=copy_names=# + @test MOI.supports_incremental_interface(src) MOI.empty!(src) MOI.empty!(dest) MOI.set(src, MOI.Name(), "ModelName") @@ -907,7 +907,7 @@ Test whether the model returns ListOfVariableIndices and ListOfConstraintIndices sorted by creation time. """ function orderedindicestest(model::MOI.ModelLike) - @test MOI.supports_incremental_interface(model, false) #=copy_names=# + @test MOI.supports_incremental_interface(model) MOI.empty!(model) v1 = MOI.add_variable(model) @test MOI.get(model, MOI.ListOfVariableIndices()) == [v1] diff --git a/src/FileFormats/NL/NL.jl b/src/FileFormats/NL/NL.jl index 66b96469c2..efa6dc3f1a 100644 --- a/src/FileFormats/NL/NL.jl +++ b/src/FileFormats/NL/NL.jl @@ -240,11 +240,7 @@ struct _LinearNLPEvaluator <: MOI.AbstractNLPEvaluator end MOI.features_available(::_LinearNLPEvaluator) = [:ExprGraph] MOI.initialize(::_LinearNLPEvaluator, ::Vector{Symbol}) = nothing -function MOI.copy_to( - dest::Model, - model::MOI.ModelLike; - copy_names::Bool = false, -) +function MOI.copy_to(dest::Model, model::MOI.ModelLike) mapping = MOI.Utilities.IndexMap() # Initialize the NLP block. nlp_block = try diff --git a/src/MathOptInterface.jl b/src/MathOptInterface.jl index a6bdb56139..e3a8702748 100644 --- a/src/MathOptInterface.jl +++ b/src/MathOptInterface.jl @@ -95,40 +95,19 @@ Empty the model, that is, remove all variables, constraints and model attributes function empty! end """ - supports_incremental_interface(model::ModelLike, copy_names::Bool) + supports_incremental_interface(model::ModelLike) Return a `Bool` indicating whether `model` supports building incrementally via [`add_variable`](@ref) and [`add_constraint`](@ref). -`copy_names` is a `Bool` indicating whether the user wishes to set -[`VariableName`](@ref) and [`ConstraintName`](@ref) attributes. -If `model` supports the incremental interface but does not support name -attributes, define -```julia -supports_incremental_interface(::MyNewModel, copy_names::Bool) = !copy_names -``` - The main purpose of this function is to determine whether a model can be loaded into `model` incrementally or whether it should be cached and copied at once instead. - -This is used in two places to determine whether to add a cache: -1. A first cache can be used to store the model as entered by the user as well - as the names of variables and constraints. This cache is created if this - function returns `false` when `copy_names` is `true`. -2. If bridges are used, then a second cache can be used to store the bridged - model with unnamed variables and constraints. This cache is created if this - function returns `false` when `copy_names` is `false`. -``` """ -supports_incremental_interface(::ModelLike, ::Bool) = false +supports_incremental_interface(::ModelLike) = false """ - copy_to( - dest::ModelLike, - src::ModelLike; - copy_names::Bool = true, - )::IndexMap + copy_to(dest::ModelLike, src::ModelLike)::IndexMap Copy the model from `src` into `dest`. @@ -140,9 +119,6 @@ indices from the `src` model to the corresponding indices in the `dest` model. ## Notes - * If `copy_names == false`, the [`Name`](@ref), [`VariableName`](@ref) and - [`ConstraintName`](@ref) attributes are not copied, even if they are set in - `src`. * If a constraint that in `src` is not supported by `dest`, then an [`UnsupportedConstraint`](@ref) error is thrown. * If an [`AbstractModelAttribute`](@ref), [`AbstractVariableAttribute`](@ref), @@ -154,7 +130,7 @@ indices from the `src` model to the corresponding indices in the `dest` model. ## IndexMap Implementations of `copy_to` must return an [`IndexMap`](@ref). For technical -reasons, this type is defined in the Utilties submodule as +reasons, this type is defined in the Utilities submodule as `MOI.Utilities.IndexMap`. However, since it is an integral part of the MOI API, we provide `MOI.IndexMap` as an alias. @@ -173,13 +149,21 @@ is_valid(dest, x) # false (unless index_map[x] == x) is_valid(dest, index_map[x]) # true ``` """ -function copy_to end +function copy_to(dest, src; kwargs...) + if length(kwargs) > 0 + @warn( + "copy_to with keyword arguments is deprecated. Now names are " * + "copied by default", + maxlog = 1, + ) + end + return copy_to(dest, src) +end """ copy_to_and_optimize!( dest::AbstractOptimizer, - src::ModelLike; - kwargs... + src::ModelLike, )::IndexMap A single call equivalent to calling [`copy_to`](@ref) followed by @@ -193,9 +177,9 @@ An optimizer can decide to implement this function instead of implementing !!! warning This is an experimental new feature of MOI v0.10 that may break in MOI v1.0. """ -function copy_to_and_optimize!(dest, src; kwargs...) +function copy_to_and_optimize!(dest, src) # The arguments above are untyped to avoid ambiguities. - index_map = copy_to(dest, src; kwargs...) + index_map = copy_to(dest, src) optimize!(dest) return index_map end diff --git a/src/Test/test_conic.jl b/src/Test/test_conic.jl index 09a466dec6..4026aae22a 100644 --- a/src/Test/test_conic.jl +++ b/src/Test/test_conic.jl @@ -23,7 +23,7 @@ function _test_conic_linear_helper( ) atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -223,7 +223,7 @@ function _test_conic_linear_helper_2( ) atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -468,7 +468,7 @@ s.t. -1 + x ∈ R₊ ``` """ function test_conic_linear_INFEASIBLE(model::MOI.ModelLike, config::Config) - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -557,7 +557,7 @@ s.t. -1 + x ∈ R₊ ``` """ function test_conic_linear_INFEASIBLE_2(model::MOI.ModelLike, config::Config) - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -647,7 +647,7 @@ function _test_conic_NormInfinityCone_helper( # st x == 1 # y == 1/2 # x >= ||(y,z)||_∞ - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -855,7 +855,7 @@ function test_conic_NormInfinityCone_INFEASIBLE( model::MOI.ModelLike, config::Config, ) - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -967,7 +967,7 @@ let n = 3. optimal solution: y .= -1, x = 2 function test_conic_NormInfinityCone_3(model::MOI.ModelLike, config::Config) atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports(model, MOI.ObjectiveFunction{MOI.SingleVariable}()) @requires MOI.supports(model, MOI.ObjectiveSense()) @requires MOI.supports_constraint( @@ -1077,7 +1077,7 @@ function _test_conic_NormOneCone_helper( # st x == 1 # y == 1/2 # x >= ||(y,z)||_1 - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -1282,7 +1282,7 @@ s.t. -2 + y ∈ R₊ (x,y) ∈ NormOne₂ """ function test_conic_NormOneCone_INFEASIBLE(model::MOI.ModelLike, config::Config) - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -1399,7 +1399,7 @@ function test_conic_NormOneCone(model::MOI.ModelLike, config::Config) ) atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports(model, MOI.ObjectiveFunction{MOI.SingleVariable}()) @requires MOI.supports(model, MOI.ObjectiveSense()) @requires MOI.supports_constraint( @@ -1514,7 +1514,7 @@ function _test_conic_SecondOrderCone_helper( ) atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -1707,7 +1707,7 @@ function _test_conic_SecondOrderCone_helper_2( # s.t. -1/√2 + y ∈ R₊ # 1 - t ∈ {0} # (t,x,y) ∈ SOC₃ - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -1940,7 +1940,7 @@ function test_conic_SecondOrderCone_INFEASIBLE( ) atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -2068,7 +2068,7 @@ function test_conic_SecondOrderCone_out_of_order( ) atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -2190,7 +2190,7 @@ function _test_conic_RotatedSecondOrderCone_helper( ) atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -2385,7 +2385,7 @@ function test_conic_RotatedSecondOrderCone_INFEASIBLE( rtol = config.rtol b = [-2, -1, 1 / 2] c = [0.0, 0.0, 0.0] - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -2521,7 +2521,7 @@ function test_conic_RotatedSecondOrderCone_INFEASIBLE_2( ) atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -2740,7 +2740,7 @@ function test_conic_RotatedSecondOrderCone_out_of_order( ) atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -2841,7 +2841,7 @@ function _test_conic_GeometricMeanCone_helper( # (xyz)^(1/3) ≤ (x+y+z)/3 = 1 # Therefore xyz ≤ 1 # This can be attained using x = y = z = 1 so it is optimal. - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -2997,7 +2997,7 @@ function _test_conic_GeometricMeanCone_helper_2( ) atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -3162,7 +3162,7 @@ function _test_conic_GeometricMeanCone_helper_3( ) atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -3317,7 +3317,7 @@ function _test_conic_Exponential_helper( # st y e^(x/y) <= z, y > 0 (i.e (x, y, z) are in the exponential primal cone) # x == 1 # y == 2 - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -3487,7 +3487,7 @@ function test_conic_Exponential_hard_2(model::MOI.ModelLike, config::Config) ) atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -3687,7 +3687,7 @@ function test_conic_Exponential_hard(model::MOI.ModelLike, config::Config) ) atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -3808,7 +3808,7 @@ function _test_conic_DualExponentialCone_helper( # x_2 + v == 1 # w == 1 # (u, v, w) ∈ DualExponentialCone - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -4009,7 +4009,7 @@ function _test_conic_PowerCone_helper( atol = config.atol rtol = config.rtol a = 0.9 - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -4195,7 +4195,7 @@ function _test_conic_DualPowerCone_helper( @requires MOI.supports_constraint(model, F, MOI.DualPowerCone{Float64}) atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -4389,7 +4389,7 @@ function test_conic_RelativeEntropyCone( ) atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports(model, MOI.ObjectiveFunction{MOI.SingleVariable}()) @requires MOI.supports(model, MOI.ObjectiveSense()) @requires MOI.supports_constraint( @@ -4482,7 +4482,7 @@ function test_conic_NormSpectralCone( ) atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports(model, MOI.ObjectiveFunction{MOI.SingleVariable}()) @requires MOI.supports(model, MOI.ObjectiveSense()) @requires MOI.supports_constraint( @@ -4576,7 +4576,7 @@ function test_conic_NormSpectralCone_2( ) atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports(model, MOI.ObjectiveFunction{MOI.SingleVariable}()) @requires MOI.supports(model, MOI.ObjectiveSense()) @requires MOI.supports_constraint( @@ -4670,7 +4670,7 @@ function test_conic_NormNuclearCone( ) atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports(model, MOI.ObjectiveFunction{MOI.SingleVariable}()) @requires MOI.supports(model, MOI.ObjectiveSense()) @requires MOI.supports_constraint( @@ -4768,7 +4768,7 @@ function test_conic_NormNuclearCone_2( ) atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports(model, MOI.ObjectiveFunction{MOI.SingleVariable}()) @requires MOI.supports(model, MOI.ObjectiveSense()) @requires MOI.supports_constraint( @@ -4863,7 +4863,7 @@ function _test_conic_PositiveSemidefiniteCone_helper( atol = config.atol rtol = config.rtol square = psdcone == MOI.PositiveSemidefiniteConeSquare - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -5165,7 +5165,7 @@ function _test_conic_PositiveSemidefiniteCone_helper_2( # With (2) we get α = √(3 - 2obj - 4x2) / 2 β = k * α - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -5508,7 +5508,7 @@ function test_conic_PositiveSemidefiniteConeTriangle( atol = config.atol rtol = config.rtol # Caused getdual to fail on SCS and Mosek - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -5719,7 +5719,7 @@ function _test_conic_PositiveSemidefiniteCone_helper_3( ) where {T} atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports(model, MOI.ObjectiveFunction{MOI.SingleVariable}()) @requires MOI.supports(model, MOI.ObjectiveSense()) @requires MOI.supports_constraint( @@ -5904,7 +5904,7 @@ function _test_det_cone_helper_ellipsoid( square = detcone == MOI.LogDetConeSquare || detcone == MOI.RootDetConeSquare use_logdet = detcone == MOI.LogDetConeTriangle || detcone == MOI.LogDetConeSquare - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -6064,7 +6064,7 @@ function _test_det_cone_helper(model::MOI.ModelLike, config::Config, detcone) detcone == MOI.LogDetConeTriangle || detcone == MOI.LogDetConeSquare mat = Float64[3 2 1; 2 2 1; 1 1 3] matL = Float64[3, 2, 2, 1, 1, 3] - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports(model, MOI.ObjectiveFunction{MOI.SingleVariable}()) @requires MOI.supports(model, MOI.ObjectiveSense()) @requires MOI.supports_constraint( diff --git a/src/Test/test_linear.jl b/src/Test/test_linear.jl index d1f62edeab..c208a60ae9 100644 --- a/src/Test/test_linear.jl +++ b/src/Test/test_linear.jl @@ -11,7 +11,7 @@ function test_linear_integration( ) where {T} atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -552,7 +552,7 @@ function test_linear_integration_2( # Min -x # s.t. x + y <= 1 # x, y >= 0 - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -684,7 +684,7 @@ function test_linear_inactive_bounds( # min x # s.t. x >= 0 # x >= 3 - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -847,7 +847,7 @@ function test_linear_LessThan_and_GreaterThan( ) where {T} atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -967,7 +967,7 @@ function test_linear_integration_modification( # x >= 0, y >= 0 # # solution: x = 1.3333333, y = 1.3333333, objv = 2.66666666 - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -1130,7 +1130,7 @@ function test_linear_modify_GreaterThan_and_LessThan_constraints( ) where {T} atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -1271,7 +1271,7 @@ function test_linear_VectorAffineFunction( # s.t. - z == - 1 (c1) # w == 1 (c2) # i.e. z == w == 1 - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -1426,7 +1426,7 @@ function test_linear_INFEASIBLE( # min x # s.t. 2x+y <= -1 # x,y >= 0 - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -1533,7 +1533,7 @@ function test_linear_DUAL_INFEASIBLE( # min -x-y # s.t. -x+2y <= 0 # x,y >= 0 - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -1626,7 +1626,7 @@ function test_linear_DUAL_INFEASIBLE_2( # min -x-y # s.t. x-y == 0 # x,y >= 0 - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -1729,7 +1729,7 @@ function test_linear_add_constraints( # # solution: (59.0909, 36.3636) # objv: 71818.1818 - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -1855,7 +1855,7 @@ function test_linear_integration_Interval( # # s.t. 5 <= x + y <= 10 # x, y >= 0 - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -2099,7 +2099,7 @@ function test_linear_Interval_inactive( # # s.t. -1 <= x + y <= 10 # x, y >= 0 - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -2243,7 +2243,7 @@ function test_linear_transform( ) where {T} atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -2344,7 +2344,7 @@ function test_linear_INFEASIBLE_2( ) where {T} atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -2462,7 +2462,7 @@ function test_linear_FEASIBILITY_SENSE( ) where {T} atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports_constraint( model, MOI.ScalarAffineFunction{T}, @@ -2556,7 +2556,7 @@ function test_linear_integration_delete_variables( # s.t. 3x + 2y + z <= 2 # x, y, z >= 0 # z <= 1 - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -2749,7 +2749,7 @@ function test_linear_VectorAffineFunction_empty_row( ) where {T} atol = config.atol rtol = config.rtol - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), @@ -2896,7 +2896,7 @@ s.t. x + y + z <= 10 ``` """ function test_linear_integer_integration(model::MOI.ModelLike, config::Config) - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -3038,7 +3038,7 @@ end Test Special Ordered Sets of type 1. """ function test_linear_SOS1_integration(model::MOI.ModelLike, config::Config) - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -3145,7 +3145,7 @@ end Test Special Ordered Sets of type 2. """ function test_linear_SOS2_integration(model::MOI.ModelLike, config::Config) - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -3293,7 +3293,7 @@ s.t. 0 <= z - 0.5 eᵀ b / 40 <= 0.999 ``` """ function test_linear_integer_solve_twice(model::MOI.ModelLike, config::Config) - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -3385,7 +3385,7 @@ st 2a + 8b + 4c + 2d + 5e <= 10 ``` """ function test_linear_integer_knapsack(model::MOI.ModelLike, config::Config) - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -3921,7 +3921,7 @@ function _test_linear_SemiXXX_integration( config::Config{T}, use_semiinteger::Bool, ) where {T} - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), diff --git a/src/Test/test_model.jl b/src/Test/test_model.jl index 663fce5bc2..7c7f5175a8 100644 --- a/src/Test/test_model.jl +++ b/src/Test/test_model.jl @@ -280,7 +280,7 @@ function test_model_Name_VariableName_ConstraintName( model::MOI.ModelLike, config::Config, ) - @requires MOI.supports_incremental_interface(model, true) + @requires MOI.supports_incremental_interface(model) @requires MOI.supports(model, MOI.VariableName(), MOI.VariableIndex) @test MOI.get(model, MOI.NumberOfVariables()) == 0 @test MOI.get( @@ -512,7 +512,7 @@ Test various parts of `MOI.is_valid`. Taken from https://github.com/jump-dev/MathOptInterfaceUtilities.jl/issues/41 """ function test_model_is_valid(model::MOI.ModelLike, config::Config) - @requires MOI.supports_incremental_interface(model, false) + @requires MOI.supports_incremental_interface(model) v = MOI.add_variables(model, 2) @test MOI.is_valid(model, v[1]) @test MOI.is_valid(model, v[2]) @@ -697,7 +697,7 @@ Test whether the model returns ListOfVariableIndices and ListOfConstraintIndices sorted by creation time. """ function test_model_ordered_indices(model::MOI.ModelLike, ::Config) - @requires MOI.supports_incremental_interface(model, false) + @requires MOI.supports_incremental_interface(model) v1 = MOI.add_variable(model) @test MOI.get(model, MOI.ListOfVariableIndices()) == [v1] v2 = MOI.add_variable(model) diff --git a/src/Test/test_quadratic.jl b/src/Test/test_quadratic.jl index c3f063af3a..9712b0672d 100644 --- a/src/Test/test_quadratic.jl +++ b/src/Test/test_quadratic.jl @@ -10,7 +10,7 @@ st x + 2y + 3z >= 4 (c1) ``` """ function test_quadratic_integration(model::MOI.ModelLike, config::Config) - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarQuadraticFunction{Float64}}(), @@ -136,7 +136,7 @@ st x + 2y + 3z >= 4 (c1) ``` """ function test_quadratic_duplicate_terms(model::MOI.ModelLike, config::Config) - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarQuadraticFunction{Float64}}(), @@ -316,7 +316,7 @@ minimize 2 x^2 + y^2 + xy + x + y + 1 ``` """ function test_quadratic_nonhomogeneous(model::MOI.ModelLike, config::Config) - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarQuadraticFunction{Float64}}(), @@ -472,7 +472,7 @@ function test_quadratic_constraint_integration( model::MOI.ModelLike, config::Config, ) - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -617,7 +617,7 @@ s.t. x^2 <= 2 (c) ``` """ function test_quadratic_constraint_basic(model::MOI.ModelLike, config::Config) - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -710,7 +710,7 @@ function test_quadratic_constraint_minimize( model::MOI.ModelLike, config::Config, ) - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -800,7 +800,7 @@ function _test_quadratic_constraint_helper( config::Config, less_than::Bool, ) - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -939,7 +939,7 @@ function test_quadratic_nonconvex_constraint_integration( model::MOI.ModelLike, config::Config, ) - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -1030,7 +1030,7 @@ function test_quadratic_nonconvex_constraint_basic( model::MOI.ModelLike, config::Config, ) - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports_constraint( model, MOI.ScalarQuadraticFunction{Float64}, @@ -1117,7 +1117,7 @@ function test_quadratic_SecondOrderCone_basic( model::MOI.ModelLike, config::Config, ) - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), @@ -1268,7 +1268,7 @@ function test_quadratic_Integer_SecondOrderCone( model::MOI.ModelLike, config::Config, ) - @requires MOI.supports_incremental_interface(model, false) #=copy_names=# + @requires MOI.supports_incremental_interface(model) @requires MOI.supports( model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), diff --git a/src/Utilities/cachingoptimizer.jl b/src/Utilities/cachingoptimizer.jl index ff5d3417b3..ec101f3b2b 100644 --- a/src/Utilities/cachingoptimizer.jl +++ b/src/Utilities/cachingoptimizer.jl @@ -196,11 +196,8 @@ function _attach_optimizer( @assert model.state == EMPTY_OPTIMIZER # We do not need to copy names because name-related operations are handled # by `m.model_cache` - indexmap = copy_to( - model.optimizer, - model.model_cache; - copy_names = false, - )::MOI.Utilities.IndexMap + indexmap = + copy_to(model.optimizer, model.model_cache)::MOI.Utilities.IndexMap model.state = ATTACHED_OPTIMIZER # MOI does not define the type of index_map, so we have to convert it # into an actual IndexMap. Also load the reverse IndexMap. @@ -274,11 +271,8 @@ function MOI.copy_to(m::CachingOptimizer, src::MOI.ModelLike; kws...) return MOI.copy_to(m.model_cache, src; kws...) end -function MOI.supports_incremental_interface( - model::CachingOptimizer, - copy_names::Bool, -) - return MOI.supports_incremental_interface(model.model_cache, copy_names) +function MOI.supports_incremental_interface(model::CachingOptimizer) + return MOI.supports_incremental_interface(model.model_cache) end function MOI.empty!(m::CachingOptimizer) @@ -893,9 +887,6 @@ end ##### Names ##### -# Names are not copied, i.e. we use the option `copy_names=false` in -# `attachoptimizer`, so the caching optimizer can support names even if the -# optimizer does not. function MOI.supports( model::CachingOptimizer, attr::Union{MOI.VariableName,MOI.ConstraintName}, diff --git a/src/Utilities/copy.jl b/src/Utilities/copy.jl index d374dcb1b1..8b2cbbee4b 100644 --- a/src/Utilities/copy.jl +++ b/src/Utilities/copy.jl @@ -10,22 +10,18 @@ include("copy/index_map.jl") pass_attributes( dest::MOI.ModelLike, src::MOI.ModelLike, - copy_names::Bool, index_map::IndexMap, ) Pass the model attributes from the model `src` to the model `dest`. - -Does not copy `Name` if `copy_names` is `false`. """ function pass_attributes( dest::MOI.ModelLike, src::MOI.ModelLike, - copy_names::Bool, index_map::IndexMap, ) for attr in MOI.get(src, MOI.ListOfModelAttributesSet()) - _pass_attribute(dest, src, copy_names, index_map, attr) + _pass_attribute(dest, src, index_map, attr) end return end @@ -33,14 +29,12 @@ end function _pass_attribute( dest::MOI.ModelLike, src::MOI.ModelLike, - copy_names::Bool, index_map::IndexMap, attr::MOI.AbstractModelAttribute, ) - if attr == MOI.Name() && !copy_names - return + if attr == MOI.Name() && !MOI.supports(dest, attr) + return # Skipping names is okay. end - @assert MOI.is_copyable(attr) value = MOI.get(src, attr) if value !== nothing MOI.set(dest, attr, map_indices(index_map, value)) @@ -52,37 +46,20 @@ end pass_attributes( dest::MOI.ModelLike, src::MOI.ModelLike, - copy_names::Bool, index_map::IndexMap, vis_src::Vector{MOI.VariableIndex}, ) Pass the variable attributes from the model `src` to the model `dest`. - -Does not copy `VariableName` if `copy_names` is `false`. """ function pass_attributes( dest::MOI.ModelLike, src::MOI.ModelLike, - copy_names::Bool, index_map::IndexMap, vis_src::Vector{MOI.VariableIndex}, ) for attr in MOI.get(src, MOI.ListOfVariableAttributesSet()) - if attr == MOI.VariableName() && !copy_names - continue - elseif attr == MOI.VariablePrimalStart() - # As starting values are simply *hints* for the optimization, not - # supporting them gives a warning, not an error - if !MOI.supports(dest, attr, MOI.VariableIndex) - @warn( - "$attr is not supported by $(typeof(dest)). This " * - "information will be discarded." - ) - continue - end - end - _pass_attribute(dest, src, copy_names, index_map, vis_src, attr) + _pass_attribute(dest, src, index_map, vis_src, attr) end return end @@ -90,11 +67,14 @@ end function _pass_attribute( dest::MOI.ModelLike, src::MOI.ModelLike, - copy_names::Bool, index_map::IndexMap, vis_src::Vector{MOI.VariableIndex}, attr::MOI.AbstractVariableAttribute, ) + if (attr == MOI.VariableName() || attr == MOI.VariablePrimalStart()) && + !MOI.supports(dest, attr, MOI.VariableIndex) + return # Skipping names and start values is okay. + end for x in vis_src value = MOI.get(src, attr, x) if value !== nothing @@ -108,20 +88,16 @@ end pass_attributes( dest::MOI.ModelLike, src::MOI.ModelLike, - copy_names::Bool, index_map::IndexMap, cis_src::Vector{MOI.ConstraintIndex{F,S}}, ) where {F,S} Pass the constraint attributes of `F`-in-`S` constraints from the model `src` to the model `dest`. - -Does not copy `ConstraintName` if `copy_names` is `false`. """ function pass_attributes( dest::MOI.ModelLike, src::MOI.ModelLike, - copy_names::Bool, index_map::IndexMap, cis_src::Vector{MOI.ConstraintIndex{F,S}}, filter_constraints::Union{Nothing,Function} = nothing, @@ -130,21 +106,7 @@ function pass_attributes( filter!(filter_constraints, cis_src) end for attr in MOI.get(src, MOI.ListOfConstraintAttributesSet{F,S}()) - if attr == MOI.ConstraintName() && !copy_names - continue - elseif attr == MOI.ConstraintPrimalStart() || - attr == MOI.ConstraintDualStart() - # As starting values are simply *hints* for the optimization, not - # supporting them gives a warning, not an error - if !MOI.supports(dest, attr, MOI.ConstraintIndex{F,S}) - @warn( - "$attr is not supported by $(typeof(dest)). This " * - "information will be discarded." - ) - continue - end - end - _pass_attribute(dest, src, copy_names, index_map, cis_src, attr) + _pass_attribute(dest, src, index_map, cis_src, attr) end return end @@ -152,11 +114,18 @@ end function _pass_attribute( dest::MOI.ModelLike, src::MOI.ModelLike, - copy_names::Bool, index_map::IndexMap, cis_src::Vector{MOI.ConstraintIndex{F,S}}, attr::MOI.AbstractConstraintAttribute, ) where {F,S} + !MOI.supports(dest, attr, MOI.ConstraintIndex{F,S}) + if ( + attr == MOI.ConstraintName() || + attr == MOI.ConstraintPrimalStart() || + attr == MOI.ConstraintDualStart() + ) && !MOI.supports(dest, attr, MOI.ConstraintIndex{F,S}) + return # Skipping names and start values is okay + end for ci in cis_src value = MOI.get(src, attr, ci) if value !== nothing @@ -332,7 +301,6 @@ end function _pass_constraints( dest::MOI.ModelLike, src::MOI.ModelLike, - copy_names::Bool, index_map::IndexMap, variable_constraints_not_added::Vector, filter_constraints::Union{Nothing,Function} = nothing, @@ -355,7 +323,6 @@ function _pass_constraints( pass_attributes( dest, src, - copy_names, index_map, MOI.get(src, MOI.ListOfConstraintIndices{F,S}()), filter_constraints, @@ -433,7 +400,7 @@ function final_touch(::MOI.ModelLike, index_map) end function default_copy_to( dest::MOI.ModelLike, src::MOI.ModelLike, - copy_names::Bool, + ::Bool, filter_constraints::Union{Nothing,Function} = nothing, ) @warn( @@ -441,19 +408,13 @@ function default_copy_to( "`default_copy_to` are now keyword arguments.", maxlog = 1, ) - return default_copy_to( - dest, - src; - copy_names = copy_names, - filter_constraints = filter_constraints, - ) + return default_copy_to(dest, src; filter_constraints = filter_constraints) end """ default_copy_to( dest::MOI.ModelLike, src::MOI.ModelLike; - copy_names::Bool = true, filter_constraints::Union{Nothing,Function} = nothing, ) @@ -468,15 +429,10 @@ If `filter_constraints` is a `Function`, only constraints for which function default_copy_to( dest::MOI.ModelLike, src::MOI.ModelLike; - copy_names::Bool = true, filter_constraints::Union{Nothing,Function} = nothing, ) - if !MOI.supports_incremental_interface(dest, copy_names) - error( - "Model $(typeof(dest)) does not support copy", - copy_names ? " with names" : "", - ".", - ) + if !MOI.supports_incremental_interface(dest) + error("Model $(typeof(dest)) does not support copy_to.") end MOI.empty!(dest) vis_src = MOI.get(src, MOI.ListOfVariableIndices()) @@ -499,14 +455,13 @@ function default_copy_to( end _copy_free_variables(dest, index_map, vis_src) # Copy variable attributes - pass_attributes(dest, src, copy_names, index_map, vis_src) + pass_attributes(dest, src, index_map, vis_src) # Copy model attributes - pass_attributes(dest, src, copy_names, index_map) + pass_attributes(dest, src, index_map) # Copy constraints _pass_constraints( dest, src, - copy_names, index_map, constraints_not_added, filter_constraints, diff --git a/src/Utilities/mockoptimizer.jl b/src/Utilities/mockoptimizer.jl index b0fb34a730..19c978b5c8 100644 --- a/src/Utilities/mockoptimizer.jl +++ b/src/Utilities/mockoptimizer.jl @@ -924,11 +924,8 @@ function MOI.copy_to(dest::MockOptimizer, src::MOI.ModelLike; kwargs...) return default_copy_to(dest, src; kwargs...) end -function MOI.supports_incremental_interface( - mock::MockOptimizer, - copy_names::Bool, -) - return MOI.supports_incremental_interface(mock.inner_model, copy_names) +function MOI.supports_incremental_interface(mock::MockOptimizer) + return MOI.supports_incremental_interface(mock.inner_model) end function final_touch(uf::MockOptimizer, index_map) diff --git a/src/Utilities/model.jl b/src/Utilities/model.jl index c3af5d246e..717b38e933 100644 --- a/src/Utilities/model.jl +++ b/src/Utilities/model.jl @@ -542,11 +542,11 @@ function pass_nonvariable_constraints( ) end -function MOI.copy_to(dest::AbstractModel, src::MOI.ModelLike; kwargs...) - return default_copy_to(dest, src; kwargs...) +function MOI.copy_to(dest::AbstractModel, src::MOI.ModelLike) + return default_copy_to(dest, src) end -MOI.supports_incremental_interface(::AbstractModel, ::Bool) = true +MOI.supports_incremental_interface(::AbstractModel) = true function final_touch(model::AbstractModel, index_map) return final_touch(model.constraints, index_map) end diff --git a/src/Utilities/universalfallback.jl b/src/Utilities/universalfallback.jl index 557695c921..fe7753bc88 100644 --- a/src/Utilities/universalfallback.jl +++ b/src/Utilities/universalfallback.jl @@ -129,11 +129,8 @@ function MOI.copy_to(dest::UniversalFallback, src::MOI.ModelLike; kwargs...) return MOIU.default_copy_to(dest, src; kwargs...) end -function MOI.supports_incremental_interface( - uf::UniversalFallback, - copy_names::Bool, -) - return MOI.supports_incremental_interface(uf.model, copy_names) +function MOI.supports_incremental_interface(uf::UniversalFallback) + return MOI.supports_incremental_interface(uf.model) end function final_touch(uf::UniversalFallback, index_map) diff --git a/src/instantiate.jl b/src/instantiate.jl index 3380455d8a..144ade0e30 100644 --- a/src/instantiate.jl +++ b/src/instantiate.jl @@ -96,7 +96,6 @@ end instantiate( optimizer_constructor, with_bridge_type::Union{Nothing, Type} = nothing, - with_names::Bool = false, ) Creates an instance of optimizer by either: @@ -109,21 +108,19 @@ If `with_bridge_type` is not `nothing`, it enables all the bridges defined in the MathOptInterface.Bridges submodule with coefficient type `with_bridge_type`. If the optimizer created by `optimizer_constructor` does not support loading the -problem incrementally (see [`supports_incremental_interface`](@ref)), or does -not support names and `with_names` is `true`, then a +problem incrementally (see [`supports_incremental_interface`](@ref)), then a [`Utilities.CachingOptimizer`](@ref) is added to store a cache of the bridged -model. Hence set `with_names` to `true` if names might be set. +model. """ function instantiate( optimizer_constructor; with_bridge_type::Union{Nothing,Type} = nothing, - with_names::Bool = false, ) optimizer = _instantiate_and_check(optimizer_constructor) if with_bridge_type === nothing return optimizer end - if !supports_incremental_interface(optimizer, with_names) + if !supports_incremental_interface(optimizer) universal_fallback = Utilities.UniversalFallback(Utilities.Model{with_bridge_type}()) optimizer = Utilities.CachingOptimizer(universal_fallback, optimizer) diff --git a/test/Utilities/cachingoptimizer.jl b/test/Utilities/cachingoptimizer.jl index 5ebc304f8d..f4d951f68b 100644 --- a/test/Utilities/cachingoptimizer.jl +++ b/test/Utilities/cachingoptimizer.jl @@ -82,7 +82,7 @@ function MOI.add_constrained_variables( return MOI.add_constrained_variables(model.inner, set) end -MOI.supports_incremental_interface(::NoFreeVariables, names::Bool) = !names +MOI.supports_incremental_interface(::NoFreeVariables) = true function MOI.copy_to(dest::NoFreeVariables, src::MOI.ModelLike; kwargs...) return MOI.Utilities.default_copy_to(dest, src; kwargs...) diff --git a/test/Utilities/copy.jl b/test/Utilities/copy.jl index bfda8e50c5..d0c46ccf51 100644 --- a/test/Utilities/copy.jl +++ b/test/Utilities/copy.jl @@ -27,12 +27,8 @@ abstract type AbstractDummyModel <: MOI.ModelLike end function MOI.empty!(::AbstractDummyModel) end -function MOI.copy_to( - dest::AbstractDummyModel, - src::MOI.ModelLike; - copy_names::Bool = true, -) - return MOIU.default_copy_to(dest, src; copy_names = copy_names) +function MOI.copy_to(dest::AbstractDummyModel, src::MOI.ModelLike) + return MOIU.default_copy_to(dest, src) end MOI.supports(::AbstractDummyModel, ::MOI.ObjectiveSense) = true @@ -151,7 +147,7 @@ function test_issue_849() ) MOI.set(model, MOI.NLPBlock(), nlp_data) copy = MOIU.UniversalFallback(MOIU.Model{Float64}()) - index_map = MOIU.default_copy_to(copy, model; copy_names = true) + index_map = MOIU.default_copy_to(copy, model) for vi in [a, b, c, x, y[1]] @test index_map[vi] == vi end @@ -176,12 +172,7 @@ end MOI.empty!(model::ConstrainedVariablesModel) = empty!(model.added_constrained) -function MOI.supports_incremental_interface( - model::ConstrainedVariablesModel, - ::Bool, -) - return true -end +MOI.supports_incremental_interface(::ConstrainedVariablesModel) = true function MOI.copy_to( dest::ConstrainedVariablesModel, @@ -286,12 +277,7 @@ function MOI.copy_to( return MOIU.default_copy_to(dest, src; kwargs...) end -function MOI.supports_incremental_interface( - ::AbstractConstrainedVariablesModel, - ::Bool, -) - return true -end +MOI.supports_incremental_interface(::AbstractConstrainedVariablesModel) = true function MOI.empty!(model::AbstractConstrainedVariablesModel) model.constraintIndices = MOI.ConstraintIndex[] @@ -661,7 +647,7 @@ function MOI.supports_constraint( return true end -MOI.supports_incremental_interface(::BoundModel, ::Bool) = true +MOI.supports_incremental_interface(::BoundModel) = true function MOI.copy_to(dest::BoundModel, src::MOI.ModelLike; kwargs...) return MOIU.default_copy_to(dest, src; kwargs...) diff --git a/test/deprecate.jl b/test/deprecate.jl index 47d2b9877f..fc70cfd9dd 100644 --- a/test/deprecate.jl +++ b/test/deprecate.jl @@ -77,6 +77,13 @@ function test_default_copy_to() return end +function test_copy_to_copy_names() + dest = MOI.Utilities.Model{Float64}() + src = MOI.Utilities.Model{Float64}() + @test_logs (:warn,) MOI.copy_to(dest, src; copy_names = true) + return +end + function runtests() for name in names(@__MODULE__; all = true) if startswith("$name", "test_") diff --git a/test/dummy.jl b/test/dummy.jl index b6a8fa18c6..a95bf07489 100644 --- a/test/dummy.jl +++ b/test/dummy.jl @@ -6,15 +6,11 @@ abstract type AbstractDummyModel <: MOI.ModelLike end function MOI.empty!(::AbstractDummyModel) end -function MOI.copy_to( - dest::AbstractDummyModel, - src::MOI.ModelLike; - copy_names::Bool = true, -) - return MOIU.default_copy_to(dest, src, copy_names) +function MOI.copy_to(dest::AbstractDummyModel, src::MOI.ModelLike) + return MOIU.default_copy_to(dest, src) end -MOI.supports_incremental_interface(::AbstractDummyModel, ::Bool) = true +MOI.supports_incremental_interface(::AbstractDummyModel) = true MOI.supports(::AbstractDummyModel, ::MOI.ObjectiveSense) = true diff --git a/test/instantiate.jl b/test/instantiate.jl index bd1b029de9..bf03f1eaf9 100644 --- a/test/instantiate.jl +++ b/test/instantiate.jl @@ -20,38 +20,26 @@ function _test_instantiate(T) MOI.Utilities.UniversalFallback{MOI.Utilities.Model{T}}, } @test MOI.get(optimizer, MOI.Silent()) - for with_names in [true, false] - optimizer = MOI.instantiate( - optimizer_constructor, - with_bridge_type = T, - with_names = with_names, - ) - @test optimizer isa MOI.Bridges.LazyBridgeOptimizer{ - MOI.Utilities.MockOptimizer{ - MOI.Utilities.UniversalFallback{MOI.Utilities.Model{T}}, - }, - } - @test MOI.get(optimizer, MOI.Silent()) - @test MOI.get(optimizer, MOI.RawOptimizerAttribute("a")) == 1 - @test MOI.get(optimizer, MOI.RawOptimizerAttribute("b")) == 2 - end + optimizer = MOI.instantiate(optimizer_constructor, with_bridge_type = T) + @test optimizer isa MOI.Bridges.LazyBridgeOptimizer{ + MOI.Utilities.MockOptimizer{ + MOI.Utilities.UniversalFallback{MOI.Utilities.Model{T}}, + }, + } + @test MOI.get(optimizer, MOI.Silent()) + @test MOI.get(optimizer, MOI.RawOptimizerAttribute("a")) == 1 + @test MOI.get(optimizer, MOI.RawOptimizerAttribute("b")) == 2 optimizer_constructor = MOI.OptimizerWithAttributes(DummyOptimizer, []) optimizer = MOI.instantiate(optimizer_constructor) @test optimizer isa DummyOptimizer - for with_names in [true, false] - optimizer = MOI.instantiate( - optimizer_constructor, - with_bridge_type = T, - with_names = with_names, - ) - @test optimizer isa MOI.Bridges.LazyBridgeOptimizer{ - MOI.Utilities.CachingOptimizer{ - DummyOptimizer, - MOI.Utilities.UniversalFallback{MOI.Utilities.Model{T}}, - }, - } - end + optimizer = MOI.instantiate(optimizer_constructor, with_bridge_type = T) + @test optimizer isa MOI.Bridges.LazyBridgeOptimizer{ + MOI.Utilities.CachingOptimizer{ + DummyOptimizer, + MOI.Utilities.UniversalFallback{MOI.Utilities.Model{T}}, + }, + } err = ErrorException( "The provided `optimizer_constructor` returned a non-empty optimizer.",