Skip to content

Commit db0b5cf

Browse files
committed
Implement add_constrained_variable and add_constrained_variables for CachingOptimizer. Properly adds the variable(s) to an attached optimizer if there is any.
1 parent 74d7443 commit db0b5cf

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed

src/Utilities/cachingoptimizer.jl

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,68 @@ 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, cindices_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, cindices_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+
cindices = 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+
for (cindex, cindex_optimizer) in zip(cindices, cindices_optimizer)
297+
m.model_to_optimizer_map[cindex] = cindex_optimizer
298+
m.optimizer_to_model_map[cindex_optimizer] = cindex
299+
end
300+
end
301+
return vindices, cindices
302+
end
303+
242304
function MOI.supports_constraint(m::CachingOptimizer, F::Type{<:MOI.AbstractFunction}, S::Type{<:MOI.AbstractSet})
243305
MOI.supports_constraint(m.model_cache, F, S) && (m.state == NO_OPTIMIZER || MOI.supports_constraint(m.optimizer, F, S))
244306
end

0 commit comments

Comments
 (0)