Skip to content

Commit 0263677

Browse files
committed
Update UniversalFallback delete
1 parent d6666a4 commit 0263677

File tree

2 files changed

+129
-13
lines changed

2 files changed

+129
-13
lines changed

src/Utilities/universalfallback.jl

Lines changed: 69 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -73,30 +73,86 @@ function MOI.delete(uf::UniversalFallback, ci::CI{F, S}) where {F, S}
7373
throw(MOI.InvalidIndex(ci))
7474
end
7575
delete!(uf.constraints[(F, S)], ci)
76-
if haskey(uf.con_to_name, ci)
77-
delete!(uf.con_to_name, ci)
78-
end
76+
delete!(uf.con_to_name, ci)
7977
uf.name_to_con = nothing
8078
end
8179
for d in values(uf.conattr)
8280
delete!(d, ci)
8381
end
8482
end
83+
function _remove_variable(uf::UniversalFallback,
84+
constraints::Dict{<:CI{MOI.SingleVariable}}, vi::VI)
85+
to_delete = keytype(constraints)[]
86+
for (ci, constraint) in constraints
87+
f::MOI.SingleVariable = constraint[1]
88+
if f.variable == vi
89+
push!(to_delete, ci)
90+
end
91+
end
92+
MOI.delete(uf, to_delete)
93+
end
94+
function _remove_variable(uf::UniversalFallback,
95+
constraints::Dict{CI{MOI.VectorOfVariables, S}},
96+
vi::VI) where S
97+
to_delete = keytype(constraints)[]
98+
for (ci, constraint) in constraints
99+
f::MOI.VectorOfVariables, s = constraint
100+
if vi in f.variables
101+
if length(f.variables) > 1
102+
if S <: MOIU.DimensionUpdatableSets
103+
constraints[ci] = remove_variable(f, s, vi)
104+
else
105+
throw_delete_variable_in_vov(vi)
106+
end
107+
else
108+
push!(to_delete, ci)
109+
end
110+
end
111+
end
112+
MOI.delete(uf, to_delete)
113+
end
114+
function _remove_variable(::UniversalFallback, constraints::Dict{<:CI}, vi::VI)
115+
for (ci, constraint) in constraints
116+
f, s = constraint
117+
constraints[ci] = remove_variable(f, s, vi)
118+
end
119+
end
120+
function _remove_vector_of_variables(
121+
uf::UniversalFallback, constraints::Dict{<:CI{MOI.VectorOfVariables}},
122+
vis::Vector{VI}
123+
)
124+
to_delete = keytype(constraints)[]
125+
for (ci, constraint) in constraints
126+
f::MOI.VectorOfVariables = constraint[1]
127+
if vis == f.variables
128+
push!(to_delete, ci)
129+
end
130+
end
131+
MOI.delete(uf, to_delete)
132+
end
133+
function _remove_vector_of_variables(
134+
::UniversalFallback, ::Dict{<:CI}, ::Vector{VI})
135+
end
85136
function MOI.delete(uf::UniversalFallback, vi::VI)
86137
MOI.delete(uf.model, vi)
87138
for d in values(uf.varattr)
88139
delete!(d, vi)
89140
end
90-
for (FS, constraints) in uf.constraints
91-
for (ci, constraint) in constraints
92-
f, s = constraint
93-
if f isa MOI.SingleVariable
94-
if f.variable == vi
95-
delete!(constraints, ci)
96-
end
97-
else
98-
constraints[ci] = remove_variable(f, s, vi)
99-
end
141+
for (_, constraints) in uf.constraints
142+
_remove_variable(uf, constraints, vi)
143+
end
144+
end
145+
function MOI.delete(uf::UniversalFallback, vis::Vector{VI})
146+
MOI.delete(uf.model, vis)
147+
for d in values(uf.varattr)
148+
for vi in vis
149+
delete!(d, vi)
150+
end
151+
end
152+
for (_, constraints) in uf.constraints
153+
_remove_vector_of_variables(uf, constraints, vis)
154+
for vi in vis
155+
_remove_variable(uf, constraints, vi)
100156
end
101157
end
102158
end

