Skip to content

Commit 0e48a2a

Browse files
committed
Fix bridges tests
1 parent b8fb3bf commit 0e48a2a

File tree

6 files changed

+45
-25
lines changed

6 files changed

+45
-25
lines changed

src/Bridges/bridgeoptimizer.jl

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -209,13 +209,11 @@ function MOI.addconstraint!(b::AbstractBridgeOptimizer, f::MOI.AbstractFunction,
209209
MOI.addconstraint!(b.model, f, s)
210210
end
211211
end
212-
function MOI.canmodify(b::AbstractBridgeOptimizer, ::Type{C}, ::Type{Chg}) where {C<:CI,Chg<:MOI.AbstractFunctionModification}
213-
if isbridged(b, C)
214-
MOI.canmodify(b.bridged, C, Chg)
215-
# TODO(@blegat): how should the following be implemented?
216-
# && MOI.canmodify(b, MOIB.bridge(b, ci), Chg)
212+
function MOI.canmodify(b::AbstractBridgeOptimizer, ::Type{CI{F, S}}, ::Type{Chg}) where {F, S, Chg<:MOI.AbstractFunctionModification}
213+
if isbridged(b, CI{F, S})
214+
MOI.canmodify(b.bridged, CI{F, S}, Chg) && MOI.canmodify(b, MOIB.bridgetype(b, F, S), Chg)
217215
else
218-
MOI.canmodify(b.model, C, Chg)
216+
MOI.canmodify(b.model, CI{F, S}, Chg)
219217
end
220218
end
221219
function MOI.modify!(b::AbstractBridgeOptimizer, ci::CI, change)
@@ -227,13 +225,11 @@ function MOI.modify!(b::AbstractBridgeOptimizer, ci::CI, change)
227225
end
228226
end
229227

230-
function MOI.canset(b::AbstractBridgeOptimizer, ::MOI.ConstraintSet, ::Type{C}) where C <: CI
231-
if isbridged(b, C)
232-
MOI.canset(b.bridged, MOI.ConstraintSet(), C)
233-
# TODO(@blegat) is this necessary? How do I do it without types
234-
# && MOI.canset(b, MOIB.bridge(b, ci), change)
228+
function MOI.canset(b::AbstractBridgeOptimizer, attr::MOI.ConstraintSet, ::Type{CI{F, S}}) where {F, S}
229+
if isbridged(b, CI{F, S})
230+
MOI.canset(b.bridged, MOI.ConstraintSet(), CI{F, S}) && MOI.canset(b, MOI.ConstraintSet(), MOIB.bridgetype(b, F, S))
235231
else
236-
MOI.canset(b.model, MOI.ConstraintSet(), C)
232+
MOI.canset(b.model, MOI.ConstraintSet(), CI{F, S})
237233
end
238234
end
239235
function MOI.set!(b::AbstractBridgeOptimizer, ::MOI.ConstraintSet, constraint_index::CI, set)
@@ -246,13 +242,11 @@ function MOI.set!(b::AbstractBridgeOptimizer, ::MOI.ConstraintSet, constraint_in
246242
end
247243
end
248244

249-
function MOI.canset(b::AbstractBridgeOptimizer, ::MOI.ConstraintFunction, ::Type{C}) where C <: CI
250-
if isbridged(b, C)
251-
MOI.canset(b.bridged, MOI.ConstraintFunction(), C)
252-
# TODO(@blegat) is this necessary? How do I do it without types
253-
# && MOI.canset(b, MOIB.bridge(b, ci), change)
245+
function MOI.canset(b::AbstractBridgeOptimizer, ::MOI.ConstraintFunction, ::Type{CI{F, S}}) where {F, S}
246+
if isbridged(b, CI{F, S})
247+
MOI.canset(b.bridged, MOI.ConstraintFunction(), CI{F, S}) && MOI.canset(b, MOI.ConstraintFunction(), MOIB.bridgetype(b, F, S))
254248
else
255-
MOI.canset(b.model, MOI.ConstraintFunction(), C)
249+
MOI.canset(b.model, MOI.ConstraintFunction(), CI{F, S})
256250
end
257251
end
258252
function MOI.set!(b::AbstractBridgeOptimizer, ::MOI.ConstraintFunction, constraint_index::CI, func)

src/Bridges/detbridge.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@ MOI.canget(model::MOI.ModelLike, a::MOI.ConstraintDual, ::Type{<:LogDetBridge})
142142

143143
# Constraints
144144
MOI.canmodify(model::MOI.ModelLike, ::Type{<:LogDetBridge}, change) = false
145+
MOI.canset(model::MOI.ModelLike, ::MOI.ConstraintSet, ::Type{<:LogDetBridge}) = false
146+
MOI.canset(model::MOI.ModelLike, ::MOI.ConstraintFunction, ::Type{<:LogDetBridge}) = false
145147

146148
"""
147149
RootDetBridge{T}
@@ -208,3 +210,5 @@ MOI.canget(model::MOI.ModelLike, ::MOI.ConstraintDual, ::Type{<:RootDetBridge})
208210

209211
# Constraints
210212
MOI.canmodify(model::MOI.ModelLike, ::Type{<:RootDetBridge}, ::Type{<:MOI.AbstractFunctionModification}) = false
213+
MOI.canset(model::MOI.ModelLike, ::MOI.ConstraintSet, ::Type{<:RootDetBridge}) = false
214+
MOI.canset(model::MOI.ModelLike, ::MOI.ConstraintFunction, ::Type{<:RootDetBridge}) = false

src/Bridges/geomeanbridge.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,3 +139,5 @@ MOI.canget(model::MOI.ModelLike, a::MOI.ConstraintDual, ::Type{<:GeoMeanBridge})
139139

140140
# Constraints
141141
MOI.canmodify(model::MOI.ModelLike, ::Type{<:GeoMeanBridge}, ::Type{<:MOI.AbstractFunctionModification}) = false
142+
MOI.canset(model::MOI.ModelLike, ::MOI.ConstraintSet, ::Type{<:GeoMeanBridge}) = false
143+
MOI.canset(model::MOI.ModelLike, ::MOI.ConstraintFunction, ::Type{<:GeoMeanBridge}) = false

src/Bridges/rsocbridge.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,5 @@ end
6666
MOI.get(model::MOI.ModelLike, attr::MOI.ConstraintDual, c::RSOCBridge) = _get(model, attr, c)
6767

6868
MOI.canmodify(model::MOI.ModelLike, ::Type{<:RSOCBridge}, ::Type{<:MOI.AbstractFunctionModification}) = false
69+
MOI.canset(model::MOI.ModelLike, ::MOI.ConstraintSet, ::Type{<:RSOCBridge}) = false
70+
MOI.canset(model::MOI.ModelLike, ::MOI.ConstraintFunction, ::Type{<:RSOCBridge}) = false

src/Bridges/soctopsdbridge.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ function MOI.delete!(instance::MOI.AbstractOptimizer, c::SOCtoPSDCBridge)
8787
end
8888

8989
MOI.canmodify(::MOI.AbstractOptimizer, ::Type{<:SOCtoPSDCBridge}, ::Type{<:MOI.AbstractFunctionModification}) = false
90+
MOI.canset(model::MOI.ModelLike, ::MOI.ConstraintSet, ::Type{<:SOCtoPSDCBridge}) = false
91+
MOI.canset(model::MOI.ModelLike, ::MOI.ConstraintFunction, ::Type{<:SOCtoPSDCBridge}) = false
9092

9193
"""
9294
The `RSOCtoPSDCBridge` transforms the second order cone constraint ``\\lVert x \\rVert \\le 2tu`` with ``u \\ge 0`` into the semidefinite cone constraints
@@ -152,3 +154,5 @@ function MOI.delete!(instance::MOI.AbstractOptimizer, c::RSOCtoPSDCBridge)
152154
end
153155

154156
MOI.canmodify(::MOI.AbstractOptimizer, ::Type{<:RSOCtoPSDCBridge}, change) = false
157+
MOI.canset(model::MOI.ModelLike, ::MOI.ConstraintSet, ::Type{<:RSOCtoPSDCBridge}) = false
158+
MOI.canset(model::MOI.ModelLike, ::MOI.ConstraintFunction, ::Type{<:RSOCtoPSDCBridge}) = false

test/bridge.jl

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,9 @@ MOIU.@model NoRSOCModel () (EqualTo, GreaterThan, LessThan, Interval) (Zeros, No
132132
# Dual is not yet implemented for RootDet and GeoMean bridges
133133
@test !MOI.canget(fullbridgedmock, MOI.ConstraintDual(), MOI.ConstraintIndex{MOI.VectorAffineFunction{Float64}, MOI.RootDetConeTriangle})
134134
ci = first(MOI.get(fullbridgedmock, MOI.ListOfConstraintIndices{MOI.VectorAffineFunction{Float64}, MOI.RootDetConeTriangle}()))
135-
@test_broken !MOI.canmodify(fullbridgedmock, typeof(ci), MOI.VectorConstantChange{Float64})
135+
@test !MOI.canmodify(fullbridgedmock, typeof(ci), MOI.VectorConstantChange{Float64})
136+
@test !MOI.canset(fullbridgedmock, MOI.ConstraintSet(), typeof(ci))
137+
@test !MOI.canset(fullbridgedmock, MOI.ConstraintFunction(), typeof(ci))
136138
test_delete_bridge(fullbridgedmock, ci, 4, ((MOI.VectorAffineFunction{Float64}, MOI.RotatedSecondOrderCone, 0),
137139
(MOI.VectorAffineFunction{Float64}, MOI.GeometricMeanCone, 0),
138140
(MOI.VectorAffineFunction{Float64}, MOI.PositiveSemidefiniteConeTriangle, 0)))
@@ -184,7 +186,9 @@ end
184186
(MOI.VectorAffineFunction{Float64}, MOI.SecondOrderCone) => [[3/2, 1/2, -1.0, -1.0]])
185187
MOIT.rotatedsoc1ftest(bridgedmock, config)
186188
ci = first(MOI.get(bridgedmock, MOI.ListOfConstraintIndices{MOI.VectorAffineFunction{Float64}, MOI.RotatedSecondOrderCone}()))
187-
@test_broken !MOI.canmodify(bridgedmock, typeof(ci), MOI.VectorConstantChange{Float64})
189+
@test !MOI.canmodify(bridgedmock, typeof(ci), MOI.VectorConstantChange{Float64})
190+
@test !MOI.canset(bridgedmock, MOI.ConstraintSet(), typeof(ci))
191+
@test !MOI.canset(bridgedmock, MOI.ConstraintFunction(), typeof(ci))
188192
test_delete_bridge(bridgedmock, ci, 2, ((MOI.VectorAffineFunction{Float64}, MOI.SecondOrderCone, 0),))
189193
end
190194

@@ -196,7 +200,9 @@ end
196200
# Dual is not yet implemented for GeoMean bridge
197201
@test !MOI.canget(bridgedmock, MOI.ConstraintDual(), MOI.ConstraintIndex{MOI.VectorOfVariables, MOI.GeometricMeanCone})
198202
ci = first(MOI.get(bridgedmock, MOI.ListOfConstraintIndices{MOI.VectorAffineFunction{Float64}, MOI.GeometricMeanCone}()))
199-
@test_broken !MOI.canmodify(bridgedmock, typeof(ci), MOI.VectorConstantChange{Float64})
203+
@test !MOI.canmodify(bridgedmock, typeof(ci), MOI.VectorConstantChange{Float64})
204+
@test !MOI.canset(bridgedmock, MOI.ConstraintSet(), typeof(ci))
205+
@test !MOI.canset(bridgedmock, MOI.ConstraintFunction(), typeof(ci))
200206
test_delete_bridge(bridgedmock, ci, 4, ((MOI.VectorAffineFunction{Float64}, MOI.RotatedSecondOrderCone, 0),
201207
(MOI.ScalarAffineFunction{Float64}, MOI.LessThan{Float64}, 1)))
202208
end
@@ -209,7 +215,9 @@ end
209215
MOIT.soc1vtest(bridgedmock, config)
210216
MOIT.soc1ftest(bridgedmock, config)
211217
ci = first(MOI.get(bridgedmock, MOI.ListOfConstraintIndices{MOI.VectorAffineFunction{Float64}, MOI.SecondOrderCone}()))
212-
@test_broken !MOI.canmodify(bridgedmock, typeof(ci), MOI.VectorConstantChange{Float64})
218+
@test !MOI.canmodify(bridgedmock, typeof(ci), MOI.VectorConstantChange{Float64})
219+
@test !MOI.canset(bridgedmock, MOI.ConstraintSet(), typeof(ci))
220+
@test !MOI.canset(bridgedmock, MOI.ConstraintFunction(), typeof(ci))
213221
test_delete_bridge(bridgedmock, ci, 3, ((MOI.VectorAffineFunction{Float64}, MOI.PositiveSemidefiniteConeTriangle, 0),))
214222
end
215223

@@ -223,7 +231,9 @@ end
223231
(MOI.VectorAffineFunction{Float64}, MOI.PositiveSemidefiniteConeTriangle) => [[2, -1/2, 2/8, -1/2, 2/8, 2/8]])
224232
MOIT.rotatedsoc1ftest(bridgedmock, config)
225233
ci = first(MOI.get(bridgedmock, MOI.ListOfConstraintIndices{MOI.VectorAffineFunction{Float64}, MOI.RotatedSecondOrderCone}()))
226-
@test_broken !MOI.canmodify(bridgedmock, typeof(ci), MOI.VectorConstantChange{Float64})
234+
@test !MOI.canmodify(bridgedmock, typeof(ci), MOI.VectorConstantChange{Float64})
235+
@test !MOI.canset(bridgedmock, MOI.ConstraintSet(), typeof(ci))
236+
@test !MOI.canset(bridgedmock, MOI.ConstraintFunction(), typeof(ci))
227237
test_delete_bridge(bridgedmock, ci, 2, ((MOI.VectorAffineFunction{Float64}, MOI.PositiveSemidefiniteConeTriangle, 0),))
228238
end
229239

@@ -235,7 +245,9 @@ end
235245
# Dual is not yet implemented for LogDet bridge
236246
@test !MOI.canget(bridgedmock, MOI.ConstraintDual(), MOI.ConstraintIndex{MOI.VectorAffineFunction{Float64}, MOI.LogDetConeTriangle})
237247
ci = first(MOI.get(bridgedmock, MOI.ListOfConstraintIndices{MOI.VectorAffineFunction{Float64}, MOI.LogDetConeTriangle}()))
238-
@test_broken !MOI.canmodify(bridgedmock, typeof(ci), MOI.VectorConstantChange{Float64})
248+
@test !MOI.canmodify(bridgedmock, typeof(ci), MOI.VectorConstantChange{Float64})
249+
@test !MOI.canset(bridgedmock, MOI.ConstraintSet(), typeof(ci))
250+
@test !MOI.canset(bridgedmock, MOI.ConstraintFunction(), typeof(ci))
239251
test_delete_bridge(bridgedmock, ci, 4, ((MOI.VectorAffineFunction{Float64}, MOI.ExponentialCone, 0), (MOI.VectorAffineFunction{Float64}, MOI.PositiveSemidefiniteConeTriangle, 0)))
240252
end
241253

@@ -247,7 +259,9 @@ end
247259
# Dual is not yet implemented for RootDet bridge
248260
@test !MOI.canget(bridgedmock, MOI.ConstraintDual(), MOI.ConstraintIndex{MOI.VectorAffineFunction{Float64}, MOI.RootDetConeTriangle})
249261
ci = first(MOI.get(bridgedmock, MOI.ListOfConstraintIndices{MOI.VectorAffineFunction{Float64}, MOI.RootDetConeTriangle}()))
250-
@test_broken !MOI.canmodify(bridgedmock, typeof(ci), MOI.VectorConstantChange{Float64})
262+
@test !MOI.canmodify(bridgedmock, typeof(ci), MOI.VectorConstantChange{Float64})
263+
@test !MOI.canset(bridgedmock, MOI.ConstraintSet(), typeof(ci))
264+
@test !MOI.canset(bridgedmock, MOI.ConstraintFunction(), typeof(ci))
251265
test_delete_bridge(bridgedmock, ci, 4, ((MOI.VectorAffineFunction{Float64}, MOI.RotatedSecondOrderCone, 0),
252266
(MOI.VectorAffineFunction{Float64}, MOI.GeometricMeanCone, 0),
253267
(MOI.VectorAffineFunction{Float64}, MOI.PositiveSemidefiniteConeTriangle, 0)))

0 commit comments

Comments
 (0)