Skip to content

Commit 87406b4

Browse files
authored
Fix deletion methods (#175)
* Fix deletion methods * fix vector affine case * add better deletion test * fix tests * fix * improve edge case
1 parent fd9587e commit 87406b4

File tree

3 files changed

+111
-7
lines changed

3 files changed

+111
-7
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "ParametricOptInterface"
22
uuid = "0ce4ce61-57bf-432b-a095-efac525d185e"
33
authors = ["Tomás Gutierrez <[email protected]>"]
4-
version = "0.11.0"
4+
version = "0.11.1"
55

66
[deps]
77
MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee"

src/MOI_wrapper.jl

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -843,8 +843,8 @@ function MOI.delete(
843843
if haskey(model.quadratic_outer_to_inner, c)
844844
ci_inner = model.quadratic_outer_to_inner[c]
845845
delete!(model.quadratic_outer_to_inner, c)
846-
delete!(model.quadratic_constraint_cache, c)
847-
delete!(model.quadratic_constraint_cache_set, c)
846+
delete!(model.quadratic_constraint_cache, ci_inner)
847+
delete!(model.quadratic_constraint_cache_set, ci_inner)
848848
MOI.delete(model.optimizer, ci_inner)
849849
else
850850
MOI.delete(model.optimizer, c)
@@ -860,8 +860,8 @@ function MOI.delete(
860860
if haskey(model.affine_outer_to_inner, c)
861861
ci_inner = model.affine_outer_to_inner[c]
862862
delete!(model.affine_outer_to_inner, c)
863-
delete!(model.affine_constraint_cache, c)
864-
delete!(model.affine_constraint_cache_set, c)
863+
delete!(model.affine_constraint_cache, ci_inner)
864+
delete!(model.affine_constraint_cache_set, ci_inner)
865865
MOI.delete(model.optimizer, ci_inner)
866866
else
867867
MOI.delete(model.optimizer, c)
@@ -883,9 +883,14 @@ function MOI.delete(
883883
model::Optimizer,
884884
c::MOI.ConstraintIndex{F,S},
885885
) where {F<:MOI.VectorAffineFunction,S<:MOI.AbstractSet}
886-
MOI.delete(model.optimizer, c)
886+
ci_inner = model.constraint_outer_to_inner[c]
887+
if haskey(model.vector_affine_constraint_cache, ci_inner)
888+
delete!(model.vector_affine_constraint_cache, ci_inner)
889+
MOI.delete(model.optimizer, ci_inner)
890+
else
891+
MOI.delete(model.optimizer, c)
892+
end
887893
delete!(model.constraint_outer_to_inner, c)
888-
delete!(model.vector_affine_constraint_cache, c)
889894
return
890895
end
891896

test/jump_tests.jl

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,105 @@ function test_jump_dual_delete_constraint()
753753
return
754754
end
755755

756+
function test_jump_dual_delete_constraint_2()
757+
model = Model(() -> POI.Optimizer(GLPK.Optimizer()))
758+
@variable(model, α in MOI.Parameter(1.0))
759+
@variable(model, β in MOI.Parameter(0.0))
760+
@variable(model, x)
761+
list = []
762+
cref = @constraint(model, x >= 1 * 1)
763+
push!(list, cref)
764+
cref = @constraint(model, x >= 9 * α)
765+
push!(list, cref)
766+
cref = @constraint(model, x >= 8 * α + β^2)
767+
push!(list, cref)
768+
cref = @constraint(model, x >= 7 * 1)
769+
push!(list, cref)
770+
cref = @constraint(model, x >= 6 * α)
771+
push!(list, cref)
772+
cref = @constraint(model, x >= 5 * α + β^2)
773+
push!(list, cref)
774+
cref = @constraint(model, x >= 4 * 1)
775+
push!(list, cref)
776+
cref = @constraint(model, x >= 3 * α)
777+
push!(list, cref)
778+
cref = @constraint(model, x >= 2 * α + β^2)
779+
push!(list, cref)
780+
@objective(model, Min, x)
781+
cref1 = popfirst!(list)
782+
for i in 9:-1:2
783+
JuMP.optimize!(model)
784+
@test JuMP.value(x) == 1.0 * i
785+
@test JuMP.dual(cref1) == 0.0
786+
for con in list[2:end]
787+
@test JuMP.dual(con) == 0.0
788+
end
789+
@test JuMP.dual(list[1]) == 1.0
790+
if i in [7, 4]
791+
@test MOI.get(model, POI.ParameterDual(), α) == 0.0
792+
else
793+
@test MOI.get(model, POI.ParameterDual(), α) == 1.0 * i
794+
end
795+
con = popfirst!(list)
796+
JuMP.delete(model, con)
797+
end
798+
return
799+
end
800+
801+
function test_jump_dual_delete_constraint_3()
802+
cached = MOI.Utilities.CachingOptimizer(
803+
MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()),
804+
SCS.Optimizer(),
805+
)
806+
optimizer = POI.Optimizer(cached)
807+
model = direct_model(optimizer)
808+
set_silent(model)
809+
list = []
810+
@variable(model, α in MOI.Parameter(1.0))
811+
@variable(model, β in MOI.Parameter(0.0))
812+
@variable(model, x)
813+
cref = @constraint(model, [x - 1 * 1] in MOI.Nonnegatives(1))
814+
push!(list, cref)
815+
cref = @constraint(model, [x - 9 * α] in MOI.Nonnegatives(1))
816+
push!(list, cref)
817+
# cref = @constraint(model, [x - 8 * α + β^2] in MOI.Nonnegatives(1))
818+
cref = @constraint(model, [x - 8 * α + β] in MOI.Nonnegatives(1))
819+
push!(list, cref)
820+
cref = @constraint(model, [x - 7 * 1] in MOI.Nonnegatives(1))
821+
push!(list, cref)
822+
cref = @constraint(model, [x - 6 * α] in MOI.Nonnegatives(1))
823+
push!(list, cref)
824+
# cref = @constraint(model, [x - 5 * α + β^2] in MOI.Nonnegatives(1))
825+
cref = @constraint(model, [x - 5 * α + β] in MOI.Nonnegatives(1))
826+
push!(list, cref)
827+
cref = @constraint(model, [x - 4 * 1] in MOI.Nonnegatives(1))
828+
push!(list, cref)
829+
cref = @constraint(model, [x - 3 * α] in MOI.Nonnegatives(1))
830+
push!(list, cref)
831+
# cref = @constraint(model, [x - 2 * α + β^2] in MOI.Nonnegatives(1))
832+
cref = @constraint(model, [x - 2 * α + β] in MOI.Nonnegatives(1))
833+
push!(list, cref)
834+
@objective(model, Min, 1.0 * x)
835+
cref1 = popfirst!(list)
836+
for i in 9:-1:2
837+
JuMP.optimize!(model)
838+
@test JuMP.value(x) 1.0 * i atol = 1e-5
839+
@test JuMP.dual(cref1)[] 0.0 atol = 1e-5
840+
for con in list[2:end]
841+
@test JuMP.dual(con)[] 0.0 atol = 1e-5
842+
end
843+
@test JuMP.dual(list[1])[] 1.0 atol = 1e-5
844+
if i in [7, 4]
845+
@test MOI.get(model, POI.ParameterDual(), α) 0.0 atol = 1e-5
846+
else
847+
@test MOI.get(model, POI.ParameterDual(), α) 1.0 * i atol = 1e-5
848+
end
849+
con = popfirst!(list)
850+
JuMP.delete(model, con)
851+
end
852+
return
853+
end
854+
756855
function test_jump_nlp()
757856
model = Model(() -> ParametricOptInterface.Optimizer(Ipopt.Optimizer()))
758857
@variable(model, x)

0 commit comments

Comments
 (0)