diff --git a/docs/src/submodules/Utilities/overview.md b/docs/src/submodules/Utilities/overview.md index a397fba972..9e688c3802 100644 --- a/docs/src/submodules/Utilities/overview.md +++ b/docs/src/submodules/Utilities/overview.md @@ -152,7 +152,7 @@ julia> model = MOI.Utilities.CachingOptimizer( PathOptimizer{Float64}(), ) MOIU.CachingOptimizer{MOIU.GenericOptimizer{Float64,MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}},MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}} -in state ATTACHED_OPTIMIZER +in state EMPTY_OPTIMIZER in mode AUTOMATIC with model cache MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}} with optimizer MOIU.GenericOptimizer{Float64,MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}} @@ -169,33 +169,34 @@ A [`Utilities.CachingOptimizer`](@ref) may be in one of three possible states: optimizer. If the optimizer does not support modifications, and error will be thrown. -Use [`Utilities.reset_optimizer`](@ref) to go from `ATTACHED_OPTIMIZER` to -`EMPTY_OPTIMIZER`: +Use [`Utilities.attach_optimizer`](@ref) to go from `EMPTY_OPTIMIZER` to +`ATTACHED_OPTIMIZER`: ```jldoctest pathoptimizer -julia> MOI.Utilities.reset_optimizer(model) +julia> MOI.Utilities.attach_optimizer(model) julia> model MOIU.CachingOptimizer{MOIU.GenericOptimizer{Float64,MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}},MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}} -in state EMPTY_OPTIMIZER +in state ATTACHED_OPTIMIZER in mode AUTOMATIC with model cache MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}} with optimizer MOIU.GenericOptimizer{Float64,MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}} ``` -Use [`Utilities.attach_optimizer`](@ref) to go from `EMPTY_OPTIMIZER` to -`ATTACHED_OPTIMIZER`: +!!! info + You must be in `ATTACHED_OPTIMIZER` to use [`optimize!`](@ref). + +Use [`Utilities.reset_optimizer`](@ref) to go from `ATTACHED_OPTIMIZER` to +`EMPTY_OPTIMIZER`: ```jldoctest pathoptimizer -julia> MOI.Utilities.attach_optimizer(model) +julia> MOI.Utilities.reset_optimizer(model) julia> model MOIU.CachingOptimizer{MOIU.GenericOptimizer{Float64,MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}},MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}} -in state ATTACHED_OPTIMIZER +in state EMPTY_OPTIMIZER in mode AUTOMATIC with model cache MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}} with optimizer MOIU.GenericOptimizer{Float64,MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}} ``` -!!! info - You must be in `ATTACHED_OPTIMIZER` to use [`optimize!`](@ref). Use [`Utilities.drop_optimizer`](@ref) to go from any state to `NO_OPTIMIZER`: ```jldoctest pathoptimizer diff --git a/src/Utilities/cachingoptimizer.jl b/src/Utilities/cachingoptimizer.jl index 8cc42c29a8..0f1dd6fada 100644 --- a/src/Utilities/cachingoptimizer.jl +++ b/src/Utilities/cachingoptimizer.jl @@ -70,9 +70,9 @@ end """ CachingOptimizer(model_cache::MOI.ModelLike, optimizer::AbstractOptimizer) -Creates an `CachingOptimizer` in `AUTOMATIC` mode, with the optimizer `optimizer`. -The `model_cache` manager returned behaves like an `AbstractOptimizer` as long as no -`CachingOptimizer`-specific functions (e.g. `reset_optimizer`) are called on it. +Creates an `CachingOptimizer` in `AUTOMATIC` mode, with the optimizer +`optimizer`. + The type of the optimizer returned is `CachingOptimizer{typeof(optimizer), typeof(model_cache)}` so it does not support the function `reset_optimizer(::CachingOptimizer, new_optimizer)` if the type of @@ -87,7 +87,7 @@ function CachingOptimizer( return CachingOptimizer{typeof(optimizer),typeof(model_cache)}( optimizer, model_cache, - ATTACHED_OPTIMIZER, + EMPTY_OPTIMIZER, AUTOMATIC, IndexMap(), IndexMap(), @@ -233,9 +233,6 @@ function MOI.empty!(m::CachingOptimizer) if m.state == ATTACHED_OPTIMIZER MOI.empty!(m.optimizer) end - if m.state == EMPTY_OPTIMIZER && m.mode == AUTOMATIC - m.state = ATTACHED_OPTIMIZER - end m.model_to_optimizer_map = IndexMap() return m.optimizer_to_model_map = IndexMap() end diff --git a/test/Utilities/cachingoptimizer.jl b/test/Utilities/cachingoptimizer.jl index 977486f61e..07f1c7e63c 100644 --- a/test/Utilities/cachingoptimizer.jl +++ b/test/Utilities/cachingoptimizer.jl @@ -118,6 +118,7 @@ struct DummyConstraintAttribute <: MOI.AbstractConstraintAttribute end MOIU.UniversalFallback(MOIU.Model{Float64}()), mock, ) + MOIU.attach_optimizer(model) x = MOI.add_variable(model) y = first(MOI.get(mock, MOI.ListOfVariableIndices())) @test x != y # Otherwise, these tests will trivially pass @@ -441,7 +442,7 @@ end s.add_con_allowed = true @test MOIU.state(m) == MOIU.EMPTY_OPTIMIZER MOI.empty!(m) - @test MOIU.state(m) == MOIU.ATTACHED_OPTIMIZER + @test MOIU.state(m) == MOIU.EMPTY_OPTIMIZER end @testset "Add variable not allowed" begin @@ -494,12 +495,12 @@ end m = MOIU.CachingOptimizer(model, s) @test m isa MOIU.CachingOptimizer{typeof(s),typeof(model)} @test MOI.is_empty(m) - @test MOIU.state(m) == MOIU.ATTACHED_OPTIMIZER + @test MOIU.state(m) == MOIU.EMPTY_OPTIMIZER @test MOIU.mode(m) == MOIU.AUTOMATIC @test MOI.get(m, MOI.SolverName()) == "Mock" @test sprint(show, m) == MOI.Utilities.replace_acronym(""" $(MOIU.CachingOptimizer{MOIU.MockOptimizer{MOIU.Model{Float64}},MOIU.Model{Float64}}) - in state ATTACHED_OPTIMIZER + in state EMPTY_OPTIMIZER in mode AUTOMATIC with model cache $(MOIU.Model{Float64}) with optimizer $(MOIU.MockOptimizer{MOIU.Model{Float64}})""")