test/Utilities/universalfallback.jl

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,3 +204,63 @@ end
204204
"a name")
205205
@test_throws Exception MOI.get(uf, MOI.ConstraintIndex, "a name")
206206
end
207+
208+
@testset "Delete" begin
209+
model = ModelForUniversalFallback{Float64}()
210+
uf = MOIU.UniversalFallback(model)
211+
x, cx = MOI.add_constrained_variable(uf, MOI.GreaterThan(0.0))
212+
y, cy = MOI.add_constrained_variables(uf, MOI.Nonpositives(4))
213+
@test MOI.is_valid(uf, x)
214+
@test MOI.is_valid(uf, y[1])
215+
@test MOI.is_valid(uf, y[2])
216+
@test MOI.is_valid(uf, y[3])
217+
@test MOI.is_valid(uf, y[4])
218+
@test MOI.is_valid(uf, cx)
219+
@test MOI.is_valid(uf, cy)
220+
@test MOI.get(uf, MOI.ConstraintFunction(), cx) == MOI.SingleVariable(x)
221+
@test MOI.get(uf, MOI.ConstraintSet(), cx) == MOI.GreaterThan(0.0)
222+
@test MOI.get(uf, MOI.ConstraintFunction(), cy) == MOI.VectorOfVariables(y)
223+
@test MOI.get(uf, MOI.ConstraintSet(), cy) == MOI.Nonpositives(4)
224+
MOI.delete(uf, y[3])
225+
@test MOI.is_valid(uf, x)
226+
@test MOI.is_valid(uf, y[1])
227+
@test MOI.is_valid(uf, y[2])
228+
@test !MOI.is_valid(uf, y[3])
229+
@test MOI.is_valid(uf, y[4])
230+
@test MOI.is_valid(uf, cx)
231+
@test MOI.is_valid(uf, cy)
232+
@test MOI.get(uf, MOI.ConstraintFunction(), cx) == MOI.SingleVariable(x)
233+
@test MOI.get(uf, MOI.ConstraintSet(), cx) == MOI.GreaterThan(0.0)
234+
@test MOI.get(uf, MOI.ConstraintFunction(), cy) == MOI.VectorOfVariables(y[[1, 2, 4]])
235+
@test MOI.get(uf, MOI.ConstraintSet(), cy) == MOI.Nonpositives(3)
236+
MOI.delete(uf, y[1])
237+
@test MOI.is_valid(uf, x)
238+
@test !MOI.is_valid(uf, y[1])
239+
@test MOI.is_valid(uf, y[2])
240+
@test !MOI.is_valid(uf, y[3])
241+
@test MOI.is_valid(uf, y[4])
242+
@test MOI.is_valid(uf, cx)
243+
@test MOI.is_valid(uf, cy)
244+
@test MOI.get(uf, MOI.ConstraintFunction(), cx) == MOI.SingleVariable(x)
245+
@test MOI.get(uf, MOI.ConstraintSet(), cx) == MOI.GreaterThan(0.0)
246+
@test MOI.get(uf, MOI.ConstraintFunction(), cy) == MOI.VectorOfVariables(y[[2, 4]])
247+
@test MOI.get(uf, MOI.ConstraintSet(), cy) == MOI.Nonpositives(2)
248+
MOI.delete(uf, x)
249+
@test !MOI.is_valid(uf, x)
250+
@test !MOI.is_valid(uf, y[1])
251+
@test MOI.is_valid(uf, y[2])
252+
@test !MOI.is_valid(uf, y[3])
253+
@test MOI.is_valid(uf, y[4])
254+
@test !MOI.is_valid(uf, cx)
255+
@test MOI.is_valid(uf, cy)
256+
@test MOI.get(uf, MOI.ConstraintFunction(), cy) == MOI.VectorOfVariables(y[[2, 4]])
257+
@test MOI.get(uf, MOI.ConstraintSet(), cy) == MOI.Nonpositives(2)
258+
MOI.delete(uf, y[[2, 4]])
259+
@test !MOI.is_valid(uf, x)
260+
@test !MOI.is_valid(uf, y[1])
261+
@test !MOI.is_valid(uf, y[2])
262+
@test !MOI.is_valid(uf, y[3])
263+
@test !MOI.is_valid(uf, y[4])
264+
@test !MOI.is_valid(uf, cx)
265+
@test !MOI.is_valid(uf, cy)
266+
end

0 commit comments

Comments
 (0)