@@ -80,18 +80,32 @@ function MOI.supports(
8080 return false
8181end
8282
83+ function _change_set_to_min_if_necessary (
84+ :: Type{T} ,
85+ model:: MOI.ModelLike ,
86+ ) where {T}
87+ sense = MOI. get (model, MOI. ObjectiveSense ())
88+ if sense != MOI. FEASIBILITY_SENSE
89+ return sense
90+ end
91+ MOI. set (model, MOI. ObjectiveSense (), MOI. MIN_SENSE)
92+ f = zero (MOI. ScalarAffineFunction{T})
93+ MOI. set (model, MOI. ObjectiveFunction {typeof(f)} (), f)
94+ return MOI. MIN_SENSE
95+ end
96+
8397function MOI. modify (
8498 model:: MOI.ModelLike ,
8599 ci:: MOI.ConstraintIndex{F,<:MOI.AbstractScalarSet} ,
86100 relax:: ScalarPenaltyRelaxation{T} ,
87101) where {T,F<: Union{MOI.ScalarAffineFunction{T},MOI.ScalarQuadraticFunction{T}} }
102+ sense = _change_set_to_min_if_necessary (T, model)
88103 y = MOI. add_variable (model)
89104 z = MOI. add_variable (model)
90105 MOI. add_constraint (model, y, MOI. GreaterThan (zero (T)))
91106 MOI. add_constraint (model, z, MOI. GreaterThan (zero (T)))
92107 MOI. modify (model, ci, MOI. ScalarCoefficientChange (y, one (T)))
93108 MOI. modify (model, ci, MOI. ScalarCoefficientChange (z, - one (T)))
94- sense = MOI. get (model, MOI. ObjectiveSense ())
95109 scale = sense == MOI. MIN_SENSE ? one (T) : - one (T)
96110 a = scale * relax. penalty
97111 O = MOI. get (model, MOI. ObjectiveFunctionType ())
@@ -106,11 +120,11 @@ function MOI.modify(
106120 ci:: MOI.ConstraintIndex{F,MOI.GreaterThan{T}} ,
107121 relax:: ScalarPenaltyRelaxation{T} ,
108122) where {T,F<: Union{MOI.ScalarAffineFunction{T},MOI.ScalarQuadraticFunction{T}} }
123+ sense = _change_set_to_min_if_necessary (T, model)
109124 # Performance optimization: we don't need the z relaxation variable.
110125 y = MOI. add_variable (model)
111126 MOI. add_constraint (model, y, MOI. GreaterThan (zero (T)))
112127 MOI. modify (model, ci, MOI. ScalarCoefficientChange (y, one (T)))
113- sense = MOI. get (model, MOI. ObjectiveSense ())
114128 scale = sense == MOI. MIN_SENSE ? one (T) : - one (T)
115129 a = scale * relax. penalty
116130 O = MOI. get (model, MOI. ObjectiveFunctionType ())
@@ -124,11 +138,11 @@ function MOI.modify(
124138 ci:: MOI.ConstraintIndex{F,MOI.LessThan{T}} ,
125139 relax:: ScalarPenaltyRelaxation{T} ,
126140) where {T,F<: Union{MOI.ScalarAffineFunction{T},MOI.ScalarQuadraticFunction{T}} }
141+ sense = _change_set_to_min_if_necessary (T, model)
127142 # Performance optimization: we don't need the y relaxation variable.
128143 z = MOI. add_variable (model)
129144 MOI. add_constraint (model, z, MOI. GreaterThan (zero (T)))
130145 MOI. modify (model, ci, MOI. ScalarCoefficientChange (z, - one (T)))
131- sense = MOI. get (model, MOI. ObjectiveSense ())
132146 scale = sense == MOI. MIN_SENSE ? one (T) : - one (T)
133147 a = scale * relax. penalty
134148 O = MOI. get (model, MOI. ObjectiveFunctionType ())
@@ -266,12 +280,6 @@ function PenaltyRelaxation(
266280end
267281
268282function MOI. modify (model:: MOI.ModelLike , relax:: PenaltyRelaxation{T} ) where {T}
269- sense = MOI. get (model, MOI. ObjectiveSense ())
270- if sense == MOI. FEASIBILITY_SENSE
271- MOI. set (model, MOI. ObjectiveSense (), MOI. MIN_SENSE)
272- f = zero (MOI. ScalarAffineFunction{T})
273- MOI. set (model, MOI. ObjectiveFunction {typeof(f)} (), f)
274- end
275283 map = Dict {MOI.ConstraintIndex,MOI.ScalarAffineFunction{T}} ()
276284 for (F, S) in MOI. get (model, MOI. ListOfConstraintTypesPresent ())
277285 _modify_penalty_relaxation (map, model, relax, F, S)
0 commit comments