From db0b5cf29ad4f592c4986b830fa57d21d75c5257 Mon Sep 17 00:00:00 2001 From: Martin Biel Date: Tue, 5 May 2020 11:32:01 +0200 Subject: [PATCH 1/3] Implement add_constrained_variable and add_constrained_variables for CachingOptimizer. Properly adds the variable(s) to an attached optimizer if there is any. --- src/Utilities/cachingoptimizer.jl | 62 +++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/src/Utilities/cachingoptimizer.jl b/src/Utilities/cachingoptimizer.jl index 0c9ec9e4f4..688eedb21d 100644 --- a/src/Utilities/cachingoptimizer.jl +++ b/src/Utilities/cachingoptimizer.jl @@ -239,6 +239,68 @@ 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, cindices_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, cindices_optimizer = + MOI.add_constrained_variables(m.optimizer, set) + end + end + vindices = MOI.add_variables(m.model_cache, MOI.dimension(set)) + cindices = 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 + for (cindex, cindex_optimizer) in zip(cindices, cindices_optimizer) + m.model_to_optimizer_map[cindex] = cindex_optimizer + m.optimizer_to_model_map[cindex_optimizer] = cindex + end + end + return vindices, cindices +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 From 7214b71855ba874dd3ea3d9e8c99cb1e4240c10b Mon Sep 17 00:00:00 2001 From: Martin Biel Date: Tue, 5 May 2020 14:55:26 +0200 Subject: [PATCH 2/3] Only one constraint index in add_constrained_variables. --- src/Utilities/cachingoptimizer.jl | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/Utilities/cachingoptimizer.jl b/src/Utilities/cachingoptimizer.jl index 688eedb21d..fd309e3318 100644 --- a/src/Utilities/cachingoptimizer.jl +++ b/src/Utilities/cachingoptimizer.jl @@ -282,23 +282,21 @@ function MOI.add_constrained_variables(m::CachingOptimizer, set::MOI.AbstractVec end end else - vindices_optimizer, cindices_optimizer = + vindices_optimizer, cindex_optimizer = MOI.add_constrained_variables(m.optimizer, set) end end vindices = MOI.add_variables(m.model_cache, MOI.dimension(set)) - cindices = MOI.add_constraint(m.model_cache, MOI.VectorOfVariables(vindices), 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 - for (cindex, cindex_optimizer) in zip(cindices, cindices_optimizer) - m.model_to_optimizer_map[cindex] = cindex_optimizer - m.optimizer_to_model_map[cindex_optimizer] = cindex - end + m.model_to_optimizer_map[cindex] = cindex_optimizer + m.optimizer_to_model_map[cindex_optimizer] = cindex end - return vindices, cindices + return vindices, cindex end function MOI.supports_constraint(m::CachingOptimizer, F::Type{<:MOI.AbstractFunction}, S::Type{<:MOI.AbstractSet}) From 82b005affc0204bdf6c9fcdb4823111913008f32 Mon Sep 17 00:00:00 2001 From: Martin Biel Date: Tue, 5 May 2020 15:25:10 +0200 Subject: [PATCH 3/3] Added missing fix. --- src/Utilities/cachingoptimizer.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Utilities/cachingoptimizer.jl b/src/Utilities/cachingoptimizer.jl index fd309e3318..f06b340535 100644 --- a/src/Utilities/cachingoptimizer.jl +++ b/src/Utilities/cachingoptimizer.jl @@ -272,7 +272,7 @@ function MOI.add_constrained_variables(m::CachingOptimizer, set::MOI.AbstractVec if m.state == ATTACHED_OPTIMIZER if m.mode == AUTOMATIC try - vindices_optimizer, cindices_optimizer = + vindices_optimizer, cindex_optimizer = MOI.add_constrained_variables(m.optimizer, set) catch err if err isa MOI.NotAllowedError