@@ -80,18 +80,32 @@ function MOI.supports(
80
80
return false
81
81
end
82
82
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
+
83
97
function MOI. modify (
84
98
model:: MOI.ModelLike ,
85
99
ci:: MOI.ConstraintIndex{F,<:MOI.AbstractScalarSet} ,
86
100
relax:: ScalarPenaltyRelaxation{T} ,
87
101
) where {T,F<: Union{MOI.ScalarAffineFunction{T},MOI.ScalarQuadraticFunction{T}} }
102
+ sense = _change_set_to_min_if_necessary (T, model)
88
103
y = MOI. add_variable (model)
89
104
z = MOI. add_variable (model)
90
105
MOI. add_constraint (model, y, MOI. GreaterThan (zero (T)))
91
106
MOI. add_constraint (model, z, MOI. GreaterThan (zero (T)))
92
107
MOI. modify (model, ci, MOI. ScalarCoefficientChange (y, one (T)))
93
108
MOI. modify (model, ci, MOI. ScalarCoefficientChange (z, - one (T)))
94
- sense = MOI. get (model, MOI. ObjectiveSense ())
95
109
scale = sense == MOI. MIN_SENSE ? one (T) : - one (T)
96
110
a = scale * relax. penalty
97
111
O = MOI. get (model, MOI. ObjectiveFunctionType ())
@@ -106,11 +120,11 @@ function MOI.modify(
106
120
ci:: MOI.ConstraintIndex{F,MOI.GreaterThan{T}} ,
107
121
relax:: ScalarPenaltyRelaxation{T} ,
108
122
) where {T,F<: Union{MOI.ScalarAffineFunction{T},MOI.ScalarQuadraticFunction{T}} }
123
+ sense = _change_set_to_min_if_necessary (T, model)
109
124
# Performance optimization: we don't need the z relaxation variable.
110
125
y = MOI. add_variable (model)
111
126
MOI. add_constraint (model, y, MOI. GreaterThan (zero (T)))
112
127
MOI. modify (model, ci, MOI. ScalarCoefficientChange (y, one (T)))
113
- sense = MOI. get (model, MOI. ObjectiveSense ())
114
128
scale = sense == MOI. MIN_SENSE ? one (T) : - one (T)
115
129
a = scale * relax. penalty
116
130
O = MOI. get (model, MOI. ObjectiveFunctionType ())
@@ -124,11 +138,11 @@ function MOI.modify(
124
138
ci:: MOI.ConstraintIndex{F,MOI.LessThan{T}} ,
125
139
relax:: ScalarPenaltyRelaxation{T} ,
126
140
) where {T,F<: Union{MOI.ScalarAffineFunction{T},MOI.ScalarQuadraticFunction{T}} }
141
+ sense = _change_set_to_min_if_necessary (T, model)
127
142
# Performance optimization: we don't need the y relaxation variable.
128
143
z = MOI. add_variable (model)
129
144
MOI. add_constraint (model, z, MOI. GreaterThan (zero (T)))
130
145
MOI. modify (model, ci, MOI. ScalarCoefficientChange (z, - one (T)))
131
- sense = MOI. get (model, MOI. ObjectiveSense ())
132
146
scale = sense == MOI. MIN_SENSE ? one (T) : - one (T)
133
147
a = scale * relax. penalty
134
148
O = MOI. get (model, MOI. ObjectiveFunctionType ())
@@ -266,12 +280,6 @@ function PenaltyRelaxation(
266
280
end
267
281
268
282
function 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
275
283
map = Dict {MOI.ConstraintIndex,MOI.ScalarAffineFunction{T}} ()
276
284
for (F, S) in MOI. get (model, MOI. ListOfConstraintTypesPresent ())
277
285
_modify_penalty_relaxation (map, model, relax, F, S)
0 commit comments