@@ -107,6 +107,7 @@ mutable struct Optimizer <: MOI.AbstractOptimizer
107107 termination_status:: MOI.TerminationStatusCode
108108 time_limit_sec:: Union{Nothing,Float64}
109109 solve_time:: Float64
110+ ideal_point:: Vector{Float64}
110111
111112 function Optimizer (optimizer_factory)
112113 return new (
@@ -117,16 +118,18 @@ mutable struct Optimizer <: MOI.AbstractOptimizer
117118 MOI. OPTIMIZE_NOT_CALLED,
118119 nothing ,
119120 NaN ,
121+ Float64[],
120122 )
121123 end
122124end
123125
124126function MOI. empty! (model:: Optimizer )
125127 MOI. empty! (model. inner)
126128 model. f = nothing
127- model. solutions = SolutionPoint[]
129+ empty! ( model. solutions)
128130 model. termination_status = MOI. OPTIMIZE_NOT_CALLED
129131 model. solve_time = NaN
132+ empty! (model. ideal_point)
130133 return
131134end
132135
@@ -135,7 +138,8 @@ function MOI.is_empty(model::Optimizer)
135138 model. f === nothing &&
136139 isempty (model. solutions) &&
137140 model. termination_status == MOI. OPTIMIZE_NOT_CALLED &&
138- isnan (model. solve_time)
141+ isnan (model. solve_time) &&
142+ isempty (model. ideal_point)
139143end
140144
141145MOI. supports_incremental_interface (:: Optimizer ) = true
@@ -526,6 +530,16 @@ function MOI.optimize!(model::Optimizer)
526530 model. termination_status = MOI. INVALID_MODEL
527531 return
528532 end
533+ objectives = MOI. Utilities. eachscalar (model. f)
534+ model. ideal_point = fill (NaN , length (objectives))
535+ for (i, f) in enumerate (objectives)
536+ MOI. set (model. inner, MOI. ObjectiveFunction {typeof(f)} (), f)
537+ MOI. optimize! (model. inner)
538+ status = MOI. get (model. inner, MOI. TerminationStatus ())
539+ if _is_scalar_status_optimal (status)
540+ model. ideal_point[i] = MOI. get (model. inner, MOI. ObjectiveValue ())
541+ end
542+ end
529543 algorithm = something (model. algorithm, default (Algorithm ()))
530544 status, solutions = optimize_multiobjective! (algorithm, model)
531545 model. termination_status = status
@@ -559,19 +573,7 @@ function MOI.get(model::Optimizer, attr::MOI.ObjectiveValue)
559573 return model. solutions[attr. result_index]. y
560574end
561575
562- function MOI. get (model:: Optimizer , attr:: MOI.ObjectiveBound )
563- objectives = MOI. Utilities. eachscalar (model. f)
564- ideal_point = fill (NaN , length (objectives))
565- for (i, f) in enumerate (objectives)
566- MOI. set (model. inner, MOI. ObjectiveFunction {typeof(f)} (), f)
567- MOI. optimize! (model. inner)
568- status = MOI. get (model. inner, MOI. TerminationStatus ())
569- if _is_scalar_status_optimal (status)
570- ideal_point[i] = MOI. get (model. inner, MOI. ObjectiveValue ())
571- end
572- end
573- return ideal_point
574- end
576+ MOI. get (model:: Optimizer , :: MOI.ObjectiveBound ) = model. ideal_point
575577
576578MOI. get (model:: Optimizer , :: MOI.TerminationStatus ) = model. termination_status
577579
0 commit comments