diff --git a/src/Utilities/cachingoptimizer.jl b/src/Utilities/cachingoptimizer.jl index 0c9ec9e4f4..f06b340535 100644 --- a/src/Utilities/cachingoptimizer.jl +++ b/src/Utilities/cachingoptimizer.jl @@ -239,6 +239,66 @@ function MOI.add_variables(m::CachingOptimizer, n) return vindices end +function MOI.add_constrained_variable(m::CachingOptimizer, set::MOI.AbstractScalarSet) + if m.state == MOIU.ATTACHED_OPTIMIZER + if m.mode == MOIU.AUTOMATIC + try + vindex_optimizer, cindex_optimizer = + MOI.add_constrained_variable(m.optimizer, set) + catch err + if err isa MOI.NotAllowedError + reset_optimizer(m) + else + rethrow(err) + end + end + else + vindex_optimizer, cindex_optimizer = + MOI.add_constrained_variable(m.optimizer, set) + end + end + vindex = MOI.add_variable(m.model_cache) + cindex = MOI.add_constraint(m.model_cache, MOI.SingleVariable(vindex), set) + if m.state == MOIU.ATTACHED_OPTIMIZER + m.model_to_optimizer_map[vindex] = vindex_optimizer + m.optimizer_to_model_map[vindex_optimizer] = vindex + m.model_to_optimizer_map[cindex] = cindex_optimizer + m.optimizer_to_model_map[cindex_optimizer] = cindex + end + return vindex, cindex +end + +function MOI.add_constrained_variables(m::CachingOptimizer, set::MOI.AbstractVectorSet) + if m.state == ATTACHED_OPTIMIZER + if m.mode == AUTOMATIC + try + vindices_optimizer, cindex_optimizer = + MOI.add_constrained_variables(m.optimizer, set) + catch err + if err isa MOI.NotAllowedError + reset_optimizer(m) + else + rethrow(err) + end + end + else + vindices_optimizer, cindex_optimizer = + MOI.add_constrained_variables(m.optimizer, set) + end + end + vindices = MOI.add_variables(m.model_cache, MOI.dimension(set)) + cindex = MOI.add_constraint(m.model_cache, MOI.VectorOfVariables(vindices), set) + if m.state == ATTACHED_OPTIMIZER + for (vindex, vindex_optimizer) in zip(vindices, vindices_optimizer) + m.model_to_optimizer_map[vindex] = vindex_optimizer + m.optimizer_to_model_map[vindex_optimizer] = vindex + end + m.model_to_optimizer_map[cindex] = cindex_optimizer + m.optimizer_to_model_map[cindex_optimizer] = cindex + end + return vindices, cindex +end + function MOI.supports_constraint(m::CachingOptimizer, F::Type{<:MOI.AbstractFunction}, S::Type{<:MOI.AbstractSet}) MOI.supports_constraint(m.model_cache, F, S) && (m.state == NO_OPTIMIZER || MOI.supports_constraint(m.optimizer, F, S)) end