@@ -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