Skip to content

Commit f7a7c0e

Browse files
authored
[Bridges] fix deleting variable in bridged objective (#2147)
1 parent f475b40 commit f7a7c0e

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

src/Bridges/bridge_optimizer.jl

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,15 @@ function _delete_variables_in_variables_constraints(
546546
end
547547

548548
function MOI.delete(b::AbstractBridgeOptimizer, vis::Vector{MOI.VariableIndex})
549+
F = MOI.get(b, MOI.ObjectiveFunctionType())
550+
if is_objective_bridged(b) && F == MOI.VectorOfVariables
551+
f = MOI.get(b, MOI.ObjectiveFunction{MOI.VectorOfVariables}())
552+
discard = Base.Fix2(in, vis)
553+
if any(discard, f.variables)
554+
g = MOI.VectorOfVariables(filter(!discard, f.variables))
555+
MOI.set(b, MOI.ObjectiveFunction{MOI.VectorOfVariables}(), g)
556+
end
557+
end
549558
if Constraint.has_bridges(Constraint.bridges(b))
550559
_delete_variables_in_variables_constraints(b, vis)
551560
end
@@ -575,6 +584,14 @@ function MOI.delete(b::AbstractBridgeOptimizer, vis::Vector{MOI.VariableIndex})
575584
end
576585

577586
function MOI.delete(b::AbstractBridgeOptimizer, vi::MOI.VariableIndex)
587+
F = MOI.get(b, MOI.ObjectiveFunctionType())
588+
if is_objective_bridged(b) && F == MOI.VectorOfVariables
589+
f = MOI.get(b, MOI.ObjectiveFunction{MOI.VectorOfVariables}())
590+
if any(isequal(vi), f.variables)
591+
g = MOI.VectorOfVariables(filter(!isequal(vi), f.variables))
592+
MOI.set(b, MOI.ObjectiveFunction{MOI.VectorOfVariables}(), g)
593+
end
594+
end
578595
if Constraint.has_bridges(Constraint.bridges(b))
579596
_delete_variables_in_variables_constraints(b, [vi])
580597
end
@@ -600,6 +617,7 @@ function MOI.delete(b::AbstractBridgeOptimizer, vi::MOI.VariableIndex)
600617
else
601618
MOI.delete(b.model, vi)
602619
end
620+
return
603621
end
604622

605623
function MOI.delete(b::AbstractBridgeOptimizer, ci::MOI.ConstraintIndex)

test/Bridges/bridge_optimizer.jl

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -955,6 +955,30 @@ function test_delete_constraint_vector()
955955
return
956956
end
957957

958+
function test_deleting_variable_in_bridged_objective()
959+
inner = MOI.Utilities.Model{Float64}()
960+
model = MOI.Bridges.Objective.VectorFunctionize{Float64}(inner)
961+
x = MOI.add_variables(model, 2)
962+
MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE)
963+
attr = MOI.ObjectiveFunction{MOI.VectorOfVariables}()
964+
MOI.set(model, attr, MOI.VectorOfVariables(x))
965+
MOI.delete(model, x[1])
966+
@test MOI.get(model, attr) == MOI.VectorOfVariables([x[2]])
967+
return
968+
end
969+
970+
function test_deleting_variables_in_bridged_objective()
971+
inner = MOI.Utilities.Model{Float64}()
972+
model = MOI.Bridges.Objective.VectorFunctionize{Float64}(inner)
973+
x = MOI.add_variables(model, 2)
974+
MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE)
975+
attr = MOI.ObjectiveFunction{MOI.VectorOfVariables}()
976+
MOI.set(model, attr, MOI.VectorOfVariables(x))
977+
MOI.delete(model, [x[1]])
978+
@test MOI.get(model, attr) == MOI.VectorOfVariables([x[2]])
979+
return
980+
end
981+
958982
end # module
959983

960984
TestBridgeOptimizer.runtests()

0 commit comments

Comments
 (0)