Skip to content

Commit 1315e31

Browse files
authored
Merge pull request #1084 from martinbiel/cachopt_constrainedvars_fix
Fix add_constrained_variable(s) for a CachingOptimizer with an attached optimizer
2 parents 8f4faec + 82b005a commit 1315e31

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed

src/Utilities/cachingoptimizer.jl

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,66 @@ function MOI.add_variables(m::CachingOptimizer, n)
239239
return vindices
240240
end
241241

242+
function MOI.add_constrained_variable(m::CachingOptimizer, set::MOI.AbstractScalarSet)
243+
if m.state == MOIU.ATTACHED_OPTIMIZER
244+
if m.mode == MOIU.AUTOMATIC
245+
try
246+
vindex_optimizer, cindex_optimizer =
247+
MOI.add_constrained_variable(m.optimizer, set)
248+
catch err
249+
if err isa MOI.NotAllowedError
250+
reset_optimizer(m)
251+
else
252+
rethrow(err)
253+
end
254+
end
255+
else
256+
vindex_optimizer, cindex_optimizer =
257+
MOI.add_constrained_variable(m.optimizer, set)
258+
end
259+
end
260+
vindex = MOI.add_variable(m.model_cache)
261+
cindex = MOI.add_constraint(m.model_cache, MOI.SingleVariable(vindex), set)
262+
if m.state == MOIU.ATTACHED_OPTIMIZER
263+
m.model_to_optimizer_map[vindex] = vindex_optimizer
264+
m.optimizer_to_model_map[vindex_optimizer] = vindex
265+
m.model_to_optimizer_map[cindex] = cindex_optimizer
266+
m.optimizer_to_model_map[cindex_optimizer] = cindex
267+
end
268+
return vindex, cindex
269+
end
270+
271+
function MOI.add_constrained_variables(m::CachingOptimizer, set::MOI.AbstractVectorSet)
272+
if m.state == ATTACHED_OPTIMIZER
273+
if m.mode == AUTOMATIC
274+
try
275+
vindices_optimizer, cindex_optimizer =
276+
MOI.add_constrained_variables(m.optimizer, set)
277+
catch err
278+
if err isa MOI.NotAllowedError
279+
reset_optimizer(m)
280+
else
281+
rethrow(err)
282+
end
283+
end
284+
else
285+
vindices_optimizer, cindex_optimizer =
286+
MOI.add_constrained_variables(m.optimizer, set)
287+
end
288+
end
289+
vindices = MOI.add_variables(m.model_cache, MOI.dimension(set))
290+
cindex = MOI.add_constraint(m.model_cache, MOI.VectorOfVariables(vindices), set)
291+
if m.state == ATTACHED_OPTIMIZER
292+
for (vindex, vindex_optimizer) in zip(vindices, vindices_optimizer)
293+
m.model_to_optimizer_map[vindex] = vindex_optimizer
294+
m.optimizer_to_model_map[vindex_optimizer] = vindex
295+
end
296+
m.model_to_optimizer_map[cindex] = cindex_optimizer
297+
m.optimizer_to_model_map[cindex_optimizer] = cindex
298+
end
299+
return vindices, cindex
300+
end
301+
242302
function MOI.supports_constraint(m::CachingOptimizer, F::Type{<:MOI.AbstractFunction}, S::Type{<:MOI.AbstractSet})
243303
MOI.supports_constraint(m.model_cache, F, S) && (m.state == NO_OPTIMIZER || MOI.supports_constraint(m.optimizer, F, S))
244304
end

0 commit comments

Comments
 (0)