@@ -107,6 +107,7 @@ mutable struct Optimizer <: MOI.AbstractOptimizer
107
107
termination_status:: MOI.TerminationStatusCode
108
108
time_limit_sec:: Union{Nothing,Float64}
109
109
solve_time:: Float64
110
+ ideal_point:: Vector{Float64}
110
111
111
112
function Optimizer (optimizer_factory)
112
113
return new (
@@ -117,16 +118,18 @@ mutable struct Optimizer <: MOI.AbstractOptimizer
117
118
MOI. OPTIMIZE_NOT_CALLED,
118
119
nothing ,
119
120
NaN ,
121
+ Float64[],
120
122
)
121
123
end
122
124
end
123
125
124
126
function MOI. empty! (model:: Optimizer )
125
127
MOI. empty! (model. inner)
126
128
model. f = nothing
127
- model. solutions = SolutionPoint[]
129
+ empty! ( model. solutions)
128
130
model. termination_status = MOI. OPTIMIZE_NOT_CALLED
129
131
model. solve_time = NaN
132
+ empty! (model. ideal_point)
130
133
return
131
134
end
132
135
@@ -135,7 +138,8 @@ function MOI.is_empty(model::Optimizer)
135
138
model. f === nothing &&
136
139
isempty (model. solutions) &&
137
140
model. termination_status == MOI. OPTIMIZE_NOT_CALLED &&
138
- isnan (model. solve_time)
141
+ isnan (model. solve_time) &&
142
+ isempty (model. ideal_point)
139
143
end
140
144
141
145
MOI. supports_incremental_interface (:: Optimizer ) = true
@@ -526,6 +530,16 @@ function MOI.optimize!(model::Optimizer)
526
530
model. termination_status = MOI. INVALID_MODEL
527
531
return
528
532
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
529
543
algorithm = something (model. algorithm, default (Algorithm ()))
530
544
status, solutions = optimize_multiobjective! (algorithm, model)
531
545
model. termination_status = status
@@ -559,19 +573,7 @@ function MOI.get(model::Optimizer, attr::MOI.ObjectiveValue)
559
573
return model. solutions[attr. result_index]. y
560
574
end
561
575
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
575
577
576
578
MOI. get (model:: Optimizer , :: MOI.TerminationStatus ) = model. termination_status
577
579
0 commit comments