@@ -8,24 +8,63 @@ const MOIB = MathOptInterface.Bridges
88
99include (" ../utilities.jl" )
1010
11- include (" ../simple_model.jl" )
12-
13- mock = MOIU. MockOptimizer (SimpleModel {Float64} ())
11+ mock = MOIU. MockOptimizer (MOIU. Model {Float64} ())
1412config = MOIT. TestConfig ()
1513
1614@testset " NonposToNonneg" begin
17- bridged_mock = MOIB. Variable. NonposToNonneg {Float64} (mock)
15+ bridged_mock = MOIB. Variable. Zeros {Float64} (mock)
1816
1917 MOIU. set_mock_optimize! (mock,
2018 (mock:: MOIU.MockOptimizer ) -> MOIU. mock_optimize! (
21- mock, MOI. INFEASIBLE, MOI. INFEASIBLE_POINT,
22- MOI. INFEASIBILITY_CERTIFICATE)
19+ mock, [1.0 ],
20+ (MOI. ScalarAffineFunction{Float64}, MOI. EqualTo{Float64}) => 0.0 ,
21+ (MOI. ScalarAffineFunction{Float64}, MOI. GreaterThan{Float64}) => 1.0 )
22+ )
23+
24+ x, cx = MOI. add_constrained_variable (bridged_mock, MOI. GreaterThan (0.0 ))
25+ yz, cyz = MOI. add_constrained_variables (bridged_mock, MOI. Zeros (2 ))
26+ y, z = yz
27+ fx = MOI. SingleVariable (x)
28+ fy = MOI. SingleVariable (y)
29+ fz = MOI. SingleVariable (z)
30+ c1 = MOI. add_constraint (bridged_mock, 1.0 fy + 1.0 fz, MOI. EqualTo (0.0 ))
31+ c2 = MOI. add_constraint (bridged_mock, 1.0 fx + 1.0 fy + 1.0 fz, MOI. GreaterThan (1.0 ))
32+ MOI. set (bridged_mock, MOI. ObjectiveSense (), MOI. MIN_SENSE)
33+ obj = 1.0 fx - 1.0 fy - 1.0 fz
34+ MOI. set (bridged_mock, MOI. ObjectiveFunction {typeof(obj)} (), obj)
35+
36+ err = ErrorException (
37+ " Cannot unbridge function because some variables are bridged by" *
38+ " variable bridges that do not support reverse mapping, e.g.," *
39+ " `ZerosBridge`."
40+ )
41+ @test_throws err MOI. get (bridged_mock, MOI. ObjectiveFunction {typeof(obj)} ())
42+ # With `c1`, the function does not contain any variable so it tests that it
43+ # also throws an error even if it never calls `variable_unbridged_function`.
44+ @test_throws err MOI. get (bridged_mock, MOI. ConstraintFunction (), c1)
45+ @test_throws err MOI. get (bridged_mock, MOI. ConstraintFunction (), c2)
46+
47+ MOI. optimize! (bridged_mock)
48+ @test MOI. get (bridged_mock, MOI. VariablePrimal (), x) == 1.0
49+ @test MOI. get (bridged_mock, MOI. VariablePrimal (), y) == 0.0
50+ @test MOI. get (bridged_mock, MOI. VariablePrimal (), z) == 0.0
51+
52+ @test MOI. get (bridged_mock, MOI. ConstraintDual (), cx) == 0.0
53+ @test MOI. get (bridged_mock, MOI. ConstraintDual (), c1) == 0.0
54+ @test MOI. get (bridged_mock, MOI. ConstraintDual (), c2) == 1.0
55+
56+ err = ArgumentError (
57+ " Bridge of type `MathOptInterface.Bridges.Variable.ZerosBridge{Float64}`" *
58+ " does not support accessing the attribute" *
59+ " `MathOptInterface.ConstraintDual(1)`."
2360 )
24- MOIT . lin4test (bridged_mock, config )
61+ @test_throws err MOI . get (bridged_mock, MOI . ConstraintDual (), cyz )
2562
2663 @test MOI. get (mock, MOI. NumberOfVariables ()) == 1
27- @test length (MOI. get (mock, MOI. ListOfVariableIndices ())) == 1
28- @test first (MOI. get (mock, MOI. ListOfVariableIndices ())). value ≥ 0
29- @test MOI. get (bridged_mock, MOI. NumberOfVariables ()) == 1
30- @test MOI. get (bridged_mock, MOI. ListOfVariableIndices ()) == [MOI. VariableIndex (- 1 )]
64+ @test MOI. get (mock, MOI. ListOfVariableIndices ()) == [x]
65+ @test MOI. get (bridged_mock, MOI. NumberOfVariables ()) == 3
66+ @test MOI. get (bridged_mock, MOI. ListOfVariableIndices ()) == [x, y, z]
67+ @test MOI. get (mock, MOI. NumberOfConstraints {MOI.VectorOfVariables, MOI.Zeros} ()) == 0
68+ @test MOI. get (bridged_mock, MOI. NumberOfConstraints {MOI.VectorOfVariables, MOI.Zeros} ()) == 1
69+ @test MOI. get (bridged_mock, MOI. ListOfConstraintIndices {MOI.VectorOfVariables, MOI.Zeros} ()) == [cyz]
3170end
0 commit comments