Skip to content

Commit 3c56e46

Browse files
committed
Add test_delete_bridge function
1 parent df5aaaa commit 3c56e46

File tree

2 files changed

+66
-113
lines changed

2 files changed

+66
-113
lines changed

test/bridge.jl

Lines changed: 29 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,26 @@ MOIB.@bridge RSOCtoPSD MOIB.RSOCtoPSDCBridge () () (RotatedSecondOrderCone,) ()
7676
MOIB.@bridge LogDet MOIB.LogDetBridge () () (LogDetConeTriangle,) () () () (VectorOfVariables,) (VectorAffineFunction,)
7777
MOIB.@bridge RootDet MOIB.RootDetBridge () () (RootDetConeTriangle,) () () () (VectorOfVariables,) (VectorAffineFunction,)
7878

79+
# Test deletion of bridge
80+
function test_delete_bridge(m::MOIB.AbstractBridgeOptimizer, ci::MOI.ConstraintIndex{F, S}, nvars::Int, nocs::Tuple) where {F, S}
81+
@test MOI.get(m, MOI.NumberOfVariables()) == nvars
82+
test_noc(m, F, S, 1)
83+
for noc in nocs
84+
test_noc(m, noc...)
85+
end
86+
@test MOI.isvalid(m, ci)
87+
@test MOI.candelete(m, ci)
88+
MOI.delete!(m, ci)
89+
@test !MOI.isvalid(m, ci)
90+
@test isempty(m.bridges)
91+
test_noc(m, F, S, 0)
92+
# As the bridge has been removed, if the constraints it has created where not removed, it wouldn't be there to decrease this counter anymore
93+
@test MOI.get(m, MOI.NumberOfVariables()) == nvars
94+
for noc in nocs
95+
test_noc(m, noc...)
96+
end
97+
end
98+
7999
@testset "Bridge tests" begin
80100
mock = MOIU.MockOptimizer(SimpleModel{Float64}())
81101
config = MOIT.TestConfig()
@@ -99,19 +119,8 @@ MOIB.@bridge RootDet MOIB.RootDetBridge () () (RootDetConeTriangle,) () () () (V
99119
MOI.modifyconstraint!(bridgedmock, ci, newf)
100120
@test MOI.canget(bridgedmock, MOI.ConstraintFunction(), typeof(ci))
101121
@test MOI.get(bridgedmock, MOI.ConstraintFunction(), ci) newf
102-
# Test deletion
103-
@test MOI.get(bridgedmock, MOI.NumberOfVariables()) == 2
104-
test_noc(bridgedmock, MOI.ScalarAffineFunction{Float64}, MOI.GreaterThan{Float64}, 0)
105-
test_noc(bridgedmock, MOI.ScalarAffineFunction{Float64}, MOI.Interval{Float64}, 1)
106-
test_noc(bridgedmock, MOI.ScalarAffineFunction{Float64}, MOI.LessThan{Float64}, 0)
107-
@test MOI.isvalid(bridgedmock, ci)
108-
@test MOI.candelete(bridgedmock, ci)
109-
MOI.delete!(bridgedmock, ci)
110-
@test isempty(bridgedmock.bridges)
111-
@test MOI.get(bridgedmock, MOI.NumberOfVariables()) == 2
112-
test_noc(bridgedmock, MOI.ScalarAffineFunction{Float64}, MOI.GreaterThan{Float64}, 0)
113-
test_noc(bridgedmock, MOI.ScalarAffineFunction{Float64}, MOI.Interval{Float64}, 0)
114-
test_noc(bridgedmock, MOI.ScalarAffineFunction{Float64}, MOI.LessThan{Float64}, 0)
122+
test_delete_bridge(bridgedmock, ci, 2, ((MOI.ScalarAffineFunction{Float64}, MOI.GreaterThan{Float64}, 0),
123+
(MOI.ScalarAffineFunction{Float64}, MOI.LessThan{Float64}, 0)))
115124
end
116125

117126
@testset "GeoMean" begin
@@ -122,21 +131,8 @@ MOIB.@bridge RootDet MOIB.RootDetBridge () () (RootDetConeTriangle,) () () () (V
122131
@test !MOI.canget(bridgedmock, MOI.ConstraintDual(), MOI.ConstraintIndex{MOI.VectorOfVariables, MOI.GeometricMeanCone})
123132
ci = first(MOI.get(bridgedmock, MOI.ListOfConstraintIndices{MOI.VectorAffineFunction{Float64}, MOI.GeometricMeanCone}()))
124133
@test !MOI.canmodifyconstraint(bridgedmock, ci, MOI.VectorAffineFunction{Float64})
125-
# Test deletion
126-
@test MOI.get(bridgedmock, MOI.NumberOfVariables()) == 4
127-
test_noc(bridgedmock, MOI.VectorAffineFunction{Float64}, MOI.GeometricMeanCone, 1)
128-
test_noc(bridgedmock, MOI.VectorAffineFunction{Float64}, MOI.RotatedSecondOrderCone, 0)
129-
test_noc(bridgedmock, MOI.ScalarAffineFunction{Float64}, MOI.LessThan{Float64}, 1)
130-
@test MOI.isvalid(bridgedmock, ci)
131-
@test MOI.candelete(bridgedmock, ci)
132-
MOI.delete!(bridgedmock, ci)
133-
@test !MOI.isvalid(bridgedmock, ci)
134-
@test isempty(bridgedmock.bridges)
135-
test_noc(bridgedmock, MOI.VectorAffineFunction{Float64}, MOI.GeometricMeanCone, 0)
136-
# As the bridge has been removed, if the constraints it has created where not removed, it wouldn't be there to decrease this counter anymore
137-
@test MOI.get(bridgedmock, MOI.NumberOfVariables()) == 4
138-
test_noc(bridgedmock, MOI.VectorAffineFunction{Float64}, MOI.RotatedSecondOrderCone, 0)
139-
test_noc(bridgedmock, MOI.ScalarAffineFunction{Float64}, MOI.LessThan{Float64}, 1)
134+
test_delete_bridge(bridgedmock, ci, 4, ((MOI.VectorAffineFunction{Float64}, MOI.RotatedSecondOrderCone, 0),
135+
(MOI.ScalarAffineFunction{Float64}, MOI.LessThan{Float64}, 1)))
140136
end
141137

142138
@testset "SOCtoPSD" begin
@@ -148,17 +144,7 @@ MOIB.@bridge RootDet MOIB.RootDetBridge () () (RootDetConeTriangle,) () () () (V
148144
MOIT.soc1ftest(bridgedmock, config)
149145
ci = first(MOI.get(bridgedmock, MOI.ListOfConstraintIndices{MOI.VectorAffineFunction{Float64}, MOI.SecondOrderCone}()))
150146
@test !MOI.canmodifyconstraint(bridgedmock, ci, MOI.VectorAffineFunction{Float64})
151-
@test MOI.get(bridgedmock, MOI.NumberOfVariables()) == 3
152-
test_noc(bridgedmock, MOI.VectorAffineFunction{Float64}, MOI.SecondOrderCone, 1)
153-
test_noc(bridgedmock, MOI.VectorAffineFunction{Float64}, MOI.PositiveSemidefiniteConeTriangle, 0)
154-
@test MOI.isvalid(bridgedmock, ci)
155-
@test MOI.candelete(bridgedmock, ci)
156-
MOI.delete!(bridgedmock, ci)
157-
@test !MOI.isvalid(bridgedmock, ci)
158-
@test isempty(bridgedmock.bridges)
159-
@test MOI.get(bridgedmock, MOI.NumberOfVariables()) == 3
160-
test_noc(bridgedmock, MOI.VectorAffineFunction{Float64}, MOI.SecondOrderCone, 0)
161-
test_noc(bridgedmock, MOI.VectorAffineFunction{Float64}, MOI.PositiveSemidefiniteConeTriangle, 0)
147+
test_delete_bridge(bridgedmock, ci, 3, ((MOI.VectorAffineFunction{Float64}, MOI.PositiveSemidefiniteConeTriangle, 0),))
162148
end
163149

164150
@testset "RSOCtoPSD" begin
@@ -172,17 +158,7 @@ MOIB.@bridge RootDet MOIB.RootDetBridge () () (RootDetConeTriangle,) () () () (V
172158
MOIT.rotatedsoc1ftest(bridgedmock, config)
173159
ci = first(MOI.get(bridgedmock, MOI.ListOfConstraintIndices{MOI.VectorAffineFunction{Float64}, MOI.RotatedSecondOrderCone}()))
174160
@test !MOI.canmodifyconstraint(bridgedmock, ci, MOI.VectorAffineFunction{Float64})
175-
@test MOI.get(bridgedmock, MOI.NumberOfVariables()) == 2
176-
test_noc(bridgedmock, MOI.VectorAffineFunction{Float64}, MOI.RotatedSecondOrderCone, 1)
177-
test_noc(bridgedmock, MOI.VectorAffineFunction{Float64}, MOI.PositiveSemidefiniteConeTriangle, 0)
178-
@test MOI.isvalid(bridgedmock, ci)
179-
@test MOI.candelete(bridgedmock, ci)
180-
MOI.delete!(bridgedmock, ci)
181-
@test !MOI.isvalid(bridgedmock, ci)
182-
@test isempty(bridgedmock.bridges)
183-
@test MOI.get(bridgedmock, MOI.NumberOfVariables()) == 2
184-
test_noc(bridgedmock, MOI.VectorAffineFunction{Float64}, MOI.RotatedSecondOrderCone, 0)
185-
test_noc(bridgedmock, MOI.VectorAffineFunction{Float64}, MOI.PositiveSemidefiniteConeTriangle, 0)
161+
test_delete_bridge(bridgedmock, ci, 2, ((MOI.VectorAffineFunction{Float64}, MOI.PositiveSemidefiniteConeTriangle, 0),))
186162
end
187163

188164
@testset "LogDet" begin
@@ -193,19 +169,7 @@ MOIB.@bridge RootDet MOIB.RootDetBridge () () (RootDetConeTriangle,) () () () (V
193169
@test !MOI.canget(bridgedmock, MOI.ConstraintDual(), MOI.ConstraintIndex{MOI.VectorAffineFunction{Float64}, MOI.LogDetConeTriangle})
194170
ci = first(MOI.get(bridgedmock, MOI.ListOfConstraintIndices{MOI.VectorAffineFunction{Float64}, MOI.LogDetConeTriangle}()))
195171
@test !MOI.canmodifyconstraint(bridgedmock, ci, MOI.VectorAffineFunction{Float64})
196-
@test MOI.get(bridgedmock, MOI.NumberOfVariables()) == 4
197-
test_noc(bridgedmock, MOI.VectorAffineFunction{Float64}, MOI.LogDetConeTriangle, 1)
198-
test_noc(bridgedmock, MOI.VectorAffineFunction{Float64}, MOI.ExponentialCone, 0)
199-
test_noc(bridgedmock, MOI.VectorAffineFunction{Float64}, MOI.PositiveSemidefiniteConeTriangle, 0)
200-
@test MOI.isvalid(bridgedmock, ci)
201-
@test MOI.candelete(bridgedmock, ci)
202-
MOI.delete!(bridgedmock, ci)
203-
@test !MOI.isvalid(bridgedmock, ci)
204-
@test isempty(bridgedmock.bridges)
205-
@test MOI.get(bridgedmock, MOI.NumberOfVariables()) == 4
206-
test_noc(bridgedmock, MOI.VectorAffineFunction{Float64}, MOI.LogDetConeTriangle, 0)
207-
test_noc(bridgedmock, MOI.VectorAffineFunction{Float64}, MOI.ExponentialCone, 0)
208-
test_noc(bridgedmock, MOI.VectorAffineFunction{Float64}, MOI.PositiveSemidefiniteConeTriangle, 0)
172+
test_delete_bridge(bridgedmock, ci, 4, ((MOI.VectorAffineFunction{Float64}, MOI.ExponentialCone, 0), (MOI.VectorAffineFunction{Float64}, MOI.PositiveSemidefiniteConeTriangle, 0)))
209173
end
210174

211175
@testset "RootDet" begin
@@ -216,18 +180,7 @@ MOIB.@bridge RootDet MOIB.RootDetBridge () () (RootDetConeTriangle,) () () () (V
216180
@test !MOI.canget(bridgedmock, MOI.ConstraintDual(), MOI.ConstraintIndex{MOI.VectorAffineFunction{Float64}, MOI.RootDetConeTriangle})
217181
ci = first(MOI.get(bridgedmock, MOI.ListOfConstraintIndices{MOI.VectorAffineFunction{Float64}, MOI.RootDetConeTriangle}()))
218182
@test !MOI.canmodifyconstraint(bridgedmock, ci, MOI.VectorAffineFunction{Float64})
219-
@test MOI.get(bridgedmock, MOI.NumberOfVariables()) == 4
220-
test_noc(bridgedmock, MOI.VectorAffineFunction{Float64}, MOI.RootDetConeTriangle, 1)
221-
test_noc(bridgedmock, MOI.VectorAffineFunction{Float64}, MOI.RotatedSecondOrderCone, 0)
222-
test_noc(bridgedmock, MOI.VectorAffineFunction{Float64}, MOI.PositiveSemidefiniteConeTriangle, 0)
223-
@test MOI.isvalid(bridgedmock, ci)
224-
@test MOI.candelete(bridgedmock, ci)
225-
MOI.delete!(bridgedmock, ci)
226-
@test !MOI.isvalid(bridgedmock, ci)
227-
@test isempty(bridgedmock.bridges)
228-
@test MOI.get(bridgedmock, MOI.NumberOfVariables()) == 4
229-
test_noc(bridgedmock, MOI.VectorAffineFunction{Float64}, MOI.RootDetConeTriangle, 0)
230-
test_noc(bridgedmock, MOI.VectorAffineFunction{Float64}, MOI.RotatedSecondOrderCone, 0)
231-
test_noc(bridgedmock, MOI.VectorAffineFunction{Float64}, MOI.PositiveSemidefiniteConeTriangle, 0)
183+
test_delete_bridge(bridgedmock, ci, 4, ((MOI.VectorAffineFunction{Float64}, MOI.RotatedSecondOrderCone, 0),
184+
(MOI.VectorAffineFunction{Float64}, MOI.PositiveSemidefiniteConeTriangle, 0)))
232185
end
233186
end

test/runtests.jl

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -6,43 +6,43 @@ const MOIB = MathOptInterface.Bridges
66

77
# Tests for solvers are located in MOI.Test.
88

9-
include("isapprox.jl")
10-
include("interval.jl")
11-
12-
# Needed by test spread over several files, defining it here make it easier to comment out tests
13-
# Model supporting every MOI functions and sets
14-
MOIU.@model(Model,
15-
(ZeroOne, Integer),
16-
(EqualTo, GreaterThan, LessThan, Interval),
17-
(Reals, Zeros, Nonnegatives, Nonpositives, SecondOrderCone, RotatedSecondOrderCone, GeometricMeanCone, ExponentialCone, DualExponentialCone, PositiveSemidefiniteConeTriangle, PositiveSemidefiniteConeSquare, RootDetConeTriangle, RootDetConeSquare, LogDetConeTriangle, LogDetConeSquare),
18-
(PowerCone, DualPowerCone, SOS1, SOS2),
19-
(SingleVariable,),
20-
(ScalarAffineFunction, ScalarQuadraticFunction),
21-
(VectorOfVariables,),
22-
(VectorAffineFunction, VectorQuadraticFunction))
23-
# Model supporting only SecondOrderCone as non-LP cone.
24-
@MOIU.model ModelForMock (ZeroOne, Integer) (EqualTo, GreaterThan, LessThan, Interval) (Zeros, Nonnegatives, Nonpositives, SecondOrderCone) () (SingleVariable,) (ScalarAffineFunction,) (VectorOfVariables,) (VectorAffineFunction,)
25-
26-
# Utilities submodule tests
27-
include("functions.jl")
28-
include("sets.jl")
29-
include("model.jl")
30-
include("universalfallback.jl")
31-
include("parser.jl")
32-
include("mockoptimizer.jl")
33-
include("cachingoptimizer.jl")
34-
include("copy.jl")
35-
36-
# Test submodule tests
37-
# It tests that the ConstraintPrimal value requested in the tests is consistent with the VariablePrimal
38-
include("config.jl")
39-
40-
include("contlinear.jl")
41-
include("contconic.jl")
42-
include("contquadratic.jl")
43-
44-
include("intlinear.jl")
45-
include("intconic.jl")
9+
#include("isapprox.jl")
10+
#include("interval.jl")
11+
#
12+
## Needed by test spread over several files, defining it here make it easier to comment out tests
13+
## Model supporting every MOI functions and sets
14+
#MOIU.@model(Model,
15+
# (ZeroOne, Integer),
16+
# (EqualTo, GreaterThan, LessThan, Interval),
17+
# (Reals, Zeros, Nonnegatives, Nonpositives, SecondOrderCone, RotatedSecondOrderCone, GeometricMeanCone, ExponentialCone, DualExponentialCone, PositiveSemidefiniteConeTriangle, PositiveSemidefiniteConeSquare, RootDetConeTriangle, RootDetConeSquare, LogDetConeTriangle, LogDetConeSquare),
18+
# (PowerCone, DualPowerCone, SOS1, SOS2),
19+
# (SingleVariable,),
20+
# (ScalarAffineFunction, ScalarQuadraticFunction),
21+
# (VectorOfVariables,),
22+
# (VectorAffineFunction, VectorQuadraticFunction))
23+
## Model supporting only SecondOrderCone as non-LP cone.
24+
#@MOIU.model ModelForMock (ZeroOne, Integer) (EqualTo, GreaterThan, LessThan, Interval) (Zeros, Nonnegatives, Nonpositives, SecondOrderCone) () (SingleVariable,) (ScalarAffineFunction,) (VectorOfVariables,) (VectorAffineFunction,)
25+
#
26+
## Utilities submodule tests
27+
#include("functions.jl")
28+
#include("sets.jl")
29+
#include("model.jl")
30+
#include("universalfallback.jl")
31+
#include("parser.jl")
32+
#include("mockoptimizer.jl")
33+
#include("cachingoptimizer.jl")
34+
#include("copy.jl")
35+
#
36+
## Test submodule tests
37+
## It tests that the ConstraintPrimal value requested in the tests is consistent with the VariablePrimal
38+
#include("config.jl")
39+
#
40+
#include("contlinear.jl")
41+
#include("contconic.jl")
42+
#include("contquadratic.jl")
43+
#
44+
#include("intlinear.jl")
45+
#include("intconic.jl")
4646

4747
# Bridges submodule tests
4848
include("bridge.jl")

0 commit comments

Comments
 (0)