diff --git a/src/Utilities/cachingoptimizer.jl b/src/Utilities/cachingoptimizer.jl index 127f5017d7..776019fa64 100644 --- a/src/Utilities/cachingoptimizer.jl +++ b/src/Utilities/cachingoptimizer.jl @@ -759,18 +759,10 @@ end function MOI.get(model::CachingOptimizer, attr::MOI.AbstractModelAttribute) if MOI.is_set_by_optimize(attr) if state(model) == NO_OPTIMIZER - if attr == MOI.TerminationStatus() - return MOI.OPTIMIZE_NOT_CALLED - elseif attr == MOI.PrimalStatus() - return MOI.NO_SOLUTION - elseif attr == MOI.DualStatus() - return MOI.NO_SOLUTION - else - error( - "Cannot query $(attr) from caching optimizer because no" * - " optimizer is attached.", - ) - end + error( + "Cannot query $(attr) from caching optimizer because no " * + "optimizer is attached.", + ) end return map_indices( model.optimizer_to_model_map, @@ -780,6 +772,27 @@ function MOI.get(model::CachingOptimizer, attr::MOI.AbstractModelAttribute) return MOI.get(model.model_cache, attr) end end + +function MOI.get( + model::CachingOptimizer, + attr::MOI.TerminationStatus, +)::MOI.TerminationStatusCode + if state(model) == NO_OPTIMIZER + return MOI.OPTIMIZE_NOT_CALLED + end + return MOI.get(model.optimizer, attr) +end + +function MOI.get( + model::CachingOptimizer, + attr::Union{MOI.PrimalStatus,MOI.DualStatus}, +)::MOI.ResultStatusCode + if state(model) == NO_OPTIMIZER + return MOI.NO_SOLUTION + end + return MOI.get(model.optimizer, attr) +end + function MOI.get( model::CachingOptimizer, attr::Union{MOI.AbstractVariableAttribute,MOI.AbstractConstraintAttribute}, diff --git a/test/Utilities/cachingoptimizer.jl b/test/Utilities/cachingoptimizer.jl index 8315e2be1c..8d5e18b5a8 100644 --- a/test/Utilities/cachingoptimizer.jl +++ b/test/Utilities/cachingoptimizer.jl @@ -681,3 +681,16 @@ end @test_throws KeyError MOI.get(model, MOI.RawParameter("foo")) @test_throws KeyError MOI.get(model, MOI.NumberOfThreads()) end + +@testset "Status codes" begin + optimizer = MOI.Utilities.MockOptimizer(MOI.Utilities.Model{Float64}()) + model = MOI.Utilities.CachingOptimizer( + MOI.Utilities.Model{Float64}(), + optimizer, + ) + MOI.Utilities.attach_optimizer(model) + MOI.set(optimizer, MOI.TerminationStatus(), MOI.OPTIMAL) + MOI.set(optimizer, MOI.PrimalStatus(), MOI.FEASIBLE_POINT) + @test MOI.get(model, MOI.TerminationStatus()) == MOI.OPTIMAL + @test MOI.get(model, MOI.PrimalStatus()) == MOI.FEASIBLE_POINT +end