@@ -545,15 +545,67 @@ function _delete_variables_in_variables_constraints(
545545 end
546546end
547547
548- function MOI. delete (b:: AbstractBridgeOptimizer , vis:: Vector{MOI.VariableIndex} )
548+ function _delete_variables_in_bridged_objective (
549+ b:: AbstractBridgeOptimizer ,
550+ vis:: Vector{MOI.VariableIndex} ,
551+ )
549552 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
553+ _delete_variables_in_bridged_objective (b, vis, F)
554+ return
555+ end
556+
557+ function _delete_variables_in_bridged_objective (
558+ b:: AbstractBridgeOptimizer ,
559+ vis:: Vector{MOI.VariableIndex} ,
560+ :: Type{MOI.VectorOfVariables} ,
561+ )
562+ obj_f = MOI. get (b, MOI. ObjectiveFunction {MOI.VectorOfVariables} ())
563+ discard = Base. Fix2 (in, vis)
564+ if ! any (discard, obj_f. variables)
565+ # There are no variables in the objective function to delete, so we
566+ # don't need to do anything.
567+ return
568+ end
569+ new_obj_f = MOI. VectorOfVariables (filter (! discard, obj_f. variables))
570+ if MOI. output_dimension (new_obj_f) == 0
571+ # We've deleted all variables in the objective. Zero the objective by
572+ # setting FEASIBILITY_SENSE, but restore the sense afterwards.
573+ sense = MOI. get (b, MOI. ObjectiveSense ())
574+ MOI. set (b, MOI. ObjectiveSense (), MOI. FEASIBILITY_SENSE)
575+ MOI. set (b, MOI. ObjectiveSense (), sense)
576+ else
577+ MOI. set (b, MOI. ObjectiveFunction {MOI.VectorOfVariables} (), new_obj_f)
578+ end
579+ return
580+ end
581+
582+ function _delete_variables_in_bridged_objective (
583+ b:: AbstractBridgeOptimizer ,
584+ vis:: Vector{MOI.VariableIndex} ,
585+ :: Type{MOI.VariableIndex} ,
586+ )
587+ obj_f = MOI. get (b, MOI. ObjectiveFunction {MOI.VariableIndex} ())
588+ if obj_f in vis
589+ sense = MOI. get (b, MOI. ObjectiveSense ())
590+ MOI. set (b, MOI. ObjectiveSense (), MOI. FEASIBILITY_SENSE)
591+ MOI. set (b, MOI. ObjectiveSense (), sense)
592+ end
593+ return
594+ end
595+
596+ function _delete_variables_in_bridged_objective (
597+ :: AbstractBridgeOptimizer ,
598+ :: Vector{MOI.VariableIndex} ,
599+ :: Type{F} ,
600+ ) where {F}
601+ # Nothing to do here. The variables can be deleted without changing the type
602+ # of the objective, or whether one exists.
603+ return
604+ end
605+
606+ function MOI. delete (b:: AbstractBridgeOptimizer , vis:: Vector{MOI.VariableIndex} )
607+ if is_objective_bridged (b)
608+ _delete_variables_in_bridged_objective (b, vis)
557609 end
558610 if Constraint. has_bridges (Constraint. bridges (b))
559611 _delete_variables_in_variables_constraints (b, vis)
@@ -584,13 +636,8 @@ function MOI.delete(b::AbstractBridgeOptimizer, vis::Vector{MOI.VariableIndex})
584636end
585637
586638function 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
639+ if is_objective_bridged (b)
640+ _delete_variables_in_bridged_objective (b, [vi])
594641 end
595642 if Constraint. has_bridges (Constraint. bridges (b))
596643 _delete_variables_in_variables_constraints (b, [vi])
0 commit comments