diff --git a/src/Utilities/cachingoptimizer.jl b/src/Utilities/cachingoptimizer.jl index 02d8d56dfd..e193406716 100644 --- a/src/Utilities/cachingoptimizer.jl +++ b/src/Utilities/cachingoptimizer.jl @@ -298,6 +298,7 @@ MOI.is_empty(m::CachingOptimizer) = MOI.is_empty(m.model_cache) function MOI.optimize!(m::CachingOptimizer) if m.mode == AUTOMATIC && m.state == EMPTY_OPTIMIZER + final_touch(m.model_cache, nothing) # 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 diff --git a/test/Utilities/cachingoptimizer.jl b/test/Utilities/cachingoptimizer.jl index 672a62729d..c61a800fdb 100644 --- a/test/Utilities/cachingoptimizer.jl +++ b/test/Utilities/cachingoptimizer.jl @@ -914,6 +914,38 @@ function test_copy_optimizer_attributes_2887() return end +mutable struct FinalTouchDetector <: MOI.ModelLike + index_map::Any +end + +function MOI.Utilities.final_touch(model::FinalTouchDetector, index_map) + model.index_map = index_map + return +end +function MOI.copy_to(::MOI.Utilities.MockOptimizer, ::FinalTouchDetector) + return MOI.Utilities.IndexMap() +end +function MOI.get(::FinalTouchDetector, ::MOI.ListOfOptimizerAttributesSet) + return MOI.AbstractOptimizerAttribute[] +end +function MOI.get(::FinalTouchDetector, ::MOI.ListOfModelAttributesSet) + return MOI.AbstractModelAttribute[] +end + +function test_final_touch_optimize() + model = MOI.Utilities.CachingOptimizer( + FinalTouchDetector(missing), + MOI.Utilities.MockOptimizer(MOI.Utilities.Model{Float64}()), + ) + MOI.Utilities.attach_optimizer(model) + @test model.model_cache.index_map === nothing + MOI.Utilities.final_touch(model, missing) + @test model.model_cache.index_map === missing + MOI.Utilities.reset_optimizer(model) + MOI.optimize!(model) + @test model.model_cache.index_map === nothing +end + end # module TestCachingOptimizer.runtests()