From da69cc10b2147c3e2d988ce24065e65ea6587fde Mon Sep 17 00:00:00 2001 From: odow Date: Wed, 21 Jul 2021 15:43:18 +1200 Subject: [PATCH] Migrate tests of Variable bridges --- src/Test/test_linear.jl | 20 +- test/Bridges/Variable/bridge.jl | 29 +- test/Bridges/Variable/flip_sign.jl | 332 ++++++++++++----------- test/Bridges/Variable/free.jl | 301 ++++++++++++--------- test/Bridges/Variable/map.jl | 262 ++++++++++-------- test/Bridges/Variable/rsoc_to_psd.jl | 382 +++++++++++++-------------- test/Bridges/Variable/rsoc_to_soc.jl | 178 +++++++------ test/Bridges/Variable/soc_to_rsoc.jl | 178 +++++++------ test/Bridges/Variable/vectorize.jl | 209 ++++++++------- test/Bridges/Variable/zeros.jl | 171 ++++++------ test/Bridges/utilities.jl | 34 +-- 11 files changed, 1115 insertions(+), 981 deletions(-) diff --git a/src/Test/test_linear.jl b/src/Test/test_linear.jl index b351c1fefc..045ab03889 100644 --- a/src/Test/test_linear.jl +++ b/src/Test/test_linear.jl @@ -836,7 +836,8 @@ end config::Config{T}, ) where {T} -Test solving a linear program with variabless containing lower and upper bounds. +Test solving a linear program with ScalarAffineFunction-in-LessThan and +GreaterThan constraints. """ function test_linear_LessThan_and_GreaterThan( model::MOI.ModelLike, @@ -852,12 +853,12 @@ function test_linear_LessThan_and_GreaterThan( @requires MOI.supports(model, MOI.ObjectiveSense()) @requires MOI.supports_constraint( model, - MOI.SingleVariable, + MOI.ScalarAffineFunction{T}, MOI.GreaterThan{T}, ) @requires MOI.supports_constraint( model, - MOI.SingleVariable, + MOI.ScalarAffineFunction{T}, MOI.LessThan{T}, ) x = MOI.add_variable(model) @@ -874,14 +875,10 @@ function test_linear_LessThan_and_GreaterThan( ), ) MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE) - c1 = MOI.add_constraint( - model, - MOI.SingleVariable(x), - MOI.GreaterThan(zero(T)), - ) - @test c1.value == x.value - c2 = MOI.add_constraint(model, MOI.SingleVariable(y), MOI.LessThan(zero(T))) - @test c2.value == y.value + fx = MOI.ScalarAffineFunction([MOI.ScalarAffineTerm(one(T), x)], zero(T)) + c1 = MOI.add_constraint(model, fx, MOI.GreaterThan(zero(T))) + fy = MOI.ScalarAffineFunction([MOI.ScalarAffineTerm(one(T), y)], zero(T)) + c2 = MOI.add_constraint(model, fy, MOI.LessThan(zero(T))) if _supports(config, MOI.optimize!) @test MOI.get(model, MOI.TerminationStatus()) == MOI.OPTIMIZE_NOT_CALLED MOI.optimize!(model) @@ -924,6 +921,7 @@ function test_linear_LessThan_and_GreaterThan( @test MOI.get(model, MOI.VariablePrimal(), y) ≈ -T(100) atol = atol rtol = rtol end + return end function setup_test( diff --git a/test/Bridges/Variable/bridge.jl b/test/Bridges/Variable/bridge.jl index e07773860c..7b3680a8c1 100644 --- a/test/Bridges/Variable/bridge.jl +++ b/test/Bridges/Variable/bridge.jl @@ -1,19 +1,29 @@ +module TestVariableBridge + using Test using MathOptInterface const MOI = MathOptInterface -const MOIT = MathOptInterface.DeprecatedTest -const MOIU = MathOptInterface.Utilities -const MOIB = MathOptInterface.Bridges -struct DummyVariableBridge <: MOIB.Variable.AbstractBridge end +function runtests() + for name in names(@__MODULE__; all = true) + if startswith("$(name)", "test_") + @testset "$(name)" begin + getfield(@__MODULE__, name)() + end + end + end + return +end + +struct DummyVariableBridge <: MOI.Bridges.Variable.AbstractBridge end -@testset "AbstractBridge" begin - model = MOIU.Model{Float64}() +function test_AbstractBridge() + model = MOI.Utilities.Model{Float64}() bridge = DummyVariableBridge() attr = MOI.VariablePrimalStart() @test !MOI.supports(model, attr, typeof(bridge)) - i = MOIB.IndexInVector(1) + i = MOI.Bridges.IndexInVector(1) @test_throws MOI.UnsupportedAttribute(attr) MOI.set( model, attr, @@ -31,4 +41,9 @@ struct DummyVariableBridge <: MOIB.Variable.AbstractBridge end err = MOI.SetAttributeNotAllowed(attr) @test_throws err MOI.set(model, attr, bridge, 1.0) @test_throws err MOI.set(model, attr, bridge, 1.0, i) + return end + +end # module + +TestVariableBridge.runtests() diff --git a/test/Bridges/Variable/flip_sign.jl b/test/Bridges/Variable/flip_sign.jl index bab0b247ac..1a78f6bc92 100644 --- a/test/Bridges/Variable/flip_sign.jl +++ b/test/Bridges/Variable/flip_sign.jl @@ -1,177 +1,191 @@ +module TestVariableFlipSign + using Test using MathOptInterface const MOI = MathOptInterface -const MOIT = MathOptInterface.DeprecatedTest -const MOIU = MathOptInterface.Utilities -const MOIB = MathOptInterface.Bridges include("../utilities.jl") -mock = MOIU.MockOptimizer(MOIU.UniversalFallback(MOIU.Model{Float64}())) -config = MOIT.Config() - -@testset "NonposToNonneg" begin - bridged_mock = MOIB.Variable.NonposToNonneg{Float64}(mock) - - @testset "lin2v" begin - mock.optimize! = - (mock::MOIU.MockOptimizer) -> MOIU.mock_optimize!( - mock, - [-4, 3, 16, 0], - (MOI.VectorAffineFunction{Float64}, MOI.Zeros) => - [[7, 2, -4]], - ) - MOIT.lin2vtest(bridged_mock, config) - - @test MOI.get(mock, MOI.NumberOfVariables()) == 4 - @test MOI.get(bridged_mock, MOI.NumberOfVariables()) == 4 - vis = MOI.get(bridged_mock, MOI.ListOfVariableIndices()) - y = vis[4] - @test y.value == -1 - - @test MOI.supports( - bridged_mock, - MOI.VariablePrimalStart(), - MOI.VariableIndex, - ) - @test MOI.supports( - bridged_mock, - MOI.VariablePrimalStart(), - typeof(MOIB.bridge(bridged_mock, y)), - ) - MOI.set(bridged_mock, MOI.VariablePrimalStart(), y, 1.0) - x, y_flipped, z, s = MOI.get(mock, MOI.ListOfVariableIndices()) - @test MOI.get(mock, MOI.VariablePrimalStart(), y_flipped) == -1 - @test MOI.get(bridged_mock, MOI.VariablePrimalStart(), y) == 1 +function runtests() + for name in names(@__MODULE__; all = true) + if startswith("$(name)", "test_") + @testset "$(name)" begin + getfield(@__MODULE__, name)() + end + end + end + return +end - var_names = ["x", "y", "z", "w"] - MOI.set( +function test_NonposToNonneg() + mock = MOI.Utilities.MockOptimizer( + MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), + ) + bridged_mock = MOI.Bridges.Variable.NonposToNonneg{Float64}(mock) + mock.optimize! = + (mock::MOI.Utilities.MockOptimizer) -> MOI.Utilities.mock_optimize!( mock, - MOI.VariableName(), - MOI.get(mock, MOI.ListOfVariableIndices()), - var_names, + [-4, 3, 16, 0], + (MOI.VectorAffineFunction{Float64}, MOI.Zeros) => [[7, 2, -4]], ) - con_w = MOI.get( - mock, - MOI.ListOfConstraintIndices{ - MathOptInterface.VectorOfVariables, - MathOptInterface.Zeros, - }(), - )[1] - con_yz = MOI.get( - mock, - MOI.ListOfConstraintIndices{ - MathOptInterface.VectorOfVariables, - MathOptInterface.Nonnegatives, - }(), - ) - con_ex = MOI.get( - mock, - MOI.ListOfConstraintIndices{ - MathOptInterface.VectorAffineFunction{Float64}, - MathOptInterface.Zeros, - }(), - )[1] + MOI.Test.test_conic_linear_VectorOfVariables_2( + bridged_mock, + MOI.Test.Config(), + ) + @test MOI.get(mock, MOI.NumberOfVariables()) == 4 + @test MOI.get(bridged_mock, MOI.NumberOfVariables()) == 4 + vis = MOI.get(bridged_mock, MOI.ListOfVariableIndices()) + y = vis[4] + @test y.value == -1 - MOI.set(mock, MOI.ConstraintName(), con_w, "cw") - MOI.set(mock, MOI.ConstraintName(), con_yz[1], "cy") - MOI.set(mock, MOI.ConstraintName(), con_yz[2], "cz") - MOI.set(mock, MOI.ConstraintName(), con_ex, "cex") + @test MOI.supports( + bridged_mock, + MOI.VariablePrimalStart(), + MOI.VariableIndex, + ) + @test MOI.supports( + bridged_mock, + MOI.VariablePrimalStart(), + typeof(MOI.Bridges.bridge(bridged_mock, y)), + ) + MOI.set(bridged_mock, MOI.VariablePrimalStart(), y, 1.0) + x, y_flipped, z, s = MOI.get(mock, MOI.ListOfVariableIndices()) + @test MOI.get(mock, MOI.VariablePrimalStart(), y_flipped) == -1 + @test MOI.get(bridged_mock, MOI.VariablePrimalStart(), y) == 1 - MOI.set( - bridged_mock, - MOI.VariableName(), - MOI.get(bridged_mock, MOI.ListOfVariableIndices())[4], - "v", - ) - con_v = MOI.get( - bridged_mock, - MOI.ListOfConstraintIndices{ - MathOptInterface.VectorOfVariables, - MathOptInterface.Nonpositives, - }(), - )[1] - MOI.set(bridged_mock, MOI.ConstraintName(), con_v, "cv") + var_names = ["x", "y", "z", "w"] + MOI.set( + mock, + MOI.VariableName(), + MOI.get(mock, MOI.ListOfVariableIndices()), + var_names, + ) + con_w = MOI.get( + mock, + MOI.ListOfConstraintIndices{ + MathOptInterface.VectorOfVariables, + MathOptInterface.Zeros, + }(), + )[1] + con_yz = MOI.get( + mock, + MOI.ListOfConstraintIndices{ + MathOptInterface.VectorOfVariables, + MathOptInterface.Nonnegatives, + }(), + ) + con_ex = MOI.get( + mock, + MOI.ListOfConstraintIndices{ + MathOptInterface.VectorAffineFunction{Float64}, + MathOptInterface.Zeros, + }(), + )[1] - @testset "Test Mock model" begin - s = """ - variables: x, y, z, w - cw: [w] in MathOptInterface.Zeros(1) - cy: [y] in MathOptInterface.Nonnegatives(1) - cz: [z] in MathOptInterface.Nonnegatives(1) - cex: [1*x + -1*w + 4.0, -1*y + 3.0, 1*x + 1*z + -12.0] in MathOptInterface.Zeros(3) - minobjective: 3*x + -2*y + -4*z - """ - model = MOIU.Model{Float64}() - MOIU.loadfromstring!(model, s) - MOIU.test_models_equal( - mock, - model, - var_names, - ["cw", "cy", "cz", "cex"], - ) - end + MOI.set(mock, MOI.ConstraintName(), con_w, "cw") + MOI.set(mock, MOI.ConstraintName(), con_yz[1], "cy") + MOI.set(mock, MOI.ConstraintName(), con_yz[2], "cz") + MOI.set(mock, MOI.ConstraintName(), con_ex, "cex") - @testset "Test Bridged model" begin - s = """ - variables: x, z, w, v - cv: [v] in MathOptInterface.Nonpositives(1) - cw: [w] in MathOptInterface.Zeros(1) - cz: [z] in MathOptInterface.Nonnegatives(1) - cex: [1*x + -1*w + 4.0, 1*v + 3.0, 1*x + 1*z + -12.0] in MathOptInterface.Zeros(3) - minobjective: 3*x + 2*v + -4*z - """ - model = MOIU.Model{Float64}() - MOIU.loadfromstring!(model, s) - MOIU.test_models_equal( - bridged_mock, - model, - ["x", "z", "w", "v"], - ["cv", "cw", "cz", "cex"], - ) - end - end + MOI.set( + bridged_mock, + MOI.VariableName(), + MOI.get(bridged_mock, MOI.ListOfVariableIndices())[4], + "v", + ) + con_v = MOI.get( + bridged_mock, + MOI.ListOfConstraintIndices{ + MathOptInterface.VectorOfVariables, + MathOptInterface.Nonpositives, + }(), + )[1] + MOI.set(bridged_mock, MOI.ConstraintName(), con_v, "cv") + s = """ + variables: x, y, z, w + cw: [w] in MathOptInterface.Zeros(1) + cy: [y] in MathOptInterface.Nonnegatives(1) + cz: [z] in MathOptInterface.Nonnegatives(1) + cex: [1*x + -1*w + 4.0, -1*y + 3.0, 1*x + 1*z + -12.0] in MathOptInterface.Zeros(3) + minobjective: 3*x + -2*y + -4*z + """ + model = MOI.Utilities.Model{Float64}() + MOI.Utilities.loadfromstring!(model, s) + MOI.Utilities.test_models_equal( + mock, + model, + var_names, + ["cw", "cy", "cz", "cex"], + ) + s = """ + variables: x, z, w, v + cv: [v] in MathOptInterface.Nonpositives(1) + cw: [w] in MathOptInterface.Zeros(1) + cz: [z] in MathOptInterface.Nonnegatives(1) + cex: [1*x + -1*w + 4.0, 1*v + 3.0, 1*x + 1*z + -12.0] in MathOptInterface.Zeros(3) + minobjective: 3*x + 2*v + -4*z + """ + model = MOI.Utilities.Model{Float64}() + MOI.Utilities.loadfromstring!(model, s) + MOI.Utilities.test_models_equal( + bridged_mock, + model, + ["x", "z", "w", "v"], + ["cv", "cw", "cz", "cex"], + ) + return +end - @testset "lin4" begin - MOIU.set_mock_optimize!( +function test_conic_linear_INFEASIBLE_2() + mock = MOI.Utilities.MockOptimizer( + MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), + ) + bridged_mock = MOI.Bridges.Variable.NonposToNonneg{Float64}(mock) + MOI.Utilities.set_mock_optimize!( + mock, + (mock::MOI.Utilities.MockOptimizer) -> MOI.Utilities.mock_optimize!( mock, - (mock::MOIU.MockOptimizer) -> MOIU.mock_optimize!( - mock, - MOI.INFEASIBLE, - MOI.INFEASIBLE_POINT, - MOI.INFEASIBILITY_CERTIFICATE, - ), - ) - MOIT.lin4test(bridged_mock, config) - - @test MOI.get(mock, MOI.NumberOfVariables()) == 1 - @test length(MOI.get(mock, MOI.ListOfVariableIndices())) == 1 - @test first(MOI.get(mock, MOI.ListOfVariableIndices())).value ≥ 0 - @test MOI.get(bridged_mock, MOI.NumberOfVariables()) == 1 - vis = MOI.get(bridged_mock, MOI.ListOfVariableIndices()) - @test vis == [MOI.VariableIndex(-1)] - _test_delete_bridged_variable( - bridged_mock, - vis[1], - MOI.Nonpositives, - 1, - ((MOI.VectorOfVariables, MOI.Nonnegatives, 0),), - ) - end + MOI.INFEASIBLE, + MOI.INFEASIBLE_POINT, + MOI.INFEASIBILITY_CERTIFICATE, + ), + ) + MOI.Test.test_conic_linear_INFEASIBLE_2(bridged_mock, MOI.Test.Config()) + @test MOI.get(mock, MOI.NumberOfVariables()) == 1 + @test length(MOI.get(mock, MOI.ListOfVariableIndices())) == 1 + @test first(MOI.get(mock, MOI.ListOfVariableIndices())).value ≥ 0 + @test MOI.get(bridged_mock, MOI.NumberOfVariables()) == 1 + vis = MOI.get(bridged_mock, MOI.ListOfVariableIndices()) + @test vis == [MOI.VariableIndex(-1)] + _test_delete_bridged_variable( + bridged_mock, + vis[1], + MOI.Nonpositives, + 1, + ((MOI.VectorOfVariables, MOI.Nonnegatives, 0),), + ) + return +end - @testset "Delete in vector" begin - MOI.empty!(bridged_mock) - vis, ci = - MOI.add_constrained_variables(bridged_mock, MOI.Nonpositives(4)) - _test_delete_bridged_variable( - bridged_mock, - vis[2], - MOI.Nonpositives, - 4, - ((MOI.VectorOfVariables, MOI.Nonnegatives, 0),), - used_bridges = 0, - used_constraints = 0, - ) - end +function test_delete_in_vector() + mock = MOI.Utilities.MockOptimizer( + MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), + ) + bridged_mock = MOI.Bridges.Variable.NonposToNonneg{Float64}(mock) + vis, _ = MOI.add_constrained_variables(bridged_mock, MOI.Nonpositives(4)) + _test_delete_bridged_variable( + bridged_mock, + vis[2], + MOI.Nonpositives, + 4, + ((MOI.VectorOfVariables, MOI.Nonnegatives, 0),), + used_bridges = 0, + used_constraints = 0, + ) + return end + +end # module + +TestVariableFlipSign.runtests() diff --git a/test/Bridges/Variable/free.jl b/test/Bridges/Variable/free.jl index ecbe544058..ef850a7af1 100644 --- a/test/Bridges/Variable/free.jl +++ b/test/Bridges/Variable/free.jl @@ -1,34 +1,45 @@ +module TestVariableFree + using Test using MathOptInterface const MOI = MathOptInterface -const MOIT = MathOptInterface.DeprecatedTest -const MOIU = MathOptInterface.Utilities -const MOIB = MathOptInterface.Bridges - -include("../utilities.jl") -mock = MOIU.MockOptimizer(MOIU.UniversalFallback(MOIU.Model{Float64}())) -config = MOIT.Config() +function runtests() + for name in names(@__MODULE__; all = true) + if startswith("$(name)", "test_") + @testset "$(name)" begin + getfield(@__MODULE__, name)() + end + end + end + return +end -bridged_mock = MOIB.Variable.Free{Float64}(mock) +include("../utilities.jl") -@testset "solve_multirow_vectoraffine_nonpos" begin - MOIU.set_mock_optimize!( +function test_modification_multirow_vectoraffine_nonpos() + mock = MOI.Utilities.MockOptimizer( + MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), + ) + bridged_mock = MOI.Bridges.Variable.Free{Float64}(mock) + MOI.Utilities.set_mock_optimize!( mock, - (mock::MOIU.MockOptimizer) -> MOIU.mock_optimize!( + (mock::MOI.Utilities.MockOptimizer) -> MOI.Utilities.mock_optimize!( mock, MOI.OPTIMAL, (MOI.FEASIBLE_POINT, [0.5, 0.0]), ), - (mock::MOIU.MockOptimizer) -> MOIU.mock_optimize!( + (mock::MOI.Utilities.MockOptimizer) -> MOI.Utilities.mock_optimize!( mock, MOI.OPTIMAL, (MOI.FEASIBLE_POINT, [0.25, 0.0]), ), ) - MOIT.solve_multirow_vectoraffine_nonpos(bridged_mock, config) - + MOI.Test.test_modification_multirow_vectoraffine_nonpos( + bridged_mock, + MOI.Test.Config(), + ) MOI.set( bridged_mock, MOI.ConstraintName(), @@ -41,55 +52,63 @@ bridged_mock = MOIB.Variable.Free{Float64}(mock) ), ["c"], ) - - @testset "Mock model" begin - var_names = ["xpos", "xneg"] - MOI.set( + var_names = ["xpos", "xneg"] + MOI.set( + mock, + MOI.VariableName(), + MOI.get(mock, MOI.ListOfVariableIndices()), + var_names, + ) + MOI.set( + bridged_mock, + MOI.VariableName(), + MOI.get(bridged_mock, MOI.ListOfVariableIndices()), + ["x"], + ) + MOI.set( + bridged_mock, + MOI.ConstraintName(), + MOI.get( mock, - MOI.VariableName(), - MOI.get(mock, MOI.ListOfVariableIndices()), - var_names, - ) - MOI.set( - bridged_mock, - MOI.ConstraintName(), - MOI.get( - mock, - MOI.ListOfConstraintIndices{ - MOI.VectorOfVariables, - MOI.Nonnegatives, - }(), - ), - ["nonneg"], - ) - s = """ - variables: xpos, xneg - nonneg: [xpos, xneg] in MathOptInterface.Nonnegatives(2) - c: [4.0xpos + -4.0xneg + -1.0, 3.0xpos + -3.0xneg + -1.0] in MathOptInterface.Nonpositives(2) - maxobjective: xpos + -1.0xneg - """ - model = MOIU.Model{Float64}() - MOIU.loadfromstring!(model, s) - MOIU.test_models_equal(mock, model, var_names, ["nonneg", "c"]) - end - @testset "Bridged model" begin - s = """ - variables: x - c: [4.0x + -1.0, 3.0x + -1.0] in MathOptInterface.Nonpositives(2) - maxobjective: 1.0x - """ - model = MOIU.Model{Float64}() - MOIU.loadfromstring!(model, s) - MOIU.test_models_equal(bridged_mock, model, ["x"], ["c"]) - end + MOI.ListOfConstraintIndices{ + MOI.VectorOfVariables, + MOI.Nonnegatives, + }(), + ), + ["nonneg"], + ) + s = """ + variables: xpos, xneg + nonneg: [xpos, xneg] in MathOptInterface.Nonnegatives(2) + c: [4.0xpos + -4.0xneg + -1.0, 3.0xpos + -3.0xneg + -1.0] in MathOptInterface.Nonpositives(2) + maxobjective: xpos + -1.0xneg + """ + model = MOI.Utilities.Model{Float64}() + MOI.Utilities.loadfromstring!(model, s) + MOI.Utilities.test_models_equal(mock, model, var_names, ["nonneg", "c"]) + s = """ + variables: x + c: [4.0x + -1.0, 3.0x + -1.0] in MathOptInterface.Nonpositives(2) + maxobjective: 1.0x + """ + model = MOI.Utilities.Model{Float64}() + MOI.Utilities.loadfromstring!(model, s) + MOI.Utilities.test_models_equal(bridged_mock, model, ["x"], ["c"]) + return end -@testset "Linear6" begin - MOIU.set_mock_optimize!( +function test_linear_LessThan_and_GreaterThan() + mock = MOI.Utilities.MockOptimizer( + MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), + ) + bridged_mock = MOI.Bridges.Variable.Free{Float64}(mock) + MOI.Utilities.set_mock_optimize!( mock, - (mock::MOIU.MockOptimizer) -> MOIU.mock_optimize!(mock, [0, 0, 0, 0]), - (mock::MOIU.MockOptimizer) -> MOIU.mock_optimize!(mock, [100, 0, 0, 0]), - (mock::MOIU.MockOptimizer) -> MOIU.mock_optimize!( + (mock::MOI.Utilities.MockOptimizer) -> + MOI.Utilities.mock_optimize!(mock, [0, 0, 0, 0]), + (mock::MOI.Utilities.MockOptimizer) -> + MOI.Utilities.mock_optimize!(mock, [100, 0, 0, 0]), + (mock::MOI.Utilities.MockOptimizer) -> MOI.Utilities.mock_optimize!( mock, [100, 0, 0, 100], (MOI.ScalarAffineFunction{Float64}, MOI.GreaterThan{Float64}) => @@ -98,7 +117,10 @@ end [-1.0], ), ) - MOIT.linear6test(bridged_mock, config) + MOI.Test.test_linear_LessThan_and_GreaterThan( + bridged_mock, + MOI.Test.Config(), + ) loc = MOI.get(bridged_mock, MOI.ListOfConstraintTypesPresent()) @test length(loc) == 2 @@ -137,28 +159,30 @@ end (MOI.VectorOfVariables, MOI.Nonpositives, 0), ), ) + return end -@testset "Linear7" begin - function set_mock_optimize_linear7Test!(mock) - return MOIU.set_mock_optimize!( +function test_linear_integration_modification() + mock = MOI.Utilities.MockOptimizer( + MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), + ) + bridged_mock = MOI.Bridges.Variable.Free{Float64}(mock) + MOI.Utilities.set_mock_optimize!( + mock, + (mock::MOI.Utilities.MockOptimizer) -> + MOI.Utilities.mock_optimize!(mock, [0, 0, 0, 0]), + (mock::MOI.Utilities.MockOptimizer) -> + MOI.Utilities.mock_optimize!(mock, [100, 0, 0, 0]), + (mock::MOI.Utilities.MockOptimizer) -> MOI.Utilities.mock_optimize!( mock, - (mock::MOIU.MockOptimizer) -> - MOIU.mock_optimize!(mock, [0, 0, 0, 0]), - (mock::MOIU.MockOptimizer) -> - MOIU.mock_optimize!(mock, [100, 0, 0, 0]), - (mock::MOIU.MockOptimizer) -> MOIU.mock_optimize!( - mock, - [100, 0, 0, 100], - (MOI.VectorAffineFunction{Float64}, MOI.Nonnegatives) => - [[1.0]], - (MOI.VectorAffineFunction{Float64}, MOI.Nonpositives) => - [[-1.0]], - ), - ) - end - set_mock_optimize_linear7Test!(mock) - MOIT.linear7test(bridged_mock, config) + [100, 0, 0, 100], + (MOI.VectorAffineFunction{Float64}, MOI.Nonnegatives) => + [[1.0]], + (MOI.VectorAffineFunction{Float64}, MOI.Nonpositives) => + [[-1.0]], + ), + ) + MOI.Test.test_linear_VectorAffineFunction(bridged_mock, MOI.Test.Config()) x, y = MOI.get(bridged_mock, MOI.ListOfVariableIndices()) @@ -177,7 +201,7 @@ end @test MOI.supports( bridged_mock, MOI.VariablePrimalStart(), - typeof(MOIB.bridge(bridged_mock, x)), + typeof(MOI.Bridges.bridge(bridged_mock, x)), ) MOI.set(bridged_mock, MOI.VariablePrimalStart(), [x, y], [1.0, -1.0]) xa, xb, ya, yb = MOI.get(mock, MOI.ListOfVariableIndices()) @@ -185,17 +209,22 @@ end [1.0, 0.0, 0.0, 1.0] @test MOI.get(bridged_mock, MOI.VariablePrimalStart(), x) == 1 @test MOI.get(bridged_mock, MOI.VariablePrimalStart(), y) == -1 + return end -@testset "Linear11" begin - MOIU.set_mock_optimize!( +function test_linear_transform() + mock = MOI.Utilities.MockOptimizer( + MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), + ) + bridged_mock = MOI.Bridges.Variable.Free{Float64}(mock) + MOI.Utilities.set_mock_optimize!( mock, - (mock::MOIU.MockOptimizer) -> - MOIU.mock_optimize!(mock, [1.0, 1.0, 0.0, 0.0]), - (mock::MOIU.MockOptimizer) -> - MOIU.mock_optimize!(mock, [0.5, 0.5, 0.0, 0.0]), + (mock::MOI.Utilities.MockOptimizer) -> + MOI.Utilities.mock_optimize!(mock, [1.0, 1.0, 0.0, 0.0]), + (mock::MOI.Utilities.MockOptimizer) -> + MOI.Utilities.mock_optimize!(mock, [0.5, 0.5, 0.0, 0.0]), ) - MOIT.linear11test(bridged_mock, config) + MOI.Test.test_linear_transform(bridged_mock, MOI.Test.Config()) vis = MOI.get(bridged_mock, MOI.ListOfVariableIndices()) @test vis == MOI.VariableIndex.([-1, -2]) @@ -225,51 +254,56 @@ end ["c2"], ) - @testset "Mock model" begin - var_names = ["v1pos", "v2pos", "v1neg", "v2neg"] - MOI.set( + var_names = ["v1pos", "v2pos", "v1neg", "v2neg"] + MOI.set( + mock, + MOI.VariableName(), + MOI.get(mock, MOI.ListOfVariableIndices()), + var_names, + ) + MOI.set( + bridged_mock, + MOI.ConstraintName(), + MOI.get( mock, - MOI.VariableName(), - MOI.get(mock, MOI.ListOfVariableIndices()), - var_names, - ) - MOI.set( - bridged_mock, - MOI.ConstraintName(), - MOI.get( - mock, - MOI.ListOfConstraintIndices{ - MOI.VectorOfVariables, - MOI.Nonnegatives, - }(), - ), - ["nonneg"], - ) - s = """ - variables: v1pos, v2pos, v1neg, v2neg - nonneg: [v1pos, v2pos, v1neg, v2neg] in MathOptInterface.Nonnegatives(4) - c1: v1pos + -1.0v1neg + v2pos + -1.0v2neg >= 1.0 - c2: v1pos + -1.0v1neg + v2pos + -1.0v2neg <= 2.0 - minobjective: v1pos + -1.0v1neg + v2pos + -1.0v2neg - """ - model = MOIU.Model{Float64}() - MOIU.loadfromstring!(model, s) - MOIU.test_models_equal(mock, model, var_names, ["nonneg", "c1", "c2"]) - end - @testset "Bridged model" begin - var_names = ["v1", "v2"] - MOI.set(bridged_mock, MOI.VariableName(), vis, var_names) - s = """ - variables: v1, v2 - c1: v1 + v2 >= 1.0 - c2: v1 + v2 <= 2.0 - minobjective: v1 + v2 - """ - model = MOIU.Model{Float64}() - MOIU.loadfromstring!(model, s) - MOIU.test_models_equal(bridged_mock, model, var_names, ["c1", "c2"]) - end - + MOI.ListOfConstraintIndices{ + MOI.VectorOfVariables, + MOI.Nonnegatives, + }(), + ), + ["nonneg"], + ) + s = """ + variables: v1pos, v2pos, v1neg, v2neg + nonneg: [v1pos, v2pos, v1neg, v2neg] in MathOptInterface.Nonnegatives(4) + c1: v1pos + -1.0v1neg + v2pos + -1.0v2neg >= 1.0 + c2: v1pos + -1.0v1neg + v2pos + -1.0v2neg <= 2.0 + minobjective: v1pos + -1.0v1neg + v2pos + -1.0v2neg + """ + model = MOI.Utilities.Model{Float64}() + MOI.Utilities.loadfromstring!(model, s) + MOI.Utilities.test_models_equal( + mock, + model, + var_names, + ["nonneg", "c1", "c2"], + ) + var_names = ["v1", "v2"] + MOI.set(bridged_mock, MOI.VariableName(), vis, var_names) + s = """ + variables: v1, v2 + c1: v1 + v2 >= 1.0 + c2: v1 + v2 <= 2.0 + minobjective: v1 + v2 + """ + model = MOI.Utilities.Model{Float64}() + MOI.Utilities.loadfromstring!(model, s) + MOI.Utilities.test_models_equal( + bridged_mock, + model, + var_names, + ["c1", "c2"], + ) _test_delete_bridged_variable( bridged_mock, vis[1], @@ -292,4 +326,9 @@ end (MOI.VectorOfVariables, MOI.Nonpositives, 0), ), ) + return end + +end # module + +TestVariableFree.runtests() diff --git a/test/Bridges/Variable/map.jl b/test/Bridges/Variable/map.jl index e83b827dd4..32a7b66022 100644 --- a/test/Bridges/Variable/map.jl +++ b/test/Bridges/Variable/map.jl @@ -1,95 +1,120 @@ +module TestVariableMap + using Test + using MathOptInterface const MOI = MathOptInterface -const MOIB = MOI.Bridges -struct VariableDummyBridge <: MOIB.Variable.AbstractBridge +function runtests() + for name in names(@__MODULE__; all = true) + if startswith("$(name)", "test_") + @testset "$(name)" begin + getfield(@__MODULE__, name)() + end + end + end + return +end + +struct VariableDummyBridge <: MOI.Bridges.Variable.AbstractBridge id::Int end -function MOIB.Variable.unbridged_map(::VariableDummyBridge, ::MOI.VariableIndex) + +function MOI.Bridges.Variable.unbridged_map( + ::VariableDummyBridge, + ::MOI.VariableIndex, +) return nothing end -map = MOIB.Variable.Map() -@testset "Empty" begin +function test_empty() + map = MOI.Bridges.Variable.Map() @test isempty(map) - @test !MOIB.Variable.has_bridges(map) + @test !MOI.Bridges.Variable.has_bridges(map) @test isempty(keys(map)) + return end -b1 = VariableDummyBridge(1) -set1 = MOI.EqualTo(0.0) -F1 = MOI.SingleVariable -S1 = typeof(set1) -v1, c1 = MOIB.Variable.add_key_for_bridge(map, () -> b1, set1) -cannot_unbridge_err = ErrorException( - "Cannot unbridge function because some variables are bridged by variable" * - " bridges that do not support reverse mapping, e.g., `ZerosBridge`.", -) -@testset "Scalar set" begin +""" + test_map() + +TODO(odow): this test is too intertwined. It should be refactored into something +simpler. +""" +function test_map() + map = MOI.Bridges.Variable.Map() + b1 = VariableDummyBridge(1) + set1 = MOI.EqualTo(0.0) + F1 = MOI.SingleVariable + S1 = typeof(set1) + v1, c1 = MOI.Bridges.Variable.add_key_for_bridge(map, () -> b1, set1) + cannot_unbridge_err = ErrorException( + "Cannot unbridge function because some variables are bridged by variable" * + " bridges that do not support reverse mapping, e.g., `ZerosBridge`.", + ) @test v1.value == c1.value == -1 - @test MOIB.Variable.constraint(map, v1) == c1 + @test MOI.Bridges.Variable.constraint(map, v1) == c1 @test haskey(map, v1) @test map[v1] == b1 - @test MOIB.Variable.constrained_set(map, v1) == S1 - @test MOIB.Variable.number_with_set(map, S1) == 1 - @test MOIB.Variable.constraints_with_set(map, S1) == [c1] - @test MOIB.Variable.function_for(map, c1) == MOI.SingleVariable(v1) - @test_throws cannot_unbridge_err MOIB.Variable.unbridged_function( + @test MOI.Bridges.Variable.constrained_set(map, v1) == S1 + @test MOI.Bridges.Variable.number_with_set(map, S1) == 1 + @test MOI.Bridges.Variable.constraints_with_set(map, S1) == [c1] + @test MOI.Bridges.Variable.function_for(map, c1) == MOI.SingleVariable(v1) + @test_throws cannot_unbridge_err MOI.Bridges.Variable.unbridged_function( map, MOI.VariableIndex(1), ) - @test MOIB.Variable.number_of_variables(map) == 1 - @test MOIB.Variable.list_of_constraint_types(map) == Set([(F1, S1)]) + @test MOI.Bridges.Variable.number_of_variables(map) == 1 + @test MOI.Bridges.Variable.list_of_constraint_types(map) == Set([(F1, S1)]) @test length(map) == 1 @test !isempty(map) - @test MOIB.Variable.has_bridges(map) + @test MOI.Bridges.Variable.has_bridges(map) @test collect(keys(map)) == [v1] @test collect(values(map)) == [b1] -end -b2 = VariableDummyBridge(2) -set2 = MOI.Zeros(4) -F2 = MOI.VectorOfVariables -S2 = typeof(set2) -v2, c2 = MOIB.Variable.add_keys_for_bridge(map, () -> b2, set2) -@testset "Vector set" begin + b2 = VariableDummyBridge(2) + set2 = MOI.Zeros(4) + F2 = MOI.VectorOfVariables + S2 = typeof(set2) + v2, c2 = MOI.Bridges.Variable.add_keys_for_bridge(map, () -> b2, set2) @test v2[1].value == c2.value == -2 - @test MOIB.Variable.has_keys(map, v2) - @test !MOIB.Variable.has_keys(map, v2[4:-1:1]) + @test MOI.Bridges.Variable.has_keys(map, v2) + @test !MOI.Bridges.Variable.has_keys(map, v2[4:-1:1]) for i in 1:4 - @test MOIB.Variable.constraint(map, v2[i]) == c2 + @test MOI.Bridges.Variable.constraint(map, v2[i]) == c2 @test haskey(map, v2[i]) @test map[v2[i]] == b2 - @test MOIB.Variable.constrained_set(map, v2[i]) == S2 - @test MOIB.Variable.length_of_vector_of_variables(map, v2[i]) == 4 - @test MOIB.Variable.index_in_vector_of_variables(map, v2[i]) == - MOIB.IndexInVector(i) + @test MOI.Bridges.Variable.constrained_set(map, v2[i]) == S2 + @test MOI.Bridges.Variable.length_of_vector_of_variables(map, v2[i]) == + 4 + @test MOI.Bridges.Variable.index_in_vector_of_variables(map, v2[i]) == + MOI.Bridges.IndexInVector(i) end - @test MOIB.Variable.number_with_set(map, S2) == 1 - @test MOIB.Variable.constraints_with_set(map, S2) == [c2] - @test MOIB.Variable.function_for(map, c2) == MOI.VectorOfVariables(v2) - @test_throws cannot_unbridge_err MOIB.Variable.unbridged_function( + @test MOI.Bridges.Variable.number_with_set(map, S2) == 1 + @test MOI.Bridges.Variable.constraints_with_set(map, S2) == [c2] + @test MOI.Bridges.Variable.function_for(map, c2) == + MOI.VectorOfVariables(v2) + @test_throws cannot_unbridge_err MOI.Bridges.Variable.unbridged_function( map, MOI.VariableIndex(1), ) - @test MOIB.Variable.number_of_variables(map) == 5 - @test MOIB.Variable.list_of_constraint_types(map) == + @test MOI.Bridges.Variable.number_of_variables(map) == 5 + @test MOI.Bridges.Variable.list_of_constraint_types(map) == Set([(F1, S1), (F2, S2)]) @test length(map) == 2 - @test sprint(MOIB.print_num_bridges, map) == "\nwith 2 variable bridges" + @test sprint(MOI.Bridges.print_num_bridges, map) == + "\nwith 2 variable bridges" @test !isempty(map) - @test MOIB.Variable.has_bridges(map) + @test MOI.Bridges.Variable.has_bridges(map) @test collect(keys(map)) == [v1; v2] @test collect(values(map)) == [b1, b2] -end -b3 = VariableDummyBridge(3) -set3 = MOI.Zeros(0) -v3, c3 = MOIB.Variable.add_keys_for_bridge(map, () -> b3, set3) -@testset "Vector set of length 0" begin + b3 = VariableDummyBridge(3) + set3 = MOI.Zeros(0) + v3, c3 = MOI.Bridges.Variable.add_keys_for_bridge(map, () -> b3, set3) + @test isempty(v3) @test c3.value == 0 bridges = collect(values(map)) @@ -99,27 +124,26 @@ v3, c3 = MOIB.Variable.add_keys_for_bridge(map, () -> b3, set3) @test elements[1].second == b1 @test elements[2].first == v2[1] @test elements[2].second == b2 -end -@testset "Delete" begin delete!(map, v1) - @test MOIB.Variable.number_of_variables(map) == 4 + @test MOI.Bridges.Variable.number_of_variables(map) == 4 @test length(map) == 1 - @test sprint(MOIB.print_num_bridges, map) == "\nwith 1 variable bridge" + @test sprint(MOI.Bridges.print_num_bridges, map) == + "\nwith 1 variable bridge" @test !isempty(map) - @test MOIB.Variable.has_bridges(map) + @test MOI.Bridges.Variable.has_bridges(map) elements = collect(map) @test elements[1].first == v2[1] @test elements[1].second == b2 - @test MOIB.Variable.number_with_set(map, S1) == 0 - @test MOIB.Variable.number_with_set(map, S2) == 1 - @test isempty(MOIB.Variable.constraints_with_set(map, S1)) - @test MOIB.Variable.constraints_with_set(map, S2) == [c2] - @test MOIB.Variable.list_of_constraint_types(map) == Set([(F2, S2)]) + @test MOI.Bridges.Variable.number_with_set(map, S1) == 0 + @test MOI.Bridges.Variable.number_with_set(map, S2) == 1 + @test isempty(MOI.Bridges.Variable.constraints_with_set(map, S1)) + @test MOI.Bridges.Variable.constraints_with_set(map, S2) == [c2] + @test MOI.Bridges.Variable.list_of_constraint_types(map) == Set([(F2, S2)]) @test collect(keys(map)) == v2 @test collect(values(map)) == [b2] @test !haskey(map, v1) - @test MOIB.Variable.has_keys(map, v2) + @test MOI.Bridges.Variable.has_keys(map, v2) rev_v2 = reverse(v2) err = ArgumentError( @@ -129,99 +153,111 @@ end delete!(map, v2[3]) left = [1, 2, 4] - @test MOIB.Variable.number_of_variables(map) == 3 + @test MOI.Bridges.Variable.number_of_variables(map) == 3 @test length(map) == 1 @test !isempty(map) - @test MOIB.Variable.has_bridges(map) + @test MOI.Bridges.Variable.has_bridges(map) elements = collect(map) @test elements[1].first == v2[1] @test elements[1].second == b2 - @test MOIB.Variable.number_with_set(map, S1) == 0 - @test MOIB.Variable.number_with_set(map, S2) == 1 - @test isempty(MOIB.Variable.constraints_with_set(map, S1)) - @test MOIB.Variable.constraints_with_set(map, S2) == [c2] - @test MOIB.Variable.list_of_constraint_types(map) == Set([(F2, S2)]) + @test MOI.Bridges.Variable.number_with_set(map, S1) == 0 + @test MOI.Bridges.Variable.number_with_set(map, S2) == 1 + @test isempty(MOI.Bridges.Variable.constraints_with_set(map, S1)) + @test MOI.Bridges.Variable.constraints_with_set(map, S2) == [c2] + @test MOI.Bridges.Variable.list_of_constraint_types(map) == Set([(F2, S2)]) @test collect(keys(map)) == v2[left] @test collect(values(map)) == [b2] @test !haskey(map, v1) @test !haskey(map, v2[3]) - @test !MOIB.Variable.has_keys(map, v2) - @test MOIB.Variable.has_keys(map, v2[left]) + @test !MOI.Bridges.Variable.has_keys(map, v2) + @test MOI.Bridges.Variable.has_keys(map, v2[left]) for (j, i) in enumerate(left) - @test MOIB.Variable.constraint(map, v2[i]) == c2 + @test MOI.Bridges.Variable.constraint(map, v2[i]) == c2 @test haskey(map, v2[i]) @test map[v2[i]] == b2 - @test MOIB.Variable.constrained_set(map, v2[i]) == S2 - @test MOIB.Variable.length_of_vector_of_variables(map, v2[i]) == 3 - @test MOIB.Variable.index_in_vector_of_variables(map, v2[i]) == - MOIB.IndexInVector(j) + @test MOI.Bridges.Variable.constrained_set(map, v2[i]) == S2 + @test MOI.Bridges.Variable.length_of_vector_of_variables(map, v2[i]) == + 3 + @test MOI.Bridges.Variable.index_in_vector_of_variables(map, v2[i]) == + MOI.Bridges.IndexInVector(j) end - @test MOIB.Variable.function_for(map, c2) == MOI.VectorOfVariables(v2[left]) + @test MOI.Bridges.Variable.function_for(map, c2) == + MOI.VectorOfVariables(v2[left]) delete!(map, v2[1]) left = [2, 4] - @test MOIB.Variable.number_of_variables(map) == 2 + @test MOI.Bridges.Variable.number_of_variables(map) == 2 @test length(map) == 1 @test !isempty(map) - @test MOIB.Variable.has_bridges(map) + @test MOI.Bridges.Variable.has_bridges(map) elements = collect(map) @test elements[1].first == v2[1] @test elements[1].second == b2 - @test MOIB.Variable.number_with_set(map, S1) == 0 - @test MOIB.Variable.number_with_set(map, S2) == 1 - @test isempty(MOIB.Variable.constraints_with_set(map, S1)) - @test MOIB.Variable.constraints_with_set(map, S2) == [c2] - @test MOIB.Variable.list_of_constraint_types(map) == Set([(F2, S2)]) + @test MOI.Bridges.Variable.number_with_set(map, S1) == 0 + @test MOI.Bridges.Variable.number_with_set(map, S2) == 1 + @test isempty(MOI.Bridges.Variable.constraints_with_set(map, S1)) + @test MOI.Bridges.Variable.constraints_with_set(map, S2) == [c2] + @test MOI.Bridges.Variable.list_of_constraint_types(map) == Set([(F2, S2)]) @test collect(keys(map)) == v2[left] @test collect(values(map)) == [b2] @test !haskey(map, v1) @test !haskey(map, v2[1]) @test !haskey(map, v2[3]) - @test !MOIB.Variable.has_keys(map, v2) - @test !MOIB.Variable.has_keys(map, v2[[2, 3, 4]]) - @test !MOIB.Variable.has_keys(map, v2[[1, 2, 4]]) - @test MOIB.Variable.has_keys(map, v2[left]) + @test !MOI.Bridges.Variable.has_keys(map, v2) + @test !MOI.Bridges.Variable.has_keys(map, v2[[2, 3, 4]]) + @test !MOI.Bridges.Variable.has_keys(map, v2[[1, 2, 4]]) + @test MOI.Bridges.Variable.has_keys(map, v2[left]) for (j, i) in enumerate(left) - @test MOIB.Variable.constraint(map, v2[i]) == c2 + @test MOI.Bridges.Variable.constraint(map, v2[i]) == c2 @test haskey(map, v2[i]) @test map[v2[i]] == b2 - @test MOIB.Variable.constrained_set(map, v2[i]) == S2 - @test MOIB.Variable.length_of_vector_of_variables(map, v2[i]) == 2 - @test MOIB.Variable.index_in_vector_of_variables(map, v2[i]) == - MOIB.IndexInVector(j) + @test MOI.Bridges.Variable.constrained_set(map, v2[i]) == S2 + @test MOI.Bridges.Variable.length_of_vector_of_variables(map, v2[i]) == + 2 + @test MOI.Bridges.Variable.index_in_vector_of_variables(map, v2[i]) == + MOI.Bridges.IndexInVector(j) end - @test MOIB.Variable.function_for(map, c2) == MOI.VectorOfVariables(v2[left]) + @test MOI.Bridges.Variable.function_for(map, c2) == + MOI.VectorOfVariables(v2[left]) delete!(map, v2[left]) - @test MOIB.Variable.number_of_variables(map) == 0 + @test MOI.Bridges.Variable.number_of_variables(map) == 0 @test length(map) == 0 @test isempty(map) - @test MOIB.Variable.has_bridges(map) + @test MOI.Bridges.Variable.has_bridges(map) @test isempty(collect(map)) - @test MOIB.Variable.number_with_set(map, S1) == 0 - @test MOIB.Variable.number_with_set(map, S2) == 0 - @test isempty(MOIB.Variable.constraints_with_set(map, S1)) - @test isempty(MOIB.Variable.constraints_with_set(map, S2)) - @test isempty(MOIB.Variable.list_of_constraint_types(map)) + @test MOI.Bridges.Variable.number_with_set(map, S1) == 0 + @test MOI.Bridges.Variable.number_with_set(map, S2) == 0 + @test isempty(MOI.Bridges.Variable.constraints_with_set(map, S1)) + @test isempty(MOI.Bridges.Variable.constraints_with_set(map, S2)) + @test isempty(MOI.Bridges.Variable.list_of_constraint_types(map)) @test isempty(keys(map)) @test isempty(values(map)) @test !haskey(map, v1) - @test !MOIB.Variable.has_keys(map, v2) - @test !MOIB.Variable.has_keys(map, v2[left]) + @test !MOI.Bridges.Variable.has_keys(map, v2) + @test !MOI.Bridges.Variable.has_keys(map, v2[left]) + return end -@testset "EmptyMap" begin - map = MOIB.Variable.EmptyMap() +function test_EmptyMap() + S1 = MOI.EqualTo{Float64} + S2 = MOI.Zeros + map = MOI.Bridges.Variable.EmptyMap() empty!(map) @test isempty(map) @test length(map) == 0 @test isempty(keys(map)) @test isempty(values(map)) - @test !MOIB.Variable.has_bridges(map) - @test iszero(MOIB.Variable.number_of_variables(map)) - @test iszero(MOIB.Variable.number_with_set(map, S1)) - @test iszero(MOIB.Variable.number_with_set(map, S2)) - @test isempty(MOIB.Variable.constraints_with_set(map, S1)) - @test isempty(MOIB.Variable.constraints_with_set(map, S2)) - @test sprint(MOIB.print_num_bridges, map) == "" + @test !MOI.Bridges.Variable.has_bridges(map) + @test iszero(MOI.Bridges.Variable.number_of_variables(map)) + @test iszero(MOI.Bridges.Variable.number_with_set(map, S1)) + @test iszero(MOI.Bridges.Variable.number_with_set(map, S2)) + @test isempty(MOI.Bridges.Variable.constraints_with_set(map, S1)) + @test isempty(MOI.Bridges.Variable.constraints_with_set(map, S2)) + @test sprint(MOI.Bridges.print_num_bridges, map) == "" + return end + +end # module + +TestVariableMap.runtests() diff --git a/test/Bridges/Variable/rsoc_to_psd.jl b/test/Bridges/Variable/rsoc_to_psd.jl index a83e18a5f5..31eb970ef0 100644 --- a/test/Bridges/Variable/rsoc_to_psd.jl +++ b/test/Bridges/Variable/rsoc_to_psd.jl @@ -1,22 +1,28 @@ +module TestVariableRSOCtoPSD + using Test using MathOptInterface const MOI = MathOptInterface -const MOIT = MathOptInterface.DeprecatedTest -const MOIU = MathOptInterface.Utilities -const MOIB = MathOptInterface.Bridges - -include("../utilities.jl") -mock = MOIU.MockOptimizer(MOIU.Model{Float64}()) -config = MOIT.Config() +function runtests() + for name in names(@__MODULE__; all = true) + if startswith("$(name)", "test_") + @testset "$(name)" begin + getfield(@__MODULE__, name)() + end + end + end + return +end -bridged_mock = MOIB.Variable.RSOCtoPSD{Float64}(mock) +include("../utilities.jl") # Can come from a SOC of dimension 2 which makes more sense # FIXME should it be moved to contconic or is RSOC of dimension 2 too exotic ? -@testset "RSOC of dimension 2" begin - MOI.empty!(bridged_mock) +function test_RSOC_of_dimension_2() + mock = MOI.Utilities.MockOptimizer(MOI.Utilities.Model{Float64}()) + bridged_mock = MOI.Bridges.Variable.RSOCtoPSD{Float64}(mock) xy, cxy = MOI.add_constrained_variables( bridged_mock, MOI.RotatedSecondOrderCone(2), @@ -29,10 +35,9 @@ bridged_mock = MOIB.Variable.RSOCtoPSD{Float64}(mock) MOI.set(bridged_mock, MOI.ObjectiveSense(), MOI.MAX_SENSE) MOI.set(bridged_mock, MOI.ObjectiveFunction{typeof(obj)}(), obj) mock.optimize! = - (mock::MOIU.MockOptimizer) -> MOIU.mock_optimize!( + (mock::MOI.Utilities.MockOptimizer) -> MOI.Utilities.mock_optimize!( mock, [0.0, 2.0], - #(MOI.VectorOfVariables) => [0.0, 1.0], (MOI.ScalarAffineFunction{Float64}, MOI.LessThan{Float64}) => [-1.0], ) @@ -44,58 +49,51 @@ bridged_mock = MOIB.Variable.RSOCtoPSD{Float64}(mock) @test MOI.get(bridged_mock, MOI.ConstraintDual(), cxy) == [1.0, 0.0] @test MOI.get(bridged_mock, MOI.ConstraintPrimal(), c) == 1.0 @test MOI.get(bridged_mock, MOI.ConstraintDual(), c) == -1.0 - MOI.set(mock, MOI.ConstraintName(), c, "c") - @testset "Test mock model" begin - var_names = ["a", "b"] - MOI.set( - mock, - MOI.VariableName(), - MOI.get(mock, MOI.ListOfVariableIndices()), - var_names, - ) - nonneg = MOI.get( - mock, - MOI.ListOfConstraintIndices{ - MOI.VectorOfVariables, - MOI.Nonnegatives, - }(), - ) - @test length(nonneg) == 1 - MOI.set(mock, MOI.ConstraintName(), nonneg[1], "cab") - - s = """ - variables: a, b - cab: [a, b] in MathOptInterface.Nonnegatives(2) - c: a + 0.5b <= 1.0 - maxobjective: 0.5b - """ - model = MOIU.Model{Float64}() - MOIU.loadfromstring!(model, s) - MOIU.test_models_equal(mock, model, var_names, ["cab", "c"]) - end - - @testset "Test bridged model" begin - var_names = ["x", "y"] - MOI.set( - bridged_mock, - MOI.VariableName(), - MOI.get(bridged_mock, MOI.ListOfVariableIndices()), - var_names, - ) - MOI.set(bridged_mock, MOI.ConstraintName(), cxy, "cxy") - - s = """ - variables: x, y - cxy: [x, y] in MathOptInterface.RotatedSecondOrderCone(2) - c: x + y <= 1.0 - maxobjective: 1.0y - """ - model = MOIU.Model{Float64}() - MOIU.loadfromstring!(model, s) - MOIU.test_models_equal(bridged_mock, model, var_names, ["cxy", "c"]) - end - + var_names = ["a", "b"] + MOI.set( + mock, + MOI.VariableName(), + MOI.get(mock, MOI.ListOfVariableIndices()), + var_names, + ) + nonneg = MOI.get( + mock, + MOI.ListOfConstraintIndices{MOI.VectorOfVariables,MOI.Nonnegatives}(), + ) + @test length(nonneg) == 1 + MOI.set(mock, MOI.ConstraintName(), nonneg[1], "cab") + s = """ + variables: a, b + cab: [a, b] in MathOptInterface.Nonnegatives(2) + c: a + 0.5b <= 1.0 + maxobjective: 0.5b + """ + model = MOI.Utilities.Model{Float64}() + MOI.Utilities.loadfromstring!(model, s) + MOI.Utilities.test_models_equal(mock, model, var_names, ["cab", "c"]) + var_names = ["x", "y"] + MOI.set( + bridged_mock, + MOI.VariableName(), + MOI.get(bridged_mock, MOI.ListOfVariableIndices()), + var_names, + ) + MOI.set(bridged_mock, MOI.ConstraintName(), cxy, "cxy") + s = """ + variables: x, y + cxy: [x, y] in MathOptInterface.RotatedSecondOrderCone(2) + c: x + y <= 1.0 + maxobjective: 1.0y + """ + model = MOI.Utilities.Model{Float64}() + MOI.Utilities.loadfromstring!(model, s) + MOI.Utilities.test_models_equal( + bridged_mock, + model, + var_names, + ["cxy", "c"], + ) _test_delete_bridged_variables( bridged_mock, xy, @@ -109,11 +107,14 @@ bridged_mock = MOIB.Variable.RSOCtoPSD{Float64}(mock) (MOI.ScalarAffineFunction{Float64}, MOI.LessThan{Float64}, 1), ), ) + return end -@testset "RSOC4" begin +function test_RSOC4() + mock = MOI.Utilities.MockOptimizer(MOI.Utilities.Model{Float64}()) + bridged_mock = MOI.Bridges.Variable.RSOCtoPSD{Float64}(mock) mock.optimize! = - (mock::MOIU.MockOptimizer) -> MOIU.mock_optimize!( + (mock::MOI.Utilities.MockOptimizer) -> MOI.Utilities.mock_optimize!( mock, [1.0, 1.0, 2.0, 1.0, 0.0, 2.0], (MOI.ScalarAffineFunction{Float64}, MOI.EqualTo{Float64}) => @@ -125,138 +126,137 @@ end [[1.0, -0.5, 0.25, -0.5, 0.25, 0.25]], ) mock.eval_variable_constraint_dual = false - MOIT.rotatedsoc4test(bridged_mock, config) + MOI.Test.test_conic_RotatedSecondOrderCone_out_of_order( + bridged_mock, + MOI.Test.Config(), + ) mock.eval_variable_constraint_dual = true + var_names = ["Q$i$j" for j in 1:3 for i in 1:j] + MOI.set( + mock, + MOI.VariableName(), + MOI.get(mock, MOI.ListOfVariableIndices()), + var_names, + ) + psd = MOI.get( + mock, + MOI.ListOfConstraintIndices{ + MOI.VectorOfVariables, + MOI.PositiveSemidefiniteConeTriangle, + }(), + ) + @test length(psd) == 1 + MOI.set(mock, MOI.ConstraintName(), psd[1], "psd") + off_diag = MOI.get( + mock, + MOI.ListOfConstraintIndices{MOI.SingleVariable,MOI.EqualTo{Float64}}(), + ) + @test length(off_diag) == 1 + diag = MOI.get( + mock, + MOI.ListOfConstraintIndices{ + MOI.ScalarAffineFunction{Float64}, + MOI.EqualTo{Float64}, + }(), + ) + @test length(diag) == 1 + MOI.set(mock, MOI.ConstraintName(), diag[1], "diag33") + c = MOI.get( + mock, + MOI.ListOfConstraintIndices{ + MOI.ScalarAffineFunction{Float64}, + MOI.LessThan{Float64}, + }(), + ) + @test length(c) == 1 + MOI.set(mock, MOI.ConstraintName(), c[1], "c") - @testset "Test mock model" begin - var_names = ["Q$i$j" for j in 1:3 for i in 1:j] - MOI.set( - mock, - MOI.VariableName(), - MOI.get(mock, MOI.ListOfVariableIndices()), - var_names, - ) - psd = MOI.get( - mock, - MOI.ListOfConstraintIndices{ - MOI.VectorOfVariables, - MOI.PositiveSemidefiniteConeTriangle, - }(), - ) - @test length(psd) == 1 - MOI.set(mock, MOI.ConstraintName(), psd[1], "psd") - off_diag = MOI.get( - mock, - MOI.ListOfConstraintIndices{ - MOI.SingleVariable, - MOI.EqualTo{Float64}, - }(), - ) - @test length(off_diag) == 1 - diag = MOI.get( - mock, - MOI.ListOfConstraintIndices{ - MOI.ScalarAffineFunction{Float64}, - MOI.EqualTo{Float64}, - }(), - ) - @test length(diag) == 1 - MOI.set(mock, MOI.ConstraintName(), diag[1], "diag33") - c = MOI.get( - mock, - MOI.ListOfConstraintIndices{ - MOI.ScalarAffineFunction{Float64}, - MOI.LessThan{Float64}, - }(), - ) - @test length(c) == 1 - MOI.set(mock, MOI.ConstraintName(), c[1], "c") + s = """ + variables: Q11, Q12, Q13, Q22, Q23, Q33 + psd: [Q11, Q12, Q22, Q13, Q23, Q33] in MathOptInterface.PositiveSemidefiniteConeTriangle(3) + Q23 == 0.0 + diag33: Q22 + -1.0Q33 == 0.0 + c: Q11 + 0.5Q22 <= 2.0 + maxobjective: Q12 + Q13 + """ + model = MOI.Utilities.Model{Float64}() + MOI.Utilities.loadfromstring!(model, s) + MOI.Utilities.test_models_equal( + mock, + model, + var_names, + ["psd", "diag33", "c"], + [("Q23", MOI.EqualTo{Float64}(0.0))], + ) - s = """ - variables: Q11, Q12, Q13, Q22, Q23, Q33 - psd: [Q11, Q12, Q22, Q13, Q23, Q33] in MathOptInterface.PositiveSemidefiniteConeTriangle(3) - Q23 == 0.0 - diag33: Q22 + -1.0Q33 == 0.0 - c: Q11 + 0.5Q22 <= 2.0 - maxobjective: Q12 + Q13 - """ - model = MOIU.Model{Float64}() - MOIU.loadfromstring!(model, s) - MOIU.test_models_equal( - mock, - model, - var_names, - ["psd", "diag33", "c"], - [("Q23", MOI.EqualTo{Float64}(0.0))], - ) - end + var_names = ["t", "u", "x", "y"] + MOI.set( + bridged_mock, + MOI.VariableName(), + MOI.get(bridged_mock, MOI.ListOfVariableIndices()), + var_names, + ) + rsoc = MOI.get( + bridged_mock, + MOI.ListOfConstraintIndices{ + MOI.VectorOfVariables, + MOI.RotatedSecondOrderCone, + }(), + ) + @test length(rsoc) == 1 + MOI.set(bridged_mock, MOI.ConstraintName(), rsoc[1], "rsoc") + c = MOI.get( + bridged_mock, + MOI.ListOfConstraintIndices{ + MOI.ScalarAffineFunction{Float64}, + MOI.LessThan{Float64}, + }(), + ) + @test length(c) == 1 + MOI.set(bridged_mock, MOI.ConstraintName(), c[1], "c") - @testset "Test bridged model" begin - var_names = ["t", "u", "x", "y"] - MOI.set( - bridged_mock, - MOI.VariableName(), - MOI.get(bridged_mock, MOI.ListOfVariableIndices()), - var_names, - ) - rsoc = MOI.get( - bridged_mock, - MOI.ListOfConstraintIndices{ - MOI.VectorOfVariables, - MOI.RotatedSecondOrderCone, - }(), - ) - @test length(rsoc) == 1 - MOI.set(bridged_mock, MOI.ConstraintName(), rsoc[1], "rsoc") - c = MOI.get( - bridged_mock, - MOI.ListOfConstraintIndices{ - MOI.ScalarAffineFunction{Float64}, - MOI.LessThan{Float64}, - }(), - ) - @test length(c) == 1 - MOI.set(bridged_mock, MOI.ConstraintName(), c[1], "c") + s = """ + variables: t, u, x, y + rsoc: [t, u, x, y] in MathOptInterface.RotatedSecondOrderCone(4) + c: t + u <= 2.0 + maxobjective: x + y + """ + model = MOI.Utilities.Model{Float64}() + MOI.Utilities.loadfromstring!(model, s) + MOI.Utilities.test_models_equal( + bridged_mock, + model, + var_names, + ["rsoc", "c"], + ) - s = """ - variables: t, u, x, y - rsoc: [t, u, x, y] in MathOptInterface.RotatedSecondOrderCone(4) - c: t + u <= 2.0 - maxobjective: x + y - """ - model = MOIU.Model{Float64}() - MOIU.loadfromstring!(model, s) - MOIU.test_models_equal(bridged_mock, model, var_names, ["rsoc", "c"]) + v = MOI.get(bridged_mock, MOI.ListOfVariableIndices()) + @test length(v) == 4 + + message = string( + "Cannot delete variable as it is constrained with other", + " variables in a `MOI.VectorOfVariables`.", + ) + for i in 1:4 + err = MOI.DeleteNotAllowed(v[i], message) + @test_throws err MOI.delete(bridged_mock, v[i]) end - @testset "Delete" begin - v = MOI.get(bridged_mock, MOI.ListOfVariableIndices()) - @test length(v) == 4 + _test_delete_bridged_variables( + bridged_mock, + v, + MOI.RotatedSecondOrderCone, + 4, + ( + (MOI.VectorOfVariables, MOI.Nonnegatives, 0), + (MOI.VectorOfVariables, MOI.PositiveSemidefiniteConeTriangle, 0), + (MOI.SingleVariable, MOI.EqualTo{Float64}, 0), + (MOI.ScalarAffineFunction{Float64}, MOI.EqualTo{Float64}, 0), + ), + ) + return +end - message = string( - "Cannot delete variable as it is constrained with other", - " variables in a `MOI.VectorOfVariables`.", - ) - for i in 1:4 - err = MOI.DeleteNotAllowed(v[i], message) - @test_throws err MOI.delete(bridged_mock, v[i]) - end +end # module - _test_delete_bridged_variables( - bridged_mock, - v, - MOI.RotatedSecondOrderCone, - 4, - ( - (MOI.VectorOfVariables, MOI.Nonnegatives, 0), - ( - MOI.VectorOfVariables, - MOI.PositiveSemidefiniteConeTriangle, - 0, - ), - (MOI.SingleVariable, MOI.EqualTo{Float64}, 0), - (MOI.ScalarAffineFunction{Float64}, MOI.EqualTo{Float64}, 0), - ), - ) - end -end +TestVariableRSOCtoPSD.runtests() diff --git a/test/Bridges/Variable/rsoc_to_soc.jl b/test/Bridges/Variable/rsoc_to_soc.jl index 0baf0b5de7..2cc5ee97ec 100644 --- a/test/Bridges/Variable/rsoc_to_soc.jl +++ b/test/Bridges/Variable/rsoc_to_soc.jl @@ -1,27 +1,37 @@ +module TestVariableRSOCtoSOC + using Test using MathOptInterface const MOI = MathOptInterface -const MOIT = MathOptInterface.DeprecatedTest -const MOIU = MathOptInterface.Utilities -const MOIB = MathOptInterface.Bridges - -include("../utilities.jl") -mock = MOIU.MockOptimizer(MOIU.Model{Float64}()) -config = MOIT.Config() +function runtests() + for name in names(@__MODULE__; all = true) + if startswith("$(name)", "test_") + @testset "$(name)" begin + getfield(@__MODULE__, name)() + end + end + end + return +end -bridged_mock = MOIB.Variable.RSOCtoSOC{Float64}(mock) +include("../utilities.jl") -@testset "rotatedsoc4" begin +function test_rotatedsoc4() + mock = MOI.Utilities.MockOptimizer(MOI.Utilities.Model{Float64}()) + bridged_mock = MOI.Bridges.Variable.RSOCtoSOC{Float64}(mock) mock.optimize! = - (mock::MOIU.MockOptimizer) -> MOIU.mock_optimize!( + (mock::MOI.Utilities.MockOptimizer) -> MOI.Utilities.mock_optimize!( mock, [√2, 0.0, 1.0, 1.0], (MOI.ScalarAffineFunction{Float64}, MOI.LessThan{Float64}) => [-1.0], ) - MOIT.rotatedsoc4test(bridged_mock, config) + MOI.Test.test_conic_RotatedSecondOrderCone_out_of_order( + bridged_mock, + MOI.Test.Config(), + ) ceqs = MOI.get( mock, @@ -33,83 +43,83 @@ bridged_mock = MOIB.Variable.RSOCtoSOC{Float64}(mock) @test length(ceqs) == 1 MOI.set(bridged_mock, MOI.ConstraintName(), ceqs[1], "c") - @testset "Test mock model" begin - var_names = ["a", "b", "c", "d"] - MOI.set( - mock, - MOI.VariableName(), - MOI.get(mock, MOI.ListOfVariableIndices()), - var_names, - ) - socs = MOI.get( - mock, - MOI.ListOfConstraintIndices{ - MOI.VectorOfVariables, - MOI.SecondOrderCone, - }(), - ) - @test length(socs) == 1 - MOI.set(mock, MOI.ConstraintName(), socs[1], "soc") + var_names = ["a", "b", "c", "d"] + MOI.set( + mock, + MOI.VariableName(), + MOI.get(mock, MOI.ListOfVariableIndices()), + var_names, + ) + socs = MOI.get( + mock, + MOI.ListOfConstraintIndices{MOI.VectorOfVariables,MOI.SecondOrderCone}(), + ) + @test length(socs) == 1 + MOI.set(mock, MOI.ConstraintName(), socs[1], "soc") - s2 = √2 - s = """ - variables: a, b, c, d - soc: [a, b, c, d] in MathOptInterface.SecondOrderCone(4) - c: $s2*a <= 2.0 - maxobjective: c + d - """ - model = MOIU.Model{Float64}() - MOIU.loadfromstring!(model, s) - MOIU.test_models_equal(mock, model, var_names, ["soc", "c"]) - end + s2 = √2 + s = """ + variables: a, b, c, d + soc: [a, b, c, d] in MathOptInterface.SecondOrderCone(4) + c: $s2*a <= 2.0 + maxobjective: c + d + """ + model = MOI.Utilities.Model{Float64}() + MOI.Utilities.loadfromstring!(model, s) + MOI.Utilities.test_models_equal(mock, model, var_names, ["soc", "c"]) + var_names = ["t", "u", "x", "y"] + MOI.set( + bridged_mock, + MOI.VariableName(), + MOI.get(bridged_mock, MOI.ListOfVariableIndices()), + var_names, + ) + rsocs = MOI.get( + bridged_mock, + MOI.ListOfConstraintIndices{ + MOI.VectorOfVariables, + MOI.RotatedSecondOrderCone, + }(), + ) + @test length(rsocs) == 1 + MOI.set(bridged_mock, MOI.ConstraintName(), rsocs[1], "rsoc") - @testset "Test bridged model" begin - var_names = ["t", "u", "x", "y"] - MOI.set( - bridged_mock, - MOI.VariableName(), - MOI.get(bridged_mock, MOI.ListOfVariableIndices()), - var_names, - ) - rsocs = MOI.get( - bridged_mock, - MOI.ListOfConstraintIndices{ - MOI.VectorOfVariables, - MOI.RotatedSecondOrderCone, - }(), - ) - @test length(rsocs) == 1 - MOI.set(bridged_mock, MOI.ConstraintName(), rsocs[1], "rsoc") + s = """ + variables: t, u, x, y + rsoc: [t, u, x, y] in MathOptInterface.RotatedSecondOrderCone(4) + c: t + u <= 2.0 + maxobjective: x + y + """ + model = MOI.Utilities.Model{Float64}() + MOI.Utilities.loadfromstring!(model, s) + MOI.Utilities.test_models_equal( + bridged_mock, + model, + var_names, + ["rsoc", "c"], + ) - s = """ - variables: t, u, x, y - rsoc: [t, u, x, y] in MathOptInterface.RotatedSecondOrderCone(4) - c: t + u <= 2.0 - maxobjective: x + y - """ - model = MOIU.Model{Float64}() - MOIU.loadfromstring!(model, s) - MOIU.test_models_equal(bridged_mock, model, var_names, ["rsoc", "c"]) + tuxy = MOI.get(bridged_mock, MOI.ListOfVariableIndices()) + + message = string( + "Cannot delete variable as it is constrained with other", + " variables in a `MOI.VectorOfVariables`.", + ) + for i in eachindex(tuxy) + err = MOI.DeleteNotAllowed(tuxy[i], message) + @test_throws err MOI.delete(bridged_mock, tuxy[i]) end - @testset "Delete" begin - tuxy = MOI.get(bridged_mock, MOI.ListOfVariableIndices()) + _test_delete_bridged_variables( + bridged_mock, + tuxy, + MOI.RotatedSecondOrderCone, + 4, + ((MOI.VectorOfVariables, MOI.SecondOrderCone, 0),), + ) + return +end - message = string( - "Cannot delete variable as it is constrained with other", - " variables in a `MOI.VectorOfVariables`.", - ) - for i in eachindex(tuxy) - err = MOI.DeleteNotAllowed(tuxy[i], message) - @test_throws err MOI.delete(bridged_mock, tuxy[i]) - end +end # module - _test_delete_bridged_variables( - bridged_mock, - tuxy, - MOI.RotatedSecondOrderCone, - 4, - ((MOI.VectorOfVariables, MOI.SecondOrderCone, 0),), - ) - end -end +TestVariableRSOCtoSOC.runtests() diff --git a/test/Bridges/Variable/soc_to_rsoc.jl b/test/Bridges/Variable/soc_to_rsoc.jl index 248929a97e..2c2eb61721 100644 --- a/test/Bridges/Variable/soc_to_rsoc.jl +++ b/test/Bridges/Variable/soc_to_rsoc.jl @@ -1,27 +1,36 @@ +module TestVariableSOCtoRSOC + using Test using MathOptInterface const MOI = MathOptInterface -const MOIT = MathOptInterface.DeprecatedTest -const MOIU = MathOptInterface.Utilities -const MOIB = MathOptInterface.Bridges - -include("../utilities.jl") -mock = MOIU.MockOptimizer(MOIU.Model{Float64}()) -config = MOIT.Config() +function runtests() + for name in names(@__MODULE__; all = true) + if startswith("$(name)", "test_") + @testset "$(name)" begin + getfield(@__MODULE__, name)() + end + end + end + return +end -bridged_mock = MOIB.Variable.SOCtoRSOC{Float64}(mock) +include("../utilities.jl") -@testset "soc1v" begin +function test_soc1v() + mock = MOI.Utilities.MockOptimizer(MOI.Utilities.Model{Float64}()) + bridged_mock = MOI.Bridges.Variable.SOCtoRSOC{Float64}(mock) mock.optimize! = - (mock::MOIU.MockOptimizer) -> MOIU.mock_optimize!( + (mock::MOI.Utilities.MockOptimizer) -> MOI.Utilities.mock_optimize!( mock, [1 / √2 + 1 / 2, 1 / √2 - 1 / 2, 1 / √2], (MOI.VectorAffineFunction{Float64}, MOI.Zeros) => [[-√2]], ) - MOIT.soc1vtest(bridged_mock, config) - + MOI.Test.test_conic_SecondOrderCone_VectorOfVariables( + bridged_mock, + MOI.Test.Config(), + ) ceqs = MOI.get( mock, MOI.ListOfConstraintIndices{ @@ -32,83 +41,82 @@ bridged_mock = MOIB.Variable.SOCtoRSOC{Float64}(mock) @test length(ceqs) == 1 MOI.set(bridged_mock, MOI.ConstraintName(), ceqs[1], "ceq") - @testset "Test mock model" begin - var_names = ["a", "b", "c"] - MOI.set( - mock, - MOI.VariableName(), - MOI.get(mock, MOI.ListOfVariableIndices()), - var_names, - ) - rsocs = MOI.get( - mock, - MOI.ListOfConstraintIndices{ - MOI.VectorOfVariables, - MOI.RotatedSecondOrderCone, - }(), - ) - @test length(rsocs) == 1 - MOI.set(mock, MOI.ConstraintName(), rsocs[1], "rsoc") + var_names = ["a", "b", "c"] + MOI.set( + mock, + MOI.VariableName(), + MOI.get(mock, MOI.ListOfVariableIndices()), + var_names, + ) + rsocs = MOI.get( + mock, + MOI.ListOfConstraintIndices{ + MOI.VectorOfVariables, + MOI.RotatedSecondOrderCone, + }(), + ) + @test length(rsocs) == 1 + MOI.set(mock, MOI.ConstraintName(), rsocs[1], "rsoc") - invs2 = 1 / √2 - s = """ - variables: a, b, c - rsoc: [a, b, c] in MathOptInterface.RotatedSecondOrderCone(3) - ceq: [$invs2*a + $invs2*b + -1.0] in MathOptInterface.Zeros(1) - maxobjective: $invs2*a + -$invs2*b + c - """ - model = MOIU.Model{Float64}() - MOIU.loadfromstring!(model, s) - MOIU.test_models_equal(mock, model, var_names, ["rsoc", "ceq"]) - end + invs2 = 1 / √2 + s = """ + variables: a, b, c + rsoc: [a, b, c] in MathOptInterface.RotatedSecondOrderCone(3) + ceq: [$invs2*a + $invs2*b + -1.0] in MathOptInterface.Zeros(1) + maxobjective: $invs2*a + -$invs2*b + c + """ + model = MOI.Utilities.Model{Float64}() + MOI.Utilities.loadfromstring!(model, s) + MOI.Utilities.test_models_equal(mock, model, var_names, ["rsoc", "ceq"]) + var_names = ["x", "y", "z"] + MOI.set( + bridged_mock, + MOI.VariableName(), + MOI.get(bridged_mock, MOI.ListOfVariableIndices()), + var_names, + ) + socs = MOI.get( + bridged_mock, + MOI.ListOfConstraintIndices{MOI.VectorOfVariables,MOI.SecondOrderCone}(), + ) + @test length(socs) == 1 + MOI.set(bridged_mock, MOI.ConstraintName(), socs[1], "soc") - @testset "Test bridged model" begin - var_names = ["x", "y", "z"] - MOI.set( - bridged_mock, - MOI.VariableName(), - MOI.get(bridged_mock, MOI.ListOfVariableIndices()), - var_names, - ) - socs = MOI.get( - bridged_mock, - MOI.ListOfConstraintIndices{ - MOI.VectorOfVariables, - MOI.SecondOrderCone, - }(), - ) - @test length(socs) == 1 - MOI.set(bridged_mock, MOI.ConstraintName(), socs[1], "soc") + s = """ + variables: x, y, z + soc: [x, y, z] in MathOptInterface.SecondOrderCone(3) + ceq: [x + -1.0] in MathOptInterface.Zeros(1) + maxobjective: y + z + """ + model = MOI.Utilities.Model{Float64}() + MOI.Utilities.loadfromstring!(model, s) + MOI.Utilities.test_models_equal( + bridged_mock, + model, + var_names, + ["soc", "ceq"], + ) + xyz = MOI.get(bridged_mock, MOI.ListOfVariableIndices()) - s = """ - variables: x, y, z - soc: [x, y, z] in MathOptInterface.SecondOrderCone(3) - ceq: [x + -1.0] in MathOptInterface.Zeros(1) - maxobjective: y + z - """ - model = MOIU.Model{Float64}() - MOIU.loadfromstring!(model, s) - MOIU.test_models_equal(bridged_mock, model, var_names, ["soc", "ceq"]) + message = string( + "Cannot delete variable as it is constrained with other", + " variables in a `MOI.VectorOfVariables`.", + ) + for i in eachindex(xyz) + err = MOI.DeleteNotAllowed(xyz[i], message) + @test_throws err MOI.delete(bridged_mock, xyz[i]) end - @testset "Delete" begin - xyz = MOI.get(bridged_mock, MOI.ListOfVariableIndices()) + _test_delete_bridged_variables( + bridged_mock, + xyz, + MOI.SecondOrderCone, + 3, + ((MOI.VectorOfVariables, MOI.RotatedSecondOrderCone, 0),), + ) + return +end - message = string( - "Cannot delete variable as it is constrained with other", - " variables in a `MOI.VectorOfVariables`.", - ) - for i in eachindex(xyz) - err = MOI.DeleteNotAllowed(xyz[i], message) - @test_throws err MOI.delete(bridged_mock, xyz[i]) - end +end # module - _test_delete_bridged_variables( - bridged_mock, - xyz, - MOI.SecondOrderCone, - 3, - ((MOI.VectorOfVariables, MOI.RotatedSecondOrderCone, 0),), - ) - end -end +TestVariableSOCtoRSOC.runtests() diff --git a/test/Bridges/Variable/vectorize.jl b/test/Bridges/Variable/vectorize.jl index d803f6c6ef..1e58e1e84a 100644 --- a/test/Bridges/Variable/vectorize.jl +++ b/test/Bridges/Variable/vectorize.jl @@ -1,19 +1,28 @@ +module TestVariableVectorize + using Test using MathOptInterface const MOI = MathOptInterface -const MOIT = MathOptInterface.DeprecatedTest -const MOIU = MathOptInterface.Utilities -const MOIB = MathOptInterface.Bridges - -include("../utilities.jl") -mock = MOIU.MockOptimizer(MOIU.UniversalFallback(MOIU.Model{Float64}())) -config = MOIT.Config() +function runtests() + for name in names(@__MODULE__; all = true) + if startswith("$(name)", "test_") + @testset "$(name)" begin + getfield(@__MODULE__, name)() + end + end + end + return +end -bridged_mock = MOIB.Variable.Vectorize{Float64}(mock) +include("../utilities.jl") -@testset "get scalar constraint" begin +function test_get_scalar_constraint() + mock = MOI.Utilities.MockOptimizer( + MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), + ) + bridged_mock = MOI.Bridges.Variable.Vectorize{Float64}(mock) x, cx = MOI.add_constrained_variable(bridged_mock, MOI.GreaterThan(1.0)) fx = MOI.SingleVariable(x) func = 2.0 * fx @@ -51,9 +60,9 @@ bridged_mock = MOIB.Variable.Vectorize{Float64}(mock) cy: [y] in MathOptInterface.Nonnegatives(1) c: 2.0y >= 3.0 """ - model = MOIU.Model{Float64}() - MOIU.loadfromstring!(model, s) - MOIU.test_models_equal(mock, model, ["y"], ["cy", "c"]) + model = MOI.Utilities.Model{Float64}() + MOI.Utilities.loadfromstring!(model, s) + MOI.Utilities.test_models_equal(mock, model, ["y"], ["cy", "c"]) end @testset "Bridged model" begin MOI.set(bridged_mock, MOI.VariableName(), x, "x") @@ -62,9 +71,9 @@ bridged_mock = MOIB.Variable.Vectorize{Float64}(mock) x >= 1.0 c: 2.0x >= 5.0 """ - model = MOIU.Model{Float64}() - MOIU.loadfromstring!(model, s) - MOIU.test_models_equal( + model = MOI.Utilities.Model{Float64}() + MOI.Utilities.loadfromstring!(model, s) + MOI.Utilities.test_models_equal( bridged_mock, model, ["x"], @@ -74,9 +83,13 @@ bridged_mock = MOIB.Variable.Vectorize{Float64}(mock) end end -@testset "exp3 with add_constrained_variable for `y`" begin +function test_exp3_with_add_constrained_variable_y() + mock = MOI.Utilities.MockOptimizer( + MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), + ) + bridged_mock = MOI.Bridges.Variable.Vectorize{Float64}(mock) mock.optimize! = - (mock::MOIU.MockOptimizer) -> MOIU.mock_optimize!( + (mock::MOI.Utilities.MockOptimizer) -> MOI.Utilities.mock_optimize!( mock, [log(5), 0.0], (MOI.ScalarAffineFunction{Float64}, MOI.LessThan{Float64}) => @@ -98,7 +111,7 @@ end fy = MOI.SingleVariable(y) ec = MOI.add_constraint( bridged_mock, - MOIU.operate(vcat, Float64, fx, 1.0, fy), + MOI.Utilities.operate(vcat, Float64, fx, 1.0, fy), MOI.ExponentialCone(), ) @@ -132,95 +145,82 @@ end ) @test length(cis) == 1 - @testset "get `UnknownVariableAttribute``" begin - err = ArgumentError( - "Variable bridge of type `$(MathOptInterface.Bridges.Variable.VectorizeBridge{Float64,MathOptInterface.Nonpositives})`" * - " does not support accessing the attribute `MathOptInterface.DeprecatedTest.UnknownVariableAttribute()`.", - ) - @test_throws err MOI.get( - bridged_mock, - MOIT.UnknownVariableAttribute(), - y, - ) - end - - @testset "set `ConstraintSet`" begin - ci = MOI.ConstraintIndex{MOI.SingleVariable,MOI.LessThan{Float64}}( - y.value, - ) - attr = MOI.ConstraintSet() - err = MOI.SetAttributeNotAllowed( - attr, - "The variable `MathOptInterface.VariableIndex(12345676)` is bridged by the `VectorizeBridge`.", - ) - @test_throws err MOI.set(bridged_mock, attr, ci, MOI.LessThan(4.0)) - end - - @testset "MultirowChange" begin - change = MOI.MultirowChange(y, [(3, 0.0)]) - message = - "The change $change" * - " contains variables bridged into a function with nonzero constant." - err = MOI.ModifyConstraintNotAllowed(cis[1], change, message) - @test_throws err MOI.modify(bridged_mock, cis[1], change) - end - - @testset "ScalarCoefficientChange" begin - change = MOI.ScalarCoefficientChange(y, 0.0) - attr = MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}() - message = - "The change MathOptInterface.ScalarCoefficientChange{Float64}(MathOptInterface.VariableIndex(-1), 0.0)" * - " contains variables bridged into a function with nonzero constant." - err = MOI.ModifyObjectiveNotAllowed(change, message) - @test_throws err MOI.modify(bridged_mock, attr, change) - end + err = ArgumentError( + "Variable bridge of type `$(MathOptInterface.Bridges.Variable.VectorizeBridge{Float64,MathOptInterface.Nonpositives})`" * + " does not support accessing the attribute `MathOptInterface.Test.UnknownVariableAttribute()`.", + ) + @test_throws err MOI.get( + bridged_mock, + MOI.Test.UnknownVariableAttribute(), + y, + ) + ci = MOI.ConstraintIndex{MOI.SingleVariable,MOI.LessThan{Float64}}(y.value) + attr = MOI.ConstraintSet() + err = MOI.SetAttributeNotAllowed( + attr, + "The variable `MathOptInterface.VariableIndex(12345676)` is bridged by the `VectorizeBridge`.", + ) + @test_throws err MOI.set(bridged_mock, attr, ci, MOI.LessThan(4.0)) + + change = MOI.MultirowChange(y, [(3, 0.0)]) + message = + "The change $change" * + " contains variables bridged into a function with nonzero constant." + err = MOI.ModifyConstraintNotAllowed(cis[1], change, message) + @test_throws err MOI.modify(bridged_mock, cis[1], change) + + change = MOI.ScalarCoefficientChange(y, 0.0) + attr = MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}() + message = + "The change MathOptInterface.ScalarCoefficientChange{Float64}(MathOptInterface.VariableIndex(-1), 0.0)" * + " contains variables bridged into a function with nonzero constant." + err = MOI.ModifyObjectiveNotAllowed(change, message) + @test_throws err MOI.modify(bridged_mock, attr, change) MOI.set(bridged_mock, MOI.VariableName(), x, "x") MOI.set(bridged_mock, MOI.ConstraintName(), xc, "xc") MOI.set(bridged_mock, MOI.ConstraintName(), ec, "ec") z = MOI.get(mock, MOI.ListOfVariableIndices())[2] - @testset "Mock model" begin - MOI.set(mock, MOI.VariableName(), z, "z") - MOI.set( + + MOI.set(mock, MOI.VariableName(), z, "z") + MOI.set( + mock, + MOI.ConstraintName(), + MOI.get( mock, - MOI.ConstraintName(), - MOI.get( - mock, - MOI.ListOfConstraintIndices{ - MOI.VectorOfVariables, - MOI.Nonpositives, - }(), - ), - ["zc"], - ) - s = """ - variables: x, z - zc: [z] in MathOptInterface.Nonpositives(1) - xc: 2.0x <= 4.0 - ec: [x, 1.0, z + 5.0] in MathOptInterface.ExponentialCone() - """ - model = MOIU.Model{Float64}() - MOIU.loadfromstring!(model, s) - MOIU.test_models_equal(mock, model, ["x", "z"], ["zc", "xc", "ec"]) - end - @testset "Bridged model" begin - MOI.set(bridged_mock, MOI.VariableName(), y, "y") - s = """ - variables: x, y - y <= 5.0 - xc: 2.0x <= 4.0 - ec: [x, 1.0, y] in MathOptInterface.ExponentialCone() - """ - model = MOIU.Model{Float64}() - MOIU.loadfromstring!(model, s) - MOIU.test_models_equal( - bridged_mock, - model, - ["x", "y"], - ["xc", "ec"], - [("y", MOI.LessThan{Float64}(5.0))], - ) - end + MOI.ListOfConstraintIndices{ + MOI.VectorOfVariables, + MOI.Nonpositives, + }(), + ), + ["zc"], + ) + s = """ + variables: x, z + zc: [z] in MathOptInterface.Nonpositives(1) + xc: 2.0x <= 4.0 + ec: [x, 1.0, z + 5.0] in MathOptInterface.ExponentialCone() + """ + model = MOI.Utilities.Model{Float64}() + MOI.Utilities.loadfromstring!(model, s) + MOI.Utilities.test_models_equal(mock, model, ["x", "z"], ["zc", "xc", "ec"]) + + MOI.set(bridged_mock, MOI.VariableName(), y, "y") + s = """ + variables: x, y + y <= 5.0 + xc: 2.0x <= 4.0 + ec: [x, 1.0, y] in MathOptInterface.ExponentialCone() + """ + model = MOI.Utilities.Model{Float64}() + MOI.Utilities.loadfromstring!(model, s) + MOI.Utilities.test_models_equal( + bridged_mock, + model, + ["x", "y"], + ["xc", "ec"], + [("y", MOI.LessThan{Float64}(5.0))], + ) @test MOI.supports( bridged_mock, @@ -230,7 +230,7 @@ end @test MOI.supports( bridged_mock, MOI.VariablePrimalStart(), - typeof(MOIB.bridge(bridged_mock, y)), + typeof(MOI.Bridges.bridge(bridged_mock, y)), ) MOI.set(bridged_mock, MOI.VariablePrimalStart(), y, 1.0) @test MOI.get(mock, MOI.VariablePrimalStart(), z) == -4 @@ -243,4 +243,9 @@ end 2, ((MOI.VectorOfVariables, MOI.Nonpositives, 0),), ) + return end + +end # module + +TestVariableVectorize.runtests() diff --git a/test/Bridges/Variable/zeros.jl b/test/Bridges/Variable/zeros.jl index b6049968b2..aea370b8ae 100644 --- a/test/Bridges/Variable/zeros.jl +++ b/test/Bridges/Variable/zeros.jl @@ -1,103 +1,111 @@ +module TestVariableZeros + using Test using MathOptInterface const MOI = MathOptInterface -const MOIT = MathOptInterface.DeprecatedTest -const MOIU = MathOptInterface.Utilities -const MOIB = MathOptInterface.Bridges -include("../utilities.jl") +function runtests() + for name in names(@__MODULE__; all = true) + if startswith("$(name)", "test_") + @testset "$(name)" begin + getfield(@__MODULE__, name)() + end + end + end + return +end -mock = MOIU.MockOptimizer(MOIU.Model{Float64}()) -config = MOIT.Config() +include("../utilities.jl") -bridged_mock = MOIB.Variable.Zeros{Float64}(mock) +function test_zeros() + mock = MOI.Utilities.MockOptimizer(MOI.Utilities.Model{Float64}()) + bridged_mock = MOI.Bridges.Variable.Zeros{Float64}(mock) -x, cx = MOI.add_constrained_variable(bridged_mock, MOI.GreaterThan(0.0)) -MOI.set(bridged_mock, MOI.VariableName(), x, "x") -yz, cyz = MOI.add_constrained_variables(bridged_mock, MOI.Zeros(2)) -MOI.set(bridged_mock, MOI.VariableName(), yz, ["y", "z"]) -MOI.set(bridged_mock, MOI.ConstraintName(), cyz, "cyz") -y, z = yz -fx = MOI.SingleVariable(x) -fy = MOI.SingleVariable(y) -fz = MOI.SingleVariable(z) + x, cx = MOI.add_constrained_variable(bridged_mock, MOI.GreaterThan(0.0)) + MOI.set(bridged_mock, MOI.VariableName(), x, "x") + yz, cyz = MOI.add_constrained_variables(bridged_mock, MOI.Zeros(2)) + MOI.set(bridged_mock, MOI.VariableName(), yz, ["y", "z"]) + MOI.set(bridged_mock, MOI.ConstraintName(), cyz, "cyz") + y, z = yz + fx = MOI.SingleVariable(x) + fy = MOI.SingleVariable(y) + fz = MOI.SingleVariable(z) -@testset "SingleVariable objective" begin MOI.set(bridged_mock, MOI.ObjectiveSense(), MOI.MIN_SENSE) MOI.set(bridged_mock, MOI.ObjectiveFunction{typeof(fx)}(), fx) @test MOI.get(bridged_mock, MOI.ObjectiveFunction{typeof(fx)}()) == fx -end -# Test before adding affine constraints are affine expressions cannot be -# unbridged when `Variable.ZerosBridge` is used. -@testset "Test bridged model" begin + # Test before adding affine constraints are affine expressions cannot be + # unbridged when `Variable.ZerosBridge` is used. s = """ variables: x, y, z x >= 0.0 cyz: [y, z] in MathOptInterface.Zeros(2) minobjective: x """ - model = MOIU.Model{Float64}() - MOIU.loadfromstring!(model, s) - MOIU.test_models_equal( + model = MOI.Utilities.Model{Float64}() + MOI.Utilities.loadfromstring!(model, s) + MOI.Utilities.test_models_equal( bridged_mock, model, ["x", "y", "z"], ["cyz"], [("x", MOI.GreaterThan{Float64}(0.0))], ) -end -c1, c2 = MOI.add_constraints( - bridged_mock, - [1.0fy + 1.0fz, 1.0fx + 1.0fy + 1.0fz], - [MOI.EqualTo(0.0), MOI.GreaterThan(1.0)], -) -MOI.set(bridged_mock, MOI.ConstraintName(), c1, "con1") -MOI.set(bridged_mock, MOI.ConstraintName(), c2, "con2") -MOI.set(bridged_mock, MOI.ObjectiveSense(), MOI.MIN_SENSE) -obj = 1.0fx - 1.0fy - 1.0fz -MOI.set(bridged_mock, MOI.ObjectiveFunction{typeof(obj)}(), obj) - -@test MOIB.Variable.unbridged_map( - MOIB.bridge(bridged_mock, y), - y, - MOIB.IndexInVector(1), -) === nothing -@test MOIB.Variable.unbridged_map( - MOIB.bridge(bridged_mock, z), - z, - MOIB.IndexInVector(2), -) === nothing - -err = ErrorException( - "Cannot delete constraint index of bridged constrained variables. Delete" * - " the scalar variable or the vector of variables instead.", -) -@test_throws err MOI.delete(bridged_mock, cyz) - -err = ErrorException( - "Cannot unbridge function because some variables are bridged by" * - " variable bridges that do not support reverse mapping, e.g.," * - " `ZerosBridge`.", -) -@test_throws err MOI.get(bridged_mock, MOI.ObjectiveFunction{typeof(obj)}()) -# With `c1`, the function does not contain any variable so it tests that it -# also throws an error even if it never calls `variable_unbridged_function`. -@test_throws err MOI.get(bridged_mock, MOI.ConstraintFunction(), c1) -@test_throws err MOI.get(bridged_mock, MOI.ConstraintFunction(), c2) - -err = ArgumentError( - "Variable bridge of type `MathOptInterface.Bridges.Variable.ZerosBridge{Float64}`" * - " does not support accessing the attribute `MathOptInterface.DeprecatedTest.UnknownVariableAttribute()`.", -) -@test_throws err MOI.get(bridged_mock, MOIT.UnknownVariableAttribute(), y) - -@testset "Results" begin - MOIU.set_mock_optimize!( + c1, c2 = MOI.add_constraints( + bridged_mock, + [1.0fy + 1.0fz, 1.0fx + 1.0fy + 1.0fz], + [MOI.EqualTo(0.0), MOI.GreaterThan(1.0)], + ) + MOI.set(bridged_mock, MOI.ConstraintName(), c1, "con1") + MOI.set(bridged_mock, MOI.ConstraintName(), c2, "con2") + MOI.set(bridged_mock, MOI.ObjectiveSense(), MOI.MIN_SENSE) + obj = 1.0fx - 1.0fy - 1.0fz + MOI.set(bridged_mock, MOI.ObjectiveFunction{typeof(obj)}(), obj) + + @test MOI.Bridges.Variable.unbridged_map( + MOI.Bridges.bridge(bridged_mock, y), + y, + MOI.Bridges.IndexInVector(1), + ) === nothing + @test MOI.Bridges.Variable.unbridged_map( + MOI.Bridges.bridge(bridged_mock, z), + z, + MOI.Bridges.IndexInVector(2), + ) === nothing + + err = ErrorException( + "Cannot delete constraint index of bridged constrained variables. Delete" * + " the scalar variable or the vector of variables instead.", + ) + @test_throws err MOI.delete(bridged_mock, cyz) + + err = ErrorException( + "Cannot unbridge function because some variables are bridged by" * + " variable bridges that do not support reverse mapping, e.g.," * + " `ZerosBridge`.", + ) + @test_throws err MOI.get(bridged_mock, MOI.ObjectiveFunction{typeof(obj)}()) + # With `c1`, the function does not contain any variable so it tests that it + # also throws an error even if it never calls `variable_unbridged_function`. + @test_throws err MOI.get(bridged_mock, MOI.ConstraintFunction(), c1) + @test_throws err MOI.get(bridged_mock, MOI.ConstraintFunction(), c2) + + err = ArgumentError( + "Variable bridge of type `MathOptInterface.Bridges.Variable.ZerosBridge{Float64}`" * + " does not support accessing the attribute `MathOptInterface.Test.UnknownVariableAttribute()`.", + ) + @test_throws err MOI.get( + bridged_mock, + MOI.Test.UnknownVariableAttribute(), + y, + ) + + MOI.Utilities.set_mock_optimize!( mock, - (mock::MOIU.MockOptimizer) -> MOIU.mock_optimize!( + (mock::MOI.Utilities.MockOptimizer) -> MOI.Utilities.mock_optimize!( mock, [1.0], (MOI.ScalarAffineFunction{Float64}, MOI.EqualTo{Float64}) => @@ -129,9 +137,7 @@ err = ArgumentError( "trying to do.", ) @test_throws err MOI.get(bridged_mock, attr, cyz) -end -@testset "Query" begin @test MOI.get(bridged_mock, MOI.ConstraintFunction(), cyz).variables == yz @test MOI.get(mock, MOI.NumberOfVariables()) == 1 @test MOI.get(mock, MOI.ListOfVariableIndices()) == [x] @@ -149,9 +155,7 @@ end bridged_mock, MOI.ListOfConstraintIndices{MOI.VectorOfVariables,MOI.Zeros}(), ) == [cyz] -end -@testset "Test mock model" begin s = """ variables: x x >= 0.0 @@ -159,18 +163,16 @@ end con2: x + 0.0 >= 1.0 minobjective: x """ - model = MOIU.Model{Float64}() - MOIU.loadfromstring!(model, s) - MOIU.test_models_equal( + model = MOI.Utilities.Model{Float64}() + MOI.Utilities.loadfromstring!(model, s) + MOI.Utilities.test_models_equal( mock, model, ["x"], ["con1", "con2"], [("x", MOI.GreaterThan{Float64}(0.0))], ) -end -@testset "Delete" begin _test_delete_bridged_variables( bridged_mock, yz, @@ -181,4 +183,9 @@ end @test MOI.is_valid(bridged_mock, x) @test !MOI.is_valid(bridged_mock, y) @test !MOI.is_valid(bridged_mock, z) + return end + +end # module + +TestVariableZeros.runtests() diff --git a/test/Bridges/utilities.jl b/test/Bridges/utilities.jl index c05c00c552..e0522b2605 100644 --- a/test/Bridges/utilities.jl +++ b/test/Bridges/utilities.jl @@ -7,8 +7,8 @@ function _test_num_constraints(bridged_mock, F, S, n) end function _warn_incomplete_list_num_constraints(BT, list_num_constraints) - for (S,) in MOIB.added_constrained_variable_types(BT) - F = MOIU.variable_function_type(S) + for (S,) in MOI.Bridges.added_constrained_variable_types(BT) + F = MOI.Utilities.variable_function_type(S) if !any(c -> c[1] == F && c[2] == S, list_num_constraints) error( "Bridges of type $BT add constrained variable in $S but " * @@ -16,7 +16,7 @@ function _warn_incomplete_list_num_constraints(BT, list_num_constraints) ) end end - for (F, S) in MOIB.added_constraint_types(BT) + for (F, S) in MOI.Bridges.added_constraint_types(BT) if !any(c -> c[1] == F && c[2] == S, list_num_constraints) error( "Bridges of type $BT add $F-in-$S constraints but their " * @@ -29,7 +29,7 @@ end """ _test_delete_bridge( - m::MOIB.AbstractBridgeOptimizer, + m::MOI.Bridges.AbstractBridgeOptimizer, ci::MOI.ConstraintIndex{F, S}, nvars::Int, list_num_constraints::Tuple; @@ -51,7 +51,7 @@ Test deletion of the constraint `ci` in model `m`. * The number of `F`-in-`S` constraints is `num_bridged`. """ function _test_delete_bridge( - m::MOIB.AbstractBridgeOptimizer, + m::MOI.Bridges.AbstractBridgeOptimizer, ci::MOI.ConstraintIndex{F,S}, nvars::Int, list_num_constraints::Tuple; @@ -59,11 +59,11 @@ function _test_delete_bridge( num_bridged = 1, ) where {F,S} _warn_incomplete_list_num_constraints( - typeof(MOIB.bridge(m, ci)), + typeof(MOI.Bridges.bridge(m, ci)), list_num_constraints, ) function num_bridges() - return count(bridge -> true, values(MOIB.Constraint.bridges(m))) + return count(bridge -> true, values(MOI.Bridges.Constraint.bridges(m))) end start_num_bridges = num_bridges() @test MOI.get(m, MOI.NumberOfVariables()) == nvars @@ -90,7 +90,7 @@ end # Test deletion of variable bridge used for variable `vi` function _test_delete_bridged_variable( - m::MOIB.AbstractBridgeOptimizer, + m::MOI.Bridges.AbstractBridgeOptimizer, vi::MOI.VariableIndex, S::Type, nvars::Int, @@ -100,11 +100,11 @@ function _test_delete_bridged_variable( used_constraints = 1, ) _warn_incomplete_list_num_constraints( - typeof(MOIB.bridge(m, vi)), + typeof(MOI.Bridges.bridge(m, vi)), list_num_constraints, ) function num_bridges() - return count(bridge -> true, values(MOIB.Variable.bridges(m))) + return count(bridge -> true, values(MOI.Bridges.Variable.bridges(m))) end start_num_bridges = num_bridges() @test MOI.get(m, MOI.NumberOfVariables()) == nvars @@ -136,7 +136,7 @@ end # Test deletion of variable bridge used for vector of variables `vis` function _test_delete_bridged_variables( - m::MOIB.AbstractBridgeOptimizer, + m::MOI.Bridges.AbstractBridgeOptimizer, vis::Vector{MOI.VariableIndex}, S::Type, nvars::Int, @@ -145,11 +145,11 @@ function _test_delete_bridged_variables( num_bridged = 1, ) _warn_incomplete_list_num_constraints( - typeof(MOIB.bridge(m, vis[1])), + typeof(MOI.Bridges.bridge(m, vis[1])), list_num_constraints, ) function num_bridges() - return count(bridge -> true, values(MOIB.Variable.bridges(m))) + return count(bridge -> true, values(MOI.Bridges.Variable.bridges(m))) end start_num_bridges = num_bridges() @test MOI.get(m, MOI.NumberOfVariables()) == nvars @@ -180,17 +180,19 @@ function _test_delete_bridged_variables( end function _test_delete_objective( - m::MOIB.AbstractBridgeOptimizer, + m::MOI.Bridges.AbstractBridgeOptimizer, nvars::Int, list_num_constraints::Tuple; used_bridges = 1, ) _warn_incomplete_list_num_constraints( - typeof(MOIB.Objective.root_bridge(MOIB.Objective.bridges(m))), + typeof( + MOI.Bridges.Objective.root_bridge(MOI.Bridges.Objective.bridges(m)), + ), list_num_constraints, ) function num_bridges() - return length(MOIB.Objective.bridges(m)) + return length(MOI.Bridges.Objective.bridges(m)) end start_num_bridges = num_bridges() @test MOI.get(m, MOI.NumberOfVariables()) == nvars