@@ -94,6 +94,16 @@ abstract type AbstractAlgorithm end
94
94
95
95
MOI. Utilities. map_indices (:: Function , x:: AbstractAlgorithm ) = x
96
96
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
+
97
107
mutable struct Optimizer <: MOI.AbstractOptimizer
98
108
inner:: MOI.AbstractOptimizer
99
109
algorithm:: Union{Nothing,AbstractAlgorithm}
@@ -103,7 +113,7 @@ mutable struct Optimizer <: MOI.AbstractOptimizer
103
113
104
114
function Optimizer (optimizer_factory)
105
115
return new (
106
- MOI . instantiate (optimizer_factory),
116
+ _instantiate_with_cache (optimizer_factory),
107
117
nothing ,
108
118
nothing ,
109
119
SolutionPoint[],
@@ -489,7 +499,8 @@ function MOI.get(model::Optimizer, attr::MOI.ObjectiveBound)
489
499
for (i, f) in enumerate (objectives)
490
500
MOI. set (model. inner, MOI. ObjectiveFunction {typeof(f)} (), f)
491
501
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)
493
504
ideal_point[i] = MOI. get (model. inner, MOI. ObjectiveValue ())
494
505
end
495
506
end
@@ -523,6 +534,11 @@ function _is_scalar_status_optimal(status::MOI.TerminationStatusCode)
523
534
return status == MOI. OPTIMAL || status == MOI. LOCALLY_SOLVED
524
535
end
525
536
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
+
526
542
for file in readdir (joinpath (@__DIR__ , " algorithms" ))
527
543
include (joinpath (@__DIR__ , " algorithms" , file))
528
544
end
0 commit comments