Skip to content

Commit 5617783

Browse files
blegatodow
andauthored
[Bridges] fix deletion before final_touch (#2974)
Co-authored-by: Oscar Dowson <o.dowson@gmail.com>
1 parent def69e1 commit 5617783

17 files changed

Lines changed: 101 additions & 0 deletions

src/Bridges/Constraint/bridges/BinPackingToMILPBridge.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ function MOI.get(
129129
end
130130

131131
function MOI.delete(model::MOI.ModelLike, bridge::BinPackingToMILPBridge)
132+
# Delete is okay before `final_touch`
132133
MOI.delete.(model, bridge.less_than)
133134
empty!(bridge.less_than)
134135
MOI.delete.(model, bridge.equal_to)

src/Bridges/Constraint/bridges/CountBelongsToMILPBridge.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ function MOI.get(
133133
end
134134

135135
function MOI.delete(model::MOI.ModelLike, bridge::CountBelongsToMILPBridge)
136+
# Delete is okay before `final_touch`
136137
for ci in bridge.equal_to
137138
MOI.delete(model, ci)
138139
end

src/Bridges/Constraint/bridges/CountDistinctToMILPBridge.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ function MOI.get(
172172
end
173173

174174
function MOI.delete(model::MOI.ModelLike, bridge::CountDistinctToMILPBridge)
175+
# Delete is okay before `final_touch`
175176
for ci in bridge.equal_to
176177
MOI.delete(model, ci)
177178
end

src/Bridges/Constraint/bridges/CountGreaterThanToMILPBridge.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ function MOI.get(
108108
end
109109

110110
function MOI.delete(model::MOI.ModelLike, bridge::CountGreaterThanToMILPBridge)
111+
# Delete is okay before `final_touch`
111112
MOI.delete.(model, bridge.greater_than)
112113
empty!(bridge.greater_than)
113114
MOI.delete.(model, bridge.equal_to)

src/Bridges/Constraint/bridges/IntegerToZeroOneBridge.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,9 @@ function MOI.get(::MOI.ModelLike, ::MOI.ConstraintSet, ::IntegerToZeroOneBridge)
103103
end
104104

105105
function MOI.delete(model::MOI.ModelLike, bridge::IntegerToZeroOneBridge)
106+
if bridge.last_bounds === nothing
107+
return # We're deleting the bridge before final_touch
108+
end
106109
MOI.delete(model, bridge.ci)
107110
MOI.delete(model, bridge.y)
108111
return

src/Bridges/Constraint/bridges/ReifiedCountDistinctToMILPBridge.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ function MOI.delete(
169169
model::MOI.ModelLike,
170170
bridge::ReifiedCountDistinctToMILPBridge,
171171
)
172+
# Delete is okay before `final_touch`
172173
for ci in bridge.equal_to
173174
MOI.delete(model, ci)
174175
end

src/Bridges/Constraint/bridges/SemiToBinaryBridge.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ function MOI.get(
186186
end
187187

188188
function MOI.delete(model::MOI.ModelLike, bridge::SemiToBinaryBridge)
189+
# Delete is okay, even though we call `final_touch`
189190
if bridge.integer_index !== nothing
190191
MOI.delete(model, bridge.integer_index)
191192
end

test/Bridges/Constraint/test_BinPackingToMILPBridge.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,19 @@ function test_runtests_error_affine()
142142
return
143143
end
144144

145+
function test_delete_before_final_touch()
146+
inner = MOI.Utilities.Model{Int}()
147+
model = MOI.Bridges.Constraint.BinPackingToMILP{Int}(inner)
148+
x = MOI.add_variables(model, 2)
149+
f = MOI.Utilities.operate(vcat, Int, 2, 1 * x[1], x[2])
150+
c = MOI.add_constraint(model, f, MOI.BinPacking(3, [1, 2, 3]))
151+
MOI.delete(model, c)
152+
@test MOI.is_valid(model, x[1])
153+
@test !MOI.is_valid(model, c)
154+
MOI.Bridges.final_touch(model)
155+
return
156+
end
157+
145158
end # module
146159

147160
TestConstraintBinPacking.runtests()

test/Bridges/Constraint/test_CountBelongsToMILPBridge.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,19 @@ function test_runtests_error_affine()
127127
return
128128
end
129129

130+
function test_delete_before_final_touch()
131+
inner = MOI.Utilities.Model{Int}()
132+
model = MOI.Bridges.Constraint.CountBelongsToMILP{Int}(inner)
133+
x = MOI.add_variables(model, 2)
134+
f = MOI.Utilities.operate(vcat, Int, 2, 1 * x[1], x[2])
135+
c = MOI.add_constraint(model, f, MOI.CountBelongs(3, Set([2, 4])))
136+
MOI.delete(model, c)
137+
@test MOI.is_valid(model, x[1])
138+
@test !MOI.is_valid(model, c)
139+
MOI.Bridges.final_touch(model)
140+
return
141+
end
142+
130143
end # module
131144

132145
TestConstraintCountBelongs.runtests()

test/Bridges/Constraint/test_CountDistinctToMILPBridge.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,19 @@ function test_resolve_with_modified_not_equal_to()
185185
return
186186
end
187187

188+
function test_delete_before_final_touch()
189+
inner = MOI.Utilities.Model{Int}()
190+
model = MOI.Bridges.Constraint.CountDistinctToMILP{Int}(inner)
191+
x = MOI.add_variables(model, 2)
192+
f = MOI.Utilities.operate(vcat, Int, 2, 1 * x[1], x[2])
193+
c = MOI.add_constraint(model, f, MOI.CountDistinct(3))
194+
MOI.delete(model, c)
195+
@test MOI.is_valid(model, x[1])
196+
@test !MOI.is_valid(model, c)
197+
MOI.Bridges.final_touch(model)
198+
return
199+
end
200+
188201
end # module
189202

190203
TestConstraintCountDistinct.runtests()

0 commit comments

Comments
 (0)