Skip to content

Commit c389e3a

Browse files
authored
[Utilities] ignore attributes in UniversalFallback if set to nothing (#2575)
1 parent d066d0d commit c389e3a

File tree

2 files changed

+41
-30
lines changed

2 files changed

+41
-30
lines changed

src/Utilities/universalfallback.jl

+12-7
Original file line numberDiff line numberDiff line change
@@ -486,8 +486,10 @@ function MOI.get(
486486
listattr::MOI.ListOfVariableAttributesSet,
487487
)
488488
list = MOI.get(uf.model, listattr)
489-
for attr in keys(uf.varattr)
490-
push!(list, attr)
489+
for (attr, dict) in uf.varattr
490+
if !isempty(dict)
491+
push!(list, attr)
492+
end
491493
end
492494
return list
493495
end
@@ -498,7 +500,7 @@ function MOI.get(
498500
) where {F,S}
499501
list = MOI.get(uf.model, listattr)
500502
for (attr, dict) in uf.conattr
501-
if any(k -> k isa MOI.ConstraintIndex{F,S}, keys(dict))
503+
if any(Base.Fix2(isa, MOI.ConstraintIndex{F,S}), keys(dict))
502504
push!(list, attr)
503505
end
504506
end
@@ -694,17 +696,20 @@ function MOI.get(
694696
)
695697
end
696698

699+
_set_or_delete(dict, key, value) = (dict[key] = value)
700+
_set_or_delete(dict, key, ::Nothing) = delete!(dict, key)
701+
697702
function _set(
698703
uf::UniversalFallback,
699704
attr::MOI.AbstractOptimizerAttribute,
700705
value,
701706
)
702-
uf.optattr[attr] = value
707+
_set_or_delete(uf.optattr, attr, value)
703708
return
704709
end
705710

706711
function _set(uf::UniversalFallback, attr::MOI.AbstractModelAttribute, value)
707-
uf.modattr[attr] = value
712+
_set_or_delete(uf.modattr, attr, value)
708713
return
709714
end
710715

@@ -717,7 +722,7 @@ function _set(
717722
if !haskey(uf.varattr, attr)
718723
uf.varattr[attr] = Dict{MOI.VariableIndex,Any}()
719724
end
720-
uf.varattr[attr][vi] = value
725+
_set_or_delete(uf.varattr[attr], vi, value)
721726
return
722727
end
723728

@@ -730,7 +735,7 @@ function _set(
730735
if !haskey(uf.conattr, attr)
731736
uf.conattr[attr] = Dict{MOI.ConstraintIndex,Any}()
732737
end
733-
uf.conattr[attr][ci] = value
738+
_set_or_delete(uf.conattr[attr], ci, value)
734739
return
735740
end
736741

test/Utilities/universalfallback.jl

+29-23
Original file line numberDiff line numberDiff line change
@@ -89,21 +89,32 @@ function test_MOI_Test()
8989
return
9090
end
9191

92-
function _test_Optimizer_Model_attributes(uf, model, attr, listattr)
92+
function _test_Optimizer_Model_attributes(
93+
uf::MOI.Utilities.UniversalFallback,
94+
model::MOI.ModelLike,
95+
attr::Union{MOI.AbstractOptimizerAttribute,MOI.AbstractModelAttribute},
96+
list::Union{MOI.ListOfOptimizerAttributesSet,MOI.ListOfModelAttributesSet},
97+
)
9398
@test !MOI.supports(model, attr)
9499
@test MOI.supports(uf, attr)
95-
@test isempty(MOI.get(uf, listattr))
100+
@test isempty(MOI.get(uf, list))
96101
MOI.set(uf, attr, 0)
97102
@test MOI.get(uf, attr) == 0
98-
@test MOI.get(uf, listattr) == [attr]
103+
@test MOI.get(uf, list) == [attr]
104+
MOI.set(uf, attr, nothing)
105+
@test isempty(MOI.get(uf, list))
106+
MOI.set(uf, attr, 0)
99107
return
100108
end
101109

102110
function _test_Variable_Constraint_attributes(
103-
uf,
104-
model,
105-
attr,
106-
listattr,
111+
uf::MOI.Utilities.UniversalFallback,
112+
model::MOI.ModelLike,
113+
attr::Union{MOI.AbstractVariableAttribute,MOI.AbstractConstraintAttribute},
114+
listattr::Union{
115+
MOI.ListOfVariableAttributesSet,
116+
MOI.ListOfConstraintAttributesSet,
117+
},
107118
I::Type{<:MOI.Index},
108119
addfun,
109120
x,
@@ -114,6 +125,11 @@ function _test_Variable_Constraint_attributes(
114125
@test MOI.supports(uf, attr, I)
115126
@test isempty(MOI.get(uf, listattr))
116127
MOI.set(uf, attr, [x, y], [2, 0])
128+
@test MOI.get(uf, listattr) == [attr]
129+
MOI.set(uf, attr, x, nothing)
130+
MOI.set(uf, attr, y, nothing)
131+
@test isempty(MOI.get(uf, listattr))
132+
MOI.set(uf, attr, [x, y], [2, 0])
117133
@test MOI.get(uf, attr, z) === nothing
118134
@test !MOI.is_empty(uf)
119135
@test MOI.get(uf, listattr) == [attr]
@@ -235,18 +251,13 @@ function test_supported_constraint_attributes()
235251
cx = _add_constraint(uf, x, 0.0)
236252
cy = _add_constraint(uf, y, 1.0)
237253
cz = _add_constraint(uf, z, 2.0)
254+
F, S = MOI.ScalarAffineFunction{Float64}, MOI.LessThan{Float64}
238255
_test_Variable_Constraint_attributes(
239256
uf,
240257
model,
241258
MOI.Test.UnknownConstraintAttribute(),
242-
MOI.ListOfConstraintAttributesSet{
243-
MOI.ScalarAffineFunction{Float64},
244-
MOI.LessThan{Float64},
245-
}(),
246-
MOI.ConstraintIndex{
247-
MOI.ScalarAffineFunction{Float64},
248-
MOI.LessThan{Float64},
249-
},
259+
MOI.ListOfConstraintAttributesSet{F,S}(),
260+
MOI.ConstraintIndex{F,S},
250261
uf -> _add_constraint(uf, x, 0.0),
251262
cx,
252263
cy,
@@ -282,18 +293,13 @@ function test_unsupported_constraint_attributes()
282293
cx = _add_constraint(uf, x, 0.0)
283294
cy = _add_constraint(uf, y, 1.0)
284295
cz = _add_constraint(uf, z, 2.0)
296+
F, S = MOI.ScalarAffineFunction{Float64}, MOI.EqualTo{Float64}
285297
_test_Variable_Constraint_attributes(
286298
uf,
287299
model,
288300
MOI.Test.UnknownConstraintAttribute(),
289-
MOI.ListOfConstraintAttributesSet{
290-
MOI.ScalarAffineFunction{Float64},
291-
MOI.EqualTo{Float64},
292-
}(),
293-
MOI.ConstraintIndex{
294-
MOI.ScalarAffineFunction{Float64},
295-
MOI.EqualTo{Float64},
296-
},
301+
MOI.ListOfConstraintAttributesSet{F,S}(),
302+
MOI.ConstraintIndex{F,S},
297303
uf -> _add_constraint(uf, x, 0.0),
298304
cx,
299305
cy,

0 commit comments

Comments
 (0)