Skip to content

Commit 203bfed

Browse files
authored
Move ideal point computation to optimize! (#78)
1 parent dced179 commit 203bfed

File tree

1 file changed

+17
-15
lines changed

1 file changed

+17
-15
lines changed

src/MultiObjectiveAlgorithms.jl

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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
122124
end
123125

124126
function 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
131134
end
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)
139143
end
140144

141145
MOI.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
560574
end
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

576578
MOI.get(model::Optimizer, ::MOI.TerminationStatus) = model.termination_status
577579

0 commit comments

Comments
 (0)