Skip to content

Commit df67c62

Browse files
committed
Return a map from MOI.modify
1 parent def5945 commit df67c62

File tree

2 files changed

+114
-12
lines changed

2 files changed

+114
-12
lines changed

src/Utilities/penalty_relaxation.jl

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ mutable struct PenaltyRelaxation{T}
9898

9999
function PenaltyRelaxation(
100100
p::Dict{MOI.ConstraintIndex,T};
101-
default::T = one(T),
101+
default::Union{Nothing,T} = one(T),
102102
) where {T}
103103
return new{T}(default, p)
104104
end
@@ -122,24 +122,29 @@ function MOI.modify(model::MOI.ModelLike, relax::PenaltyRelaxation{T}) where {T}
122122
f = zero(MOI.ScalarAffineFunction{T})
123123
MOI.set(model, MOI.ObjectiveFunction{typeof(f)}(), f)
124124
end
125+
map = Dict{MOI.ConstraintIndex,MOI.ScalarAffineFunction{T}}()
125126
for (F, S) in MOI.get(model, MOI.ListOfConstraintTypesPresent())
126-
_modify_penalty_relaxation(model, relax, F, S)
127+
_modify_penalty_relaxation(map, model, relax, F, S)
127128
end
128-
return
129+
return map
129130
end
130131

131132
function _modify_penalty_relaxation(
133+
map::Dict{MOI.ConstraintIndex,MOI.ScalarAffineFunction{T}},
132134
model::MOI.ModelLike,
133135
relax::PenaltyRelaxation,
134136
::Type{F},
135137
::Type{S},
136-
) where {F,S}
138+
) where {T,F,S}
137139
for ci in MOI.get(model, MOI.ListOfConstraintIndices{F,S}())
138140
if relax.default !== nothing || haskey(relax.penalties, ci)
139-
MOI.modify(model, ci, relax)
141+
f = MOI.modify(model, ci, relax)
142+
if f !== nothing
143+
map[ci] = f
144+
end
140145
end
141146
end
142-
return
147+
return map
143148
end
144149

