From 3a583f6af9af653f9788b178f0bc595578149669 Mon Sep 17 00:00:00 2001 From: odow Date: Fri, 17 Sep 2021 15:26:46 +1200 Subject: [PATCH 1/2] [Utilities] allow callbacks through CachingOptimizer --- src/Utilities/cachingoptimizer.jl | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/Utilities/cachingoptimizer.jl b/src/Utilities/cachingoptimizer.jl index 42b89a5af2..72ea319898 100644 --- a/src/Utilities/cachingoptimizer.jl +++ b/src/Utilities/cachingoptimizer.jl @@ -271,6 +271,17 @@ MOI.is_empty(m::CachingOptimizer) = MOI.is_empty(m.model_cache) function MOI.optimize!(m::CachingOptimizer) if m.mode == AUTOMATIC && m.state == EMPTY_OPTIMIZER + # Here is a special case for callbacks: we can't use the two-argument + # call to optimize! because we need the `optimizer_to_model_map` to be + # set _prior_ to starting the optimization process. Therefore, we need + # to check if we have an `AbstractCallback` set and attach the optimizer + # before recalling `MOI.optimize!`. + for attr in MOI.get(m, MOI.ListOfModelAttributesSet()) + if typeof(attr) <: MOI.AbstractCallback + attach_optimizer(m) + return MOI.optimize!(m) + end + end indexmap, copied = MOI.optimize!(m.optimizer, m.model_cache) if copied m.state = ATTACHED_OPTIMIZER From e2d4f05ed39129ba052cca9e0118949bbf4bc15f Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Sat, 18 Sep 2021 11:58:01 +1200 Subject: [PATCH 2/2] Update cachingoptimizer.jl --- 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 72ea319898..05678a4f8b 100644 --- a/src/Utilities/cachingoptimizer.jl +++ b/src/Utilities/cachingoptimizer.jl @@ -277,7 +277,7 @@ function MOI.optimize!(m::CachingOptimizer) # to check if we have an `AbstractCallback` set and attach the optimizer # before recalling `MOI.optimize!`. for attr in MOI.get(m, MOI.ListOfModelAttributesSet()) - if typeof(attr) <: MOI.AbstractCallback + if attr isa MOI.AbstractCallback attach_optimizer(m) return MOI.optimize!(m) end