From 43b824fa2dc680c8e613968c70f6b13dedff616b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Tue, 21 Jan 2025 19:58:52 +0100 Subject: [PATCH 1/9] Implement constrained variables --- src/MOI_wrapper.jl | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/MOI_wrapper.jl b/src/MOI_wrapper.jl index 6d9e520c..29b85f32 100644 --- a/src/MOI_wrapper.jl +++ b/src/MOI_wrapper.jl @@ -247,14 +247,18 @@ function MOI.get(model::Optimizer, tp::Type{MOI.VariableIndex}, attr::String) return MOI.get(model.optimizer, tp, attr) end -function MOI.add_variable(model::Optimizer) +function _add_variable(model::Optimizer, inner_vi) _next_variable_index!(model) return MOI.Utilities.CleverDicts.add_item( model.variables, - MOI.add_variable(model.optimizer), + inner_vi, ) end +function MOI.add_variable(model::Optimizer) + return _add_variable(model, MOI.add_variable(model.optimizer)) +end + function MOI.supports_add_constrained_variable( ::Optimizer{T}, ::Type{MOI.Parameter{T}}, @@ -279,6 +283,20 @@ function _assert_parameter_is_finite(set::MOI.Parameter{T}) where {T} end end +function MOI.supports_add_constrained_variable( + model::Optimizer, + ::Type{S}, +) where {S<:MOI.AbstractScalarSet} + return MOI.supports_add_constrained_variable(model.optimizer, S) +end + +function MOI.supports_add_constrained_variables( + model::Optimizer, + ::Type{S}, +) where {S<:MOI.AbstractVectorSet} + return MOI.supports_add_constrained_variables(model.optimizer, S) +end + function MOI.add_constrained_variable( model::Optimizer{T}, set::MOI.Parameter{T}, @@ -296,6 +314,22 @@ function MOI.add_constrained_variable( return p, cp end +function MOI.add_constrained_variable( + model::Optimizer, + set::MOI.AbstractScalarSet, +) + inner_vi, inner_ci = MOI.add_constrained_variable(model.optimizer, set) + return _add_variable(model, inner_vi), inner_ci # FIXME map inner_ci +end + +function MOI.add_constrained_variables( + model::Optimizer, + set::MOI.AbstractVectorSet, +) + inner_vis, inner_ci = MOI.add_constrained_variables(model.optimizer, set) + return _add_variable.(Ref(model), inner_vis), inner_ci # FIXME map inner_ci +end + function _add_to_constraint_map!(model::Optimizer, ci) model.constraint_outer_to_inner[ci] = ci return From 133099d1e910d8df3cb7e066d16a13f9ff5b2ec1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Tue, 21 Jan 2025 22:07:07 +0100 Subject: [PATCH 2/9] Fix format --- src/MOI_wrapper.jl | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/MOI_wrapper.jl b/src/MOI_wrapper.jl index 29b85f32..ff0f8024 100644 --- a/src/MOI_wrapper.jl +++ b/src/MOI_wrapper.jl @@ -249,10 +249,7 @@ end function _add_variable(model::Optimizer, inner_vi) _next_variable_index!(model) - return MOI.Utilities.CleverDicts.add_item( - model.variables, - inner_vi, - ) + return MOI.Utilities.CleverDicts.add_item(model.variables, inner_vi) end function MOI.add_variable(model::Optimizer) From 9b9f035b434794b2ad3d4174b529ed28e3f8b6ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Wed, 22 Jan 2025 14:31:14 +0100 Subject: [PATCH 3/9] Add tests --- src/ParametricOptInterface.jl | 7 +++-- test/moi_tests.jl | 58 +++++++++++++++++++++++++++++++++++ test/no_free_model.jl | 40 ++++++++++++++++++++++++ 3 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 test/no_free_model.jl diff --git a/src/ParametricOptInterface.jl b/src/ParametricOptInterface.jl index c1ba6942..1e092ecf 100644 --- a/src/ParametricOptInterface.jl +++ b/src/ParametricOptInterface.jl @@ -180,12 +180,11 @@ mutable struct Optimizer{T,OT<:MOI.ModelLike} <: MOI.AbstractOptimizer # extension data ext::Dict{Symbol,Any} - function Optimizer( + function Optimizer{T}( optimizer::OT; evaluate_duals::Bool = true, save_original_objective_and_constraints::Bool = true, - ) where {OT} - T = Float64 + ) where {T,OT} return new{T,OT}( optimizer, MOI.Utilities.CleverDicts.CleverDict{ParameterIndex,T}( @@ -248,6 +247,8 @@ mutable struct Optimizer{T,OT<:MOI.ModelLike} <: MOI.AbstractOptimizer end end +Optimizer(args...; kws...) = Optimizer{Float64}(args..., kws...) + function _next_variable_index!(model::Optimizer) return model.last_variable_index_added += 1 end diff --git a/test/moi_tests.jl b/test/moi_tests.jl index 524f9914..4da3b2fb 100644 --- a/test/moi_tests.jl +++ b/test/moi_tests.jl @@ -2023,6 +2023,7 @@ function test_no_quadratic_terms() @test c isa MOI.ConstraintIndex{typeof(func),typeof(set)} @test MOI.get(optimizer, MOI.ConstraintFunction(), c) ≈ func @test MOI.get(optimizer, MOI.ConstraintSet(), c) == set + @test MOI.supports(optimizer, MOI.ConstraintName(), typeof(c)) MOI.set(optimizer, MOI.ConstraintName(), c, "name") @test MOI.get(optimizer, MOI.ConstraintName(), c) == "name" MOI.set(optimizer, MOI.ObjectiveSense(), MOI.MAX_SENSE) @@ -2142,3 +2143,60 @@ function test_copy_model() MOI.optimize!(poi) @test MOI.get(poi, MOI.VariablePrimal(), x) ≈ 1.0 end + +function test_constrained_variable() + optimizer = POI.Optimizer(GLPK.Optimizer()) + MOI.set(optimizer, MOI.Silent(), true) + set = MOI.LessThan(1.0) + @test MOI.supports_add_constrained_variable(optmizer, typeof(set)) + x, c = MOI.add_constrained_variable(optimizer, set) + @test c isa MOI.ConstraintIndex{typeof(x),typeof(set)} + @test MOI.get(optimizer, MOI.ConstraintFunction(), c) ≈ x + @test MOI.get(optimizer, MOI.ConstraintSet(), c) == set + @test MOI.supports(optimizer, MOI.VariableName(), typeof(x)) + MOI.set(optimizer, MOI.VariableName(), x, "vname") + @test MOI.get(optimizer, MOI.VariableName(), x) == "vname" + MOI.set(optimizer, MOI.ObjectiveSense(), MOI.MAX_SENSE) + obj_func = 1.0 * x + MOI.set(optimizer, MOI.ObjectiveFunction{typeof(obj_func)}(), obj_func) + MOI.optimize!(optimizer) + @test MOI.get(optimizer, MOI.ConstraintDual(), c) ≈ -1 atol = ATOL + @test MOI.get(optimizer, MOI.VariablePrimal(), x) ≈ 1 atol = ATOL + return +end + +include("no_free_model.jl") + +function test_constrained_variable() + optimizer = POI.Optimizer(NoFreeVariablesModel{Float64}()) + set = MOI.LessThan(1.0) + @test MOI.supports_add_constrained_variable(optimizer, typeof(set)) + x, c = MOI.add_constrained_variable(optimizer, set) + @test c isa MOI.ConstraintIndex{typeof(x),typeof(set)} + @test MOI.get(optimizer, MOI.ConstraintFunction(), c) ≈ x + @test MOI.get(optimizer, MOI.ConstraintSet(), c) == set + @test MOI.supports(optimizer, MOI.VariableName(), typeof(x)) + MOI.set(optimizer, MOI.VariableName(), x, "vname") + @test MOI.get(optimizer, MOI.VariableName(), x) == "vname" + MOI.set(optimizer, MOI.ObjectiveSense(), MOI.MAX_SENSE) + obj_func = 1.0 * x + MOI.set(optimizer, MOI.ObjectiveFunction{typeof(obj_func)}(), obj_func) + return +end + +function test_constrained_variables() + optimizer = POI.Optimizer{Int}(NoFreeVariablesModel{Int}()) + set = MOI.Nonnegatives(2) + @test MOI.supports_add_constrained_variables(optimizer, typeof(set)) + x, c = MOI.add_constrained_variables(optimizer, set) + @test c isa MOI.ConstraintIndex{MOI.VectorOfVariables,typeof(set)} + @test MOI.get(optimizer, MOI.ConstraintFunction(), c) ≈ MOI.VectorOfVariables(x) + @test MOI.get(optimizer, MOI.ConstraintSet(), c) == set + @test MOI.supports(optimizer, MOI.VariableName(), eltype(x)) + MOI.set(optimizer, MOI.VariableName(), x[1], "vname") + @test MOI.get(optimizer, MOI.VariableName(), x[1]) == "vname" + MOI.set(optimizer, MOI.ObjectiveSense(), MOI.MIN_SENSE) + obj_func = 1 * x[1] + 1 * x[2] + MOI.set(optimizer, MOI.ObjectiveFunction{typeof(obj_func)}(), obj_func) + return +end diff --git a/test/no_free_model.jl b/test/no_free_model.jl new file mode 100644 index 00000000..c172a222 --- /dev/null +++ b/test/no_free_model.jl @@ -0,0 +1,40 @@ +MOI.Utilities.@model( + NoFreeVariablesModel, + (), + (), + (MOI.Nonnegatives,), + (), + (), + (), + (MOI.VectorOfVariables,), + (), +) + +function MOI.supports_constraint( + ::NoFreeVariablesModel, + ::Type{MOI.VectorOfVariables}, + ::Type{MOI.Reals}, +) + return false +end + +function MOI.supports_add_constrained_variable( + ::NoFreeVariablesModel{T}, + ::Type{MOI.LessThan{T}}, +) where {T} + return true +end + +function MOI.supports_add_constrained_variables( + ::NoFreeVariablesModel, + ::Type{MOI.Nonnegatives}, +) + return true +end + +function MOI.supports_add_constrained_variables( + ::NoFreeVariablesModel, + ::Type{MOI.Reals}, +) + return false +end From d9816ab1ebf80bc264f02426d474aa58b8c14b5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Wed, 22 Jan 2025 14:31:50 +0100 Subject: [PATCH 4/9] Fix format --- test/moi_tests.jl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/moi_tests.jl b/test/moi_tests.jl index 4da3b2fb..4545cc98 100644 --- a/test/moi_tests.jl +++ b/test/moi_tests.jl @@ -2190,7 +2190,8 @@ function test_constrained_variables() @test MOI.supports_add_constrained_variables(optimizer, typeof(set)) x, c = MOI.add_constrained_variables(optimizer, set) @test c isa MOI.ConstraintIndex{MOI.VectorOfVariables,typeof(set)} - @test MOI.get(optimizer, MOI.ConstraintFunction(), c) ≈ MOI.VectorOfVariables(x) + @test MOI.get(optimizer, MOI.ConstraintFunction(), c) ≈ + MOI.VectorOfVariables(x) @test MOI.get(optimizer, MOI.ConstraintSet(), c) == set @test MOI.supports(optimizer, MOI.VariableName(), eltype(x)) MOI.set(optimizer, MOI.VariableName(), x[1], "vname") From f8f3cd290822846d25767f3e60b625169fdae7b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Wed, 22 Jan 2025 19:35:38 +0100 Subject: [PATCH 5/9] Fix --- src/ParametricOptInterface.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ParametricOptInterface.jl b/src/ParametricOptInterface.jl index 1e092ecf..32710300 100644 --- a/src/ParametricOptInterface.jl +++ b/src/ParametricOptInterface.jl @@ -247,7 +247,7 @@ mutable struct Optimizer{T,OT<:MOI.ModelLike} <: MOI.AbstractOptimizer end end -Optimizer(args...; kws...) = Optimizer{Float64}(args..., kws...) +Optimizer(args...; kws...) = Optimizer{Float64}(args...; kws...) function _next_variable_index!(model::Optimizer) return model.last_variable_index_added += 1 From 4cfd2682ad9ea394f93dc71d39f0095d4b4b6df5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Wed, 22 Jan 2025 19:52:51 +0100 Subject: [PATCH 6/9] Fix --- test/moi_tests.jl | 1 - 1 file changed, 1 deletion(-) diff --git a/test/moi_tests.jl b/test/moi_tests.jl index 4545cc98..4a912cd4 100644 --- a/test/moi_tests.jl +++ b/test/moi_tests.jl @@ -2023,7 +2023,6 @@ function test_no_quadratic_terms() @test c isa MOI.ConstraintIndex{typeof(func),typeof(set)} @test MOI.get(optimizer, MOI.ConstraintFunction(), c) ≈ func @test MOI.get(optimizer, MOI.ConstraintSet(), c) == set - @test MOI.supports(optimizer, MOI.ConstraintName(), typeof(c)) MOI.set(optimizer, MOI.ConstraintName(), c, "name") @test MOI.get(optimizer, MOI.ConstraintName(), c) == "name" MOI.set(optimizer, MOI.ObjectiveSense(), MOI.MAX_SENSE) From 89ceb2de1dc6d1fd5f3fc4f0b44926a18a442b47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Mon, 25 Aug 2025 21:42:03 +0200 Subject: [PATCH 7/9] Add tests --- src/MOI_wrapper.jl | 28 ++++++++++++++++------------ test/moi_tests.jl | 8 +++++--- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/MOI_wrapper.jl b/src/MOI_wrapper.jl index ff0f8024..ecf196df 100644 --- a/src/MOI_wrapper.jl +++ b/src/MOI_wrapper.jl @@ -270,16 +270,6 @@ function MOI.supports_add_constrained_variables( return MOI.supports_add_constrained_variables(model.optimizer, MOI.Reals) end -function _assert_parameter_is_finite(set::MOI.Parameter{T}) where {T} - if !isfinite(set.value) - throw( - AssertionError( - "Parameter value must be a finite number. Got $(set.value)", - ), - ) - end -end - function MOI.supports_add_constrained_variable( model::Optimizer, ::Type{S}, @@ -294,6 +284,16 @@ function MOI.supports_add_constrained_variables( return MOI.supports_add_constrained_variables(model.optimizer, S) end +function _assert_parameter_is_finite(set::MOI.Parameter{T}) where {T} + if !isfinite(set.value) + throw( + AssertionError( + "Parameter value must be a finite number. Got $(set.value)", + ), + ) + end +end + function MOI.add_constrained_variable( model::Optimizer{T}, set::MOI.Parameter{T}, @@ -316,7 +316,10 @@ function MOI.add_constrained_variable( set::MOI.AbstractScalarSet, ) inner_vi, inner_ci = MOI.add_constrained_variable(model.optimizer, set) - return _add_variable(model, inner_vi), inner_ci # FIXME map inner_ci + outer_vi = _add_variable(model, inner_vi) + outer_ci = MOI.ConstraintIndex{MOI.VariableIndex,typeof(set)}(outer_vi.value) + model.constraint_outer_to_inner[outer_ci] = inner_ci + return outer_vi, outer_ci end function MOI.add_constrained_variables( @@ -324,7 +327,8 @@ function MOI.add_constrained_variables( set::MOI.AbstractVectorSet, ) inner_vis, inner_ci = MOI.add_constrained_variables(model.optimizer, set) - return _add_variable.(Ref(model), inner_vis), inner_ci # FIXME map inner_ci + _add_to_constraint_map!(model, inner_ci) + return _add_variable.(model, inner_vis), inner_ci end function _add_to_constraint_map!(model::Optimizer, ci) diff --git a/test/moi_tests.jl b/test/moi_tests.jl index 4a912cd4..9a6b47cb 100644 --- a/test/moi_tests.jl +++ b/test/moi_tests.jl @@ -2143,12 +2143,13 @@ function test_copy_model() @test MOI.get(poi, MOI.VariablePrimal(), x) ≈ 1.0 end -function test_constrained_variable() +function test_constrained_variable_glpk() optimizer = POI.Optimizer(GLPK.Optimizer()) MOI.set(optimizer, MOI.Silent(), true) set = MOI.LessThan(1.0) - @test MOI.supports_add_constrained_variable(optmizer, typeof(set)) + @test MOI.supports_add_constrained_variable(optimizer, typeof(set)) x, c = MOI.add_constrained_variable(optimizer, set) + @test x.value == c.value @test c isa MOI.ConstraintIndex{typeof(x),typeof(set)} @test MOI.get(optimizer, MOI.ConstraintFunction(), c) ≈ x @test MOI.get(optimizer, MOI.ConstraintSet(), c) == set @@ -2166,12 +2167,13 @@ end include("no_free_model.jl") -function test_constrained_variable() +function test_constrained_variable_no_free() optimizer = POI.Optimizer(NoFreeVariablesModel{Float64}()) set = MOI.LessThan(1.0) @test MOI.supports_add_constrained_variable(optimizer, typeof(set)) x, c = MOI.add_constrained_variable(optimizer, set) @test c isa MOI.ConstraintIndex{typeof(x),typeof(set)} + @test x.value == c.value @test MOI.get(optimizer, MOI.ConstraintFunction(), c) ≈ x @test MOI.get(optimizer, MOI.ConstraintSet(), c) == set @test MOI.supports(optimizer, MOI.VariableName(), typeof(x)) From 7eb791bf08266f068a15e8eea823ce6edac3b42f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Mon, 25 Aug 2025 21:42:13 +0200 Subject: [PATCH 8/9] Fix format --- src/MOI_wrapper.jl | 3 ++- test/jump_tests.jl | 40 ++++++++++++++++++++-------------------- test/moi_tests.jl | 30 ++++++++++++------------------ 3 files changed, 34 insertions(+), 39 deletions(-) diff --git a/src/MOI_wrapper.jl b/src/MOI_wrapper.jl index ecf196df..70f98805 100644 --- a/src/MOI_wrapper.jl +++ b/src/MOI_wrapper.jl @@ -317,7 +317,8 @@ function MOI.add_constrained_variable( ) inner_vi, inner_ci = MOI.add_constrained_variable(model.optimizer, set) outer_vi = _add_variable(model, inner_vi) - outer_ci = MOI.ConstraintIndex{MOI.VariableIndex,typeof(set)}(outer_vi.value) + outer_ci = + MOI.ConstraintIndex{MOI.VariableIndex,typeof(set)}(outer_vi.value) model.constraint_outer_to_inner[outer_ci] = inner_ci return outer_vi, outer_ci end diff --git a/test/jump_tests.jl b/test/jump_tests.jl index da64ae35..ec3bf6fd 100644 --- a/test/jump_tests.jl +++ b/test/jump_tests.jl @@ -6,7 +6,7 @@ function test_jump_direct_affine_parameters() optimizer = POI.Optimizer(GLPK.Optimizer()) model = direct_model(optimizer) - @variable(model, x[i = 1:2] >= 0) + @variable(model, x[i=1:2] >= 0) @variable(model, y in MOI.Parameter(0.0)) @variable(model, w in MOI.Parameter(0.0)) @variable(model, z in MOI.Parameter(0.0)) @@ -29,7 +29,7 @@ end function test_jump_direct_parameter_times_variable() optimizer = POI.Optimizer(GLPK.Optimizer()) model = direct_model(optimizer) - @variable(model, x[i = 1:2] >= 0) + @variable(model, x[i=1:2] >= 0) @variable(model, y in MOI.Parameter(0.0)) @variable(model, w in MOI.Parameter(0.0)) @variable(model, z in MOI.Parameter(0.0)) @@ -51,7 +51,7 @@ end function test_jump_affine_parameters() model = Model(() -> POI.Optimizer(GLPK.Optimizer())) - @variable(model, x[i = 1:2] >= 0) + @variable(model, x[i=1:2] >= 0) @variable(model, y in MOI.Parameter(0.0)) @variable(model, w in MOI.Parameter(0.0)) @variable(model, z in MOI.Parameter(0.0)) @@ -73,7 +73,7 @@ end function test_jump_parameter_times_variable() model = Model(() -> POI.Optimizer(GLPK.Optimizer())) - @variable(model, x[i = 1:2] >= 0) + @variable(model, x[i=1:2] >= 0) @variable(model, y in MOI.Parameter(0.0)) @variable(model, w in MOI.Parameter(0.0)) @variable(model, z in MOI.Parameter(0.0)) @@ -103,8 +103,8 @@ function test_jump_constraintfunction_getter() ), ), ) - vx = @variable(model, x[i = 1:2]) - vp = @variable(model, p[i = 1:2] in MOI.Parameter.(-1.0)) + vx = @variable(model, x[i=1:2]) + vp = @variable(model, p[i=1:2] in MOI.Parameter.(-1.0)) c1 = @constraint(model, con, sum(x) + sum(p) >= 1) c2 = @constraint(model, conq, sum(x .* p) >= 1) c3 = @constraint(model, conqa, sum(x .* p) + x[1]^2 + x[1] + p[1] >= 1) @@ -254,8 +254,8 @@ end function test_jump_interpret_parameteric_bounds() model = Model(() -> POI.Optimizer(GLPK.Optimizer())) MOI.set(model, POI.ConstraintsInterpretation(), POI.ONLY_BOUNDS) - @variable(model, x[i = 1:2]) - @variable(model, p[i = 1:2] in MOI.Parameter.(-1.0)) + @variable(model, x[i=1:2]) + @variable(model, p[i=1:2] in MOI.Parameter.(-1.0)) @constraint(model, [i in 1:2], x[i] >= p[i]) @objective(model, Min, sum(x)) optimize!(model) @@ -283,8 +283,8 @@ end function test_jump_interpret_parameteric_bounds_expression() model = Model(() -> POI.Optimizer(GLPK.Optimizer())) MOI.set(model, POI.ConstraintsInterpretation(), POI.ONLY_BOUNDS) - @variable(model, x[i = 1:2]) - @variable(model, p[i = 1:2] in MOI.Parameter.(-1.0)) + @variable(model, x[i=1:2]) + @variable(model, p[i=1:2] in MOI.Parameter.(-1.0)) @constraint(model, [i in 1:2], x[i] >= p[i] + p[1]) @objective(model, Min, sum(x)) optimize!(model) @@ -312,8 +312,8 @@ end function test_jump_direct_interpret_parameteric_bounds() model = direct_model(POI.Optimizer(GLPK.Optimizer())) MOI.set(model, POI.ConstraintsInterpretation(), POI.ONLY_BOUNDS) - @variable(model, x[i = 1:2]) - @variable(model, p[i = 1:2] in MOI.Parameter.(-1.0)) + @variable(model, x[i=1:2]) + @variable(model, p[i=1:2] in MOI.Parameter.(-1.0)) @constraint(model, [i in 1:2], x[i] >= p[i]) @objective(model, Min, sum(x)) optimize!(model) @@ -339,8 +339,8 @@ end function test_jump_direct_interpret_parameteric_bounds_no_interpretation() model = direct_model(POI.Optimizer(GLPK.Optimizer())) MOI.set(model, POI.ConstraintsInterpretation(), POI.ONLY_CONSTRAINTS) - @variable(model, x[i = 1:2]) - @variable(model, p[i = 1:2] in MOI.Parameter.(-1.0)) + @variable(model, x[i=1:2]) + @variable(model, p[i=1:2] in MOI.Parameter.(-1.0)) @constraint(model, [i in 1:2], x[i] >= p[i]) @objective(model, Min, sum(x)) optimize!(model) @@ -369,8 +369,8 @@ end function test_jump_direct_interpret_parameteric_bounds_change() model = direct_model(POI.Optimizer(GLPK.Optimizer())) MOI.set(model, POI.ConstraintsInterpretation(), POI.ONLY_BOUNDS) - @variable(model, x[i = 1:2]) - @variable(model, p[i = 1:2] in MOI.Parameter.(-1.0)) + @variable(model, x[i=1:2]) + @variable(model, p[i=1:2] in MOI.Parameter.(-1.0)) @constraint(model, [i in 1:2], x[i] >= p[i]) @test_throws ErrorException @constraint(model, [i in 1:2], 2x[i] >= p[i]) MOI.set(model, POI.ConstraintsInterpretation(), POI.ONLY_CONSTRAINTS) @@ -387,8 +387,8 @@ end function test_jump_direct_interpret_parameteric_bounds_both() model = direct_model(POI.Optimizer(GLPK.Optimizer())) MOI.set(model, POI.ConstraintsInterpretation(), POI.BOUNDS_AND_CONSTRAINTS) - @variable(model, x[i = 1:2]) - @variable(model, p[i = 1:2] in MOI.Parameter.(-1.0)) + @variable(model, x[i=1:2]) + @variable(model, p[i=1:2] in MOI.Parameter.(-1.0)) @constraint(model, [i in 1:2], x[i] >= p[i]) @constraint(model, [i in 1:2], 2x[i] >= p[i]) @objective(model, Min, sum(x)) @@ -403,8 +403,8 @@ end function test_jump_direct_interpret_parameteric_bounds_invalid() model = direct_model(POI.Optimizer(GLPK.Optimizer())) MOI.set(model, POI.ConstraintsInterpretation(), POI.ONLY_BOUNDS) - @variable(model, x[i = 1:2]) - @variable(model, p[i = 1:2] in MOI.Parameter.(-1.0)) + @variable(model, x[i=1:2]) + @variable(model, p[i=1:2] in MOI.Parameter.(-1.0)) @test_throws ErrorException @constraint( model, [i in 1:2], diff --git a/test/moi_tests.jl b/test/moi_tests.jl index 9a6b47cb..90593dc4 100644 --- a/test/moi_tests.jl +++ b/test/moi_tests.jl @@ -295,13 +295,9 @@ function test_moi_ListOfConstraintTypesPresent() model = POI.Optimizer(ipopt) MOI.set(model, MOI.Silent(), true) x = MOI.add_variables(model, N / 2) - y = - first.( - MOI.add_constrained_variable.( - model, - MOI.Parameter.(ones(Int(N / 2))), - ), - ) + y = first.( + MOI.add_constrained_variable.(model, MOI.Parameter.(ones(Int(N / 2)))), + ) MOI.add_constraint( model, @@ -601,11 +597,10 @@ function test_vector_parameter_affine_nonnegatives() t, ct = MOI.add_constrained_variable(model, MOI.Parameter(5.0)) A = [1.0 0 -1; 0 1 -1] b = [1.0; 2] - terms = - MOI.VectorAffineTerm.( - 1:2, - MOI.ScalarAffineTerm.(A, reshape([x, y, t], 1, 3)), - ) + terms = MOI.VectorAffineTerm.( + 1:2, + MOI.ScalarAffineTerm.(A, reshape([x, y, t], 1, 3)), + ) f = MOI.VectorAffineFunction(vec(terms), b) set = MOI.Nonnegatives(2) cnn = MOI.add_constraint(model, f, MOI.Nonnegatives(2)) @@ -661,11 +656,10 @@ function test_vector_parameter_affine_nonpositives() t, ct = MOI.add_constrained_variable(model, MOI.Parameter(5.0)) A = [-1.0 0 1; 0 -1 1] b = [-1.0; -2] - terms = - MOI.VectorAffineTerm.( - 1:2, - MOI.ScalarAffineTerm.(A, reshape([x, y, t], 1, 3)), - ) + terms = MOI.VectorAffineTerm.( + 1:2, + MOI.ScalarAffineTerm.(A, reshape([x, y, t], 1, 3)), + ) f = MOI.VectorAffineFunction(vec(terms), b) set = MOI.Nonnegatives(2) cnn = MOI.add_constraint(model, f, MOI.Nonpositives(2)) @@ -2097,7 +2091,7 @@ function test_psd_cone_with_parameter() model = POI.Optimizer(cached) MOI.set(model, MOI.Silent(), true) x = MOI.add_variable(model) - p = first.(MOI.add_constrained_variable.(model, MOI.Parameter(1.0)),) + p = first.(MOI.add_constrained_variable.(model, MOI.Parameter(1.0))) # Set objective: minimize x obj_func = MOI.ScalarAffineFunction([MOI.ScalarAffineTerm(1.0, x)], 0.0) From e4c952bfed2b876b850bc244cc80549ff678aba3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Tue, 26 Aug 2025 07:34:29 +0200 Subject: [PATCH 9/9] Fix format --- test/jump_tests.jl | 40 ++++++++++++++++++++-------------------- test/moi_tests.jl | 28 +++++++++++++++++----------- 2 files changed, 37 insertions(+), 31 deletions(-) diff --git a/test/jump_tests.jl b/test/jump_tests.jl index ec3bf6fd..da64ae35 100644 --- a/test/jump_tests.jl +++ b/test/jump_tests.jl @@ -6,7 +6,7 @@ function test_jump_direct_affine_parameters() optimizer = POI.Optimizer(GLPK.Optimizer()) model = direct_model(optimizer) - @variable(model, x[i=1:2] >= 0) + @variable(model, x[i = 1:2] >= 0) @variable(model, y in MOI.Parameter(0.0)) @variable(model, w in MOI.Parameter(0.0)) @variable(model, z in MOI.Parameter(0.0)) @@ -29,7 +29,7 @@ end function test_jump_direct_parameter_times_variable() optimizer = POI.Optimizer(GLPK.Optimizer()) model = direct_model(optimizer) - @variable(model, x[i=1:2] >= 0) + @variable(model, x[i = 1:2] >= 0) @variable(model, y in MOI.Parameter(0.0)) @variable(model, w in MOI.Parameter(0.0)) @variable(model, z in MOI.Parameter(0.0)) @@ -51,7 +51,7 @@ end function test_jump_affine_parameters() model = Model(() -> POI.Optimizer(GLPK.Optimizer())) - @variable(model, x[i=1:2] >= 0) + @variable(model, x[i = 1:2] >= 0) @variable(model, y in MOI.Parameter(0.0)) @variable(model, w in MOI.Parameter(0.0)) @variable(model, z in MOI.Parameter(0.0)) @@ -73,7 +73,7 @@ end function test_jump_parameter_times_variable() model = Model(() -> POI.Optimizer(GLPK.Optimizer())) - @variable(model, x[i=1:2] >= 0) + @variable(model, x[i = 1:2] >= 0) @variable(model, y in MOI.Parameter(0.0)) @variable(model, w in MOI.Parameter(0.0)) @variable(model, z in MOI.Parameter(0.0)) @@ -103,8 +103,8 @@ function test_jump_constraintfunction_getter() ), ), ) - vx = @variable(model, x[i=1:2]) - vp = @variable(model, p[i=1:2] in MOI.Parameter.(-1.0)) + vx = @variable(model, x[i = 1:2]) + vp = @variable(model, p[i = 1:2] in MOI.Parameter.(-1.0)) c1 = @constraint(model, con, sum(x) + sum(p) >= 1) c2 = @constraint(model, conq, sum(x .* p) >= 1) c3 = @constraint(model, conqa, sum(x .* p) + x[1]^2 + x[1] + p[1] >= 1) @@ -254,8 +254,8 @@ end function test_jump_interpret_parameteric_bounds() model = Model(() -> POI.Optimizer(GLPK.Optimizer())) MOI.set(model, POI.ConstraintsInterpretation(), POI.ONLY_BOUNDS) - @variable(model, x[i=1:2]) - @variable(model, p[i=1:2] in MOI.Parameter.(-1.0)) + @variable(model, x[i = 1:2]) + @variable(model, p[i = 1:2] in MOI.Parameter.(-1.0)) @constraint(model, [i in 1:2], x[i] >= p[i]) @objective(model, Min, sum(x)) optimize!(model) @@ -283,8 +283,8 @@ end function test_jump_interpret_parameteric_bounds_expression() model = Model(() -> POI.Optimizer(GLPK.Optimizer())) MOI.set(model, POI.ConstraintsInterpretation(), POI.ONLY_BOUNDS) - @variable(model, x[i=1:2]) - @variable(model, p[i=1:2] in MOI.Parameter.(-1.0)) + @variable(model, x[i = 1:2]) + @variable(model, p[i = 1:2] in MOI.Parameter.(-1.0)) @constraint(model, [i in 1:2], x[i] >= p[i] + p[1]) @objective(model, Min, sum(x)) optimize!(model) @@ -312,8 +312,8 @@ end function test_jump_direct_interpret_parameteric_bounds() model = direct_model(POI.Optimizer(GLPK.Optimizer())) MOI.set(model, POI.ConstraintsInterpretation(), POI.ONLY_BOUNDS) - @variable(model, x[i=1:2]) - @variable(model, p[i=1:2] in MOI.Parameter.(-1.0)) + @variable(model, x[i = 1:2]) + @variable(model, p[i = 1:2] in MOI.Parameter.(-1.0)) @constraint(model, [i in 1:2], x[i] >= p[i]) @objective(model, Min, sum(x)) optimize!(model) @@ -339,8 +339,8 @@ end function test_jump_direct_interpret_parameteric_bounds_no_interpretation() model = direct_model(POI.Optimizer(GLPK.Optimizer())) MOI.set(model, POI.ConstraintsInterpretation(), POI.ONLY_CONSTRAINTS) - @variable(model, x[i=1:2]) - @variable(model, p[i=1:2] in MOI.Parameter.(-1.0)) + @variable(model, x[i = 1:2]) + @variable(model, p[i = 1:2] in MOI.Parameter.(-1.0)) @constraint(model, [i in 1:2], x[i] >= p[i]) @objective(model, Min, sum(x)) optimize!(model) @@ -369,8 +369,8 @@ end function test_jump_direct_interpret_parameteric_bounds_change() model = direct_model(POI.Optimizer(GLPK.Optimizer())) MOI.set(model, POI.ConstraintsInterpretation(), POI.ONLY_BOUNDS) - @variable(model, x[i=1:2]) - @variable(model, p[i=1:2] in MOI.Parameter.(-1.0)) + @variable(model, x[i = 1:2]) + @variable(model, p[i = 1:2] in MOI.Parameter.(-1.0)) @constraint(model, [i in 1:2], x[i] >= p[i]) @test_throws ErrorException @constraint(model, [i in 1:2], 2x[i] >= p[i]) MOI.set(model, POI.ConstraintsInterpretation(), POI.ONLY_CONSTRAINTS) @@ -387,8 +387,8 @@ end function test_jump_direct_interpret_parameteric_bounds_both() model = direct_model(POI.Optimizer(GLPK.Optimizer())) MOI.set(model, POI.ConstraintsInterpretation(), POI.BOUNDS_AND_CONSTRAINTS) - @variable(model, x[i=1:2]) - @variable(model, p[i=1:2] in MOI.Parameter.(-1.0)) + @variable(model, x[i = 1:2]) + @variable(model, p[i = 1:2] in MOI.Parameter.(-1.0)) @constraint(model, [i in 1:2], x[i] >= p[i]) @constraint(model, [i in 1:2], 2x[i] >= p[i]) @objective(model, Min, sum(x)) @@ -403,8 +403,8 @@ end function test_jump_direct_interpret_parameteric_bounds_invalid() model = direct_model(POI.Optimizer(GLPK.Optimizer())) MOI.set(model, POI.ConstraintsInterpretation(), POI.ONLY_BOUNDS) - @variable(model, x[i=1:2]) - @variable(model, p[i=1:2] in MOI.Parameter.(-1.0)) + @variable(model, x[i = 1:2]) + @variable(model, p[i = 1:2] in MOI.Parameter.(-1.0)) @test_throws ErrorException @constraint( model, [i in 1:2], diff --git a/test/moi_tests.jl b/test/moi_tests.jl index 90593dc4..0993bbe2 100644 --- a/test/moi_tests.jl +++ b/test/moi_tests.jl @@ -295,9 +295,13 @@ function test_moi_ListOfConstraintTypesPresent() model = POI.Optimizer(ipopt) MOI.set(model, MOI.Silent(), true) x = MOI.add_variables(model, N / 2) - y = first.( - MOI.add_constrained_variable.(model, MOI.Parameter.(ones(Int(N / 2)))), - ) + y = + first.( + MOI.add_constrained_variable.( + model, + MOI.Parameter.(ones(Int(N / 2))), + ), + ) MOI.add_constraint( model, @@ -597,10 +601,11 @@ function test_vector_parameter_affine_nonnegatives() t, ct = MOI.add_constrained_variable(model, MOI.Parameter(5.0)) A = [1.0 0 -1; 0 1 -1] b = [1.0; 2] - terms = MOI.VectorAffineTerm.( - 1:2, - MOI.ScalarAffineTerm.(A, reshape([x, y, t], 1, 3)), - ) + terms = + MOI.VectorAffineTerm.( + 1:2, + MOI.ScalarAffineTerm.(A, reshape([x, y, t], 1, 3)), + ) f = MOI.VectorAffineFunction(vec(terms), b) set = MOI.Nonnegatives(2) cnn = MOI.add_constraint(model, f, MOI.Nonnegatives(2)) @@ -656,10 +661,11 @@ function test_vector_parameter_affine_nonpositives() t, ct = MOI.add_constrained_variable(model, MOI.Parameter(5.0)) A = [-1.0 0 1; 0 -1 1] b = [-1.0; -2] - terms = MOI.VectorAffineTerm.( - 1:2, - MOI.ScalarAffineTerm.(A, reshape([x, y, t], 1, 3)), - ) + terms = + MOI.VectorAffineTerm.( + 1:2, + MOI.ScalarAffineTerm.(A, reshape([x, y, t], 1, 3)), + ) f = MOI.VectorAffineFunction(vec(terms), b) set = MOI.Nonnegatives(2) cnn = MOI.add_constraint(model, f, MOI.Nonpositives(2))