145150
function MOI.modify(
@@ -176,7 +181,7 @@ function MOI.modify(
176181
obj = MOI.ObjectiveFunction{O}()
177182
MOI.modify(model, obj, MOI.ScalarCoefficientChange(y, a))
178183
MOI.modify(model, obj, MOI.ScalarCoefficientChange(z, a))
179-
return
184+
return one(T) * y + one(T) * z
180185
end
181186

182187
function MOI.modify(
@@ -194,7 +199,7 @@ function MOI.modify(
194199
O = MOI.get(model, MOI.ObjectiveFunctionType())
195200
obj = MOI.ObjectiveFunction{O}()
196201
MOI.modify(model, obj, MOI.ScalarCoefficientChange(y, a))
197-
return
202+
return one(T) * y
198203
end
199204

200205
function MOI.modify(
@@ -212,5 +217,5 @@ function MOI.modify(
212217
O = MOI.get(model, MOI.ObjectiveFunctionType())
213218
obj = MOI.ObjectiveFunction{O}()
214219
MOI.modify(model, obj, MOI.ScalarCoefficientChange(z, a))
215-
return
220+
return one(T) * z
216221
end

test/Utilities/penalty_relaxation.jl

Lines changed: 100 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@ end
2525
function _test_roundtrip(src_str, relaxed_str)
2626
model = MOI.Utilities.Model{Float64}()
2727
MOI.Utilities.loadfromstring!(model, src_str)
28-
MOI.modify(model, MOI.Utilities.PenaltyRelaxation())
28+
map = MOI.modify(model, MOI.Utilities.PenaltyRelaxation())
29+
for (c, v) in map
30+
@test v isa MOI.ScalarAffineFunction{Float64}
31+
end
2932
dest = MOI.Utilities.Model{Float64}()
3033
MOI.Utilities.loadfromstring!(dest, relaxed_str)
3134
MOI.Bridges._test_structural_identical(model, dest)
@@ -218,11 +221,105 @@ function test_relax_quadratic_greaterthanthan()
218221
return
219222
end
220223

221-
function test_penalties()
224+
function test_penalty_dict()
225+
model = MOI.Utilities.Model{Float64}()
226+
x = MOI.add_variable(model)
227+
c = MOI.add_constraint(model, 1.0 * x, MOI.EqualTo(2.0))
228+
map = MOI.modify(model, MOI.Utilities.PenaltyRelaxation(Dict(c => 2.0)))
229+
@test map[c] isa MOI.ScalarAffineFunction{Float64}
230+
@test sprint(print, model) === """
231+
Minimize ScalarAffineFunction{Float64}:
232+
0.0 + 2.0 v[2] + 2.0 v[3]
233+
234+
Subject to:
235+
236+
ScalarAffineFunction{Float64}-in-EqualTo{Float64}
237+
0.0 + 1.0 v[1] + 1.0 v[2] - 1.0 v[3] == 2.0
238+
239+
VariableIndex-in-GreaterThan{Float64}
240+
v[2] >= 0.0
241+
v[3] >= 0.0
242+
"""
243+
return
244+
end
245+
246+
function test_default()
222247
model = MOI.Utilities.Model{Float64}()
223248
x = MOI.add_variable(model)
224249
c = MOI.add_constraint(model, 1.0 * x, MOI.EqualTo(2.0))
225-
MOI.modify(model, MOI.Utilities.PenaltyRelaxation(Dict(c => 2.0)))
250+
map = MOI.modify(model, MOI.Utilities.PenaltyRelaxation(default = 2.0))
251+
@test map[c] isa MOI.ScalarAffineFunction{Float64}
252+
@test sprint(print, model) === """
253+
Minimize ScalarAffineFunction{Float64}:
254+
0.0 + 2.0 v[2] + 2.0 v[3]
255+
256+
Subject to:
257+
258+
ScalarAffineFunction{Float64}-in-EqualTo{Float64}
259+
0.0 + 1.0 v[1] + 1.0 v[2] - 1.0 v[3] == 2.0
260+
261+
VariableIndex-in-GreaterThan{Float64}
262+
v[2] >= 0.0
263+
v[3] >= 0.0
264+
"""
265+
return
266+
end
267+
268+
function test_default_nothing()
269+
model = MOI.Utilities.Model{Float64}()
270+
x = MOI.add_variable(model)
271+
c = MOI.add_constraint(model, 1.0 * x, MOI.EqualTo(2.0))
272+
map = MOI.modify(model, MOI.Utilities.PenaltyRelaxation(default = nothing))
273+
@test !haskey(map, c)
274+
@test sprint(print, model) === """
275+
Minimize ScalarAffineFunction{Float64}:
276+
0.0
277+
278+
Subject to:
279+
280+
ScalarAffineFunction{Float64}-in-EqualTo{Float64}
281+
0.0 + 1.0 v[1] == 2.0
282+
"""
283+
return
284+
end
285+
286+
function test_brige_optimizer()
287+
model = MOI.instantiate(
288+
MOI.Utilities.Model{Float64};
289+
with_bridge_type = Float64,
290+
)
291+
x = MOI.add_variable(model)
292+
c = MOI.add_constraint(model, 1.0 * x, MOI.EqualTo(2.0))
293+
map = MOI.modify(model, MOI.Utilities.PenaltyRelaxation(default = 2.0))
294+
@test map[c] isa MOI.ScalarAffineFunction{Float64}
295+
@test sprint(print, model) === """
296+
Minimize ScalarAffineFunction{Float64}:
297+
0.0 + 2.0 v[2] + 2.0 v[3]
298+
299+
Subject to:
300+
301+
ScalarAffineFunction{Float64}-in-EqualTo{Float64}
302+
0.0 + 1.0 v[1] + 1.0 v[2] - 1.0 v[3] == 2.0
303+
304+
VariableIndex-in-GreaterThan{Float64}
305+
v[2] >= 0.0
306+
v[3] >= 0.0
307+
"""
308+
return
309+
end
310+
311+
function test_caching_optimizer()
312+
model = MOI.Utilities.CachingOptimizer(
313+
MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()),
314+
MOI.Bridges.full_bridge_optimizer(
315+
MOI.Utilities.MockOptimizer(MOI.Utilities.Model{Float64}()),
316+
Float64,
317+
),
318+
)
319+
x = MOI.add_variable(model)
320+
c = MOI.add_constraint(model, 1.0 * x, MOI.EqualTo(2.0))
321+
map = MOI.modify(model, MOI.Utilities.PenaltyRelaxation(default = 2.0))
322+
@test map[c] isa MOI.ScalarAffineFunction{Float64}
226323
@test sprint(print, model) === """
227324
Minimize ScalarAffineFunction{Float64}:
228325
0.0 + 2.0 v[2] + 2.0 v[3]

0 commit comments

Comments
 (0)