@@ -94,6 +94,16 @@ abstract type AbstractAlgorithm end
9494
9595MOI. Utilities. map_indices (:: Function , x:: AbstractAlgorithm ) = x
9696
97+ function _instantiate_with_cache (optimizer_factory)
98+ model = MOI. instantiate (optimizer_factory)
99+ if ! MOI. supports_incremental_interface (model)
100+ # A cache will already have been added
101+ return model
102+ end
103+ cache = MOI. Utilities. UniversalFallback (MOI. Utilities. Model {Float64} ())
104+ return MOI. Utilities. CachingOptimizer (cache, model)
105+ end
106+
97107mutable struct Optimizer <: MOI.AbstractOptimizer
98108 inner:: MOI.AbstractOptimizer
99109 algorithm:: Union{Nothing,AbstractAlgorithm}
@@ -103,7 +113,7 @@ mutable struct Optimizer <: MOI.AbstractOptimizer
103113
104114 function Optimizer (optimizer_factory)
105115 return new (
106- MOI . instantiate (optimizer_factory),
116+ _instantiate_with_cache (optimizer_factory),
107117 nothing ,
108118 nothing ,
109119 SolutionPoint[],
@@ -489,7 +499,8 @@ function MOI.get(model::Optimizer, attr::MOI.ObjectiveBound)
489499 for (i, f) in enumerate (objectives)
490500 MOI. set (model. inner, MOI. ObjectiveFunction {typeof(f)} (), f)
491501 MOI. optimize! (model. inner)
492- if MOI. get (model. inner, MOI. TerminationStatus ()) == MOI. OPTIMAL
502+ status = MOI. get (model. inner, MOI. TerminationStatus ())
503+ if _is_scalar_status_optimal (status)
493504 ideal_point[i] = MOI. get (model. inner, MOI. ObjectiveValue ())
494505 end
495506 end
@@ -523,6 +534,11 @@ function _is_scalar_status_optimal(status::MOI.TerminationStatusCode)
523534 return status == MOI. OPTIMAL || status == MOI. LOCALLY_SOLVED
524535end
525536
537+ function _is_scalar_status_optimal (model:: Optimizer )
538+ status = MOI. get (model. inner, MOI. TerminationStatus ())
539+ return _is_scalar_status_optimal (status)
540+ end
541+
526542for file in readdir (joinpath (@__DIR__ , " algorithms" ))
527543 include (joinpath (@__DIR__ , " algorithms" , file))
528544end
0 commit comments