Skip to content

Commit 2c9894c

Browse files
authored
[Bridges] fix deleting bridges before final touch (#2678)
1 parent 212256d commit 2c9894c

File tree

6 files changed

+55
-0
lines changed

6 files changed

+55
-0
lines changed

src/Bridges/Constraint/bridges/IndicatorToMILPBridge.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,9 @@ function MOI.delete(
126126
model::MOI.ModelLike,
127127
bridge::IndicatorToMILPBridge{T},
128128
) where {T}
129+
if bridge.slack === nothing
130+
return # We're deleting the bridge before final_touch
131+
end
129132
MOI.delete.(model, bridge.slack_bounds)
130133
MOI.delete(model, bridge.constraint)
131134
MOI.delete(model, bridge.slack::MOI.VariableIndex)

src/Bridges/Constraint/bridges/SOS1ToMILPBridge.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,9 @@ function MOI.get(::MOI.ModelLike, ::MOI.ConstraintSet, bridge::SOS1ToMILPBridge)
116116
end
117117

118118
function MOI.delete(model::MOI.ModelLike, bridge::SOS1ToMILPBridge)
119+
if isempty(bridge.variables)
120+
return # We're deleting the bridge before final_touch
121+
end
119122
MOI.delete(model, bridge.equal_to)
120123
for ci in bridge.less_than
121124
MOI.delete(model, ci)

src/Bridges/Constraint/bridges/SOS2ToMILPBridge.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,9 @@ function MOI.get(::MOI.ModelLike, ::MOI.ConstraintSet, bridge::SOS2ToMILPBridge)
116116
end
117117

118118
function MOI.delete(model::MOI.ModelLike, bridge::SOS2ToMILPBridge)
119+
if isempty(bridge.variables)
120+
return # We're deleting the bridge before final_touch
121+
end
119122
MOI.delete(model, bridge.equal_to)
120123
for ci in bridge.less_than
121124
MOI.delete(model, ci)

test/Bridges/Constraint/IndicatorToMILPBridge.jl

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,22 @@ function test_runtests_error_affine()
288288
return
289289
end
290290

291+
function test_delete_before_final_touch()
292+
model = MOI.Bridges.Constraint.IndicatorToMILP{Float64}(
293+
MOI.Utilities.Model{Float64}(),
294+
)
295+
x = MOI.add_variables(model, 2)
296+
MOI.add_constraint(model, x[1], MOI.ZeroOne())
297+
c = MOI.add_constraint(
298+
model,
299+
MOI.VectorOfVariables(x),
300+
MOI.Indicator{MOI.ACTIVATE_ON_ZERO}(MOI.GreaterThan(2.0)),
301+
)
302+
MOI.delete(model, c)
303+
@test !MOI.is_valid(model, c)
304+
return
305+
end
306+
291307
end # module
292308

293309
TestConstraintIndicatorToMILP.runtests()

test/Bridges/Constraint/SOS1ToMILPBridge.jl

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,21 @@ function test_runtests_error_affine()
119119
return
120120
end
121121

122+
function test_delete_before_final_touch()
123+
model = MOI.Bridges.Constraint.SOS1ToMILP{Float64}(
124+
MOI.Utilities.Model{Float64}(),
125+
)
126+
x = MOI.add_variables(model, 2)
127+
c = MOI.add_constraint(
128+
model,
129+
MOI.VectorOfVariables(x),
130+
MOI.SOS1([1.0, 2.0]),
131+
)
132+
MOI.delete(model, c)
133+
@test !MOI.is_valid(model, c)
134+
return
135+
end
136+
122137
end # module
123138

124139
TestConstraintSOS1ToMILP.runtests()

test/Bridges/Constraint/SOS2ToMILPBridge.jl

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,21 @@ function test_runtests_error_affine()
129129
return
130130
end
131131

132+
function test_delete_before_final_touch()
133+
model = MOI.Bridges.Constraint.SOS2ToMILP{Float64}(
134+
MOI.Utilities.Model{Float64}(),
135+
)
136+
x = MOI.add_variables(model, 2)
137+
c = MOI.add_constraint(
138+
model,
139+
MOI.VectorOfVariables(x),
140+
MOI.SOS2([1.0, 2.0]),
141+
)
142+
MOI.delete(model, c)
143+
@test !MOI.is_valid(model, c)
144+
return
145+
end
146+
132147
end # module
133148

134149
TestConstraintSOS2ToMILP.runtests()

0 commit comments

Comments
 (0)