Skip to content

Commit e70836c

Browse files
authored
Refactor to use _compute_point in all algorithms (#35)
1 parent bf8456f commit e70836c

File tree

6 files changed

+23
-43
lines changed

6 files changed

+23
-43
lines changed

src/MultiObjectiveAlgorithms.jl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,18 @@ end
488488

489489
MOI.get(::Optimizer, ::MOI.DualStatus) = MOI.NO_SOLUTION
490490

491+
function _compute_point(
492+
model::Optimizer,
493+
variables::Vector{MOI.VariableIndex},
494+
f,
495+
)
496+
X = Dict{MOI.VariableIndex,Float64}(
497+
x => MOI.get(model.inner, MOI.VariablePrimal(), x) for x in variables
498+
)
499+
Y = MOI.Utilities.eval_variables(x -> X[x], f)
500+
return X, Y
501+
end
502+
491503
for file in readdir(joinpath(@__DIR__, "algorithms"))
492504
include(joinpath(@__DIR__, "algorithms", file))
493505
end

src/algorithms/EpsilonConstraint.jl

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -110,11 +110,7 @@ function optimize_multiobjective!(
110110
if MOI.get(model.inner, MOI.TerminationStatus()) != MOI.OPTIMAL
111111
break
112112
end
113-
X = Dict{MOI.VariableIndex,Float64}(
114-
x => MOI.get(model.inner, MOI.VariablePrimal(), x) for
115-
x in variables
116-
)
117-
Y = MOI.Utilities.eval_variables(x -> X[x], model.f)
113+
X, Y = _compute_point(model, variables, model.f)
118114
if isempty(solutions) || !(Y solutions[end].y)
119115
push!(solutions, SolutionPoint(X, Y))
120116
end

src/algorithms/Hierarchical.jl

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -107,11 +107,7 @@ function optimize_multiobjective!(algorithm::Hierarchical, model::Optimizer)
107107
break
108108
end
109109
# Add tolerance constraints
110-
X = Dict{MOI.VariableIndex,Float64}(
111-
x => MOI.get(model.inner, MOI.VariablePrimal(), x) for
112-
x in variables
113-
)
114-
Y = MOI.Utilities.eval_variables(x -> X[x], new_vector_f)
110+
X, Y = _compute_point(model, variables, new_vector_f)
115111
sense = MOI.get(model.inner, MOI.ObjectiveSense())
116112
for (i, fi) in enumerate(MOI.Utilities.eachscalar(new_vector_f))
117113
rtol = MOI.get(algorithm, ObjectiveRelativeTolerance(i))
@@ -123,10 +119,7 @@ function optimize_multiobjective!(algorithm::Hierarchical, model::Optimizer)
123119
push!(constraints, MOI.add_constraint(model, fi, set))
124120
end
125121
end
126-
X = Dict{MOI.VariableIndex,Float64}(
127-
x => MOI.get(model.inner, MOI.VariablePrimal(), x) for x in variables
128-
)
129-
Y = MOI.Utilities.eval_variables(x -> X[x], model.f)
122+
X, Y = _compute_point(model, variables, model.f)
130123
# Remove tolerance constraints
131124
for c in constraints
132125
MOI.delete(model, c)

src/algorithms/KirlikSayin.jl

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,6 @@ function _update_list(L::Vector{_Rectangle}, f::Vector{Float64})
6767
return L_new
6868
end
6969

70-
function _compute_objective(model, variables, f)
71-
X = Dict{MOI.VariableIndex,Float64}(
72-
x => MOI.get(model.inner, MOI.VariablePrimal(), x) for x in variables
73-
)
74-
Y = MOI.Utilities.eval_variables(x -> X[x], f)
75-
return X, Y
76-
end
77-
7870
function _project(x::Vector{Float64}, axis::Int)
7971
return [x[i] for i in 1:length(x) if i != axis]
8072
end
@@ -114,7 +106,7 @@ function optimize_multiobjective!(algorithm::KirlikSayin, model::Optimizer)
114106
if MOI.get(model.inner, MOI.TerminationStatus()) != MOI.OPTIMAL
115107
return MOI.OTHER_ERROR, nothing
116108
end
117-
_, Y = _compute_objective(model, variables, f_i)
109+
_, Y = _compute_point(model, variables, f_i)
118110
yI[i] = Y
119111
MOI.set(
120112
model.inner,
@@ -125,7 +117,7 @@ function optimize_multiobjective!(algorithm::KirlikSayin, model::Optimizer)
125117
if MOI.get(model.inner, MOI.TerminationStatus()) != MOI.OPTIMAL
126118
return MOI.OTHER_ERROR, nothing
127119
end
128-
_, Y = _compute_objective(model, variables, f_i)
120+
_, Y = _compute_point(model, variables, f_i)
129121
yN[i] = Y
130122
end
131123
# Reset the sense after modifying it.
@@ -175,7 +167,7 @@ function optimize_multiobjective!(algorithm::KirlikSayin, model::Optimizer)
175167
_remove_rectangle(L, _Rectangle(_project(yI, k), uᵢ))
176168
continue
177169
end
178-
X, Y = _compute_objective(model, variables, model.f)
170+
X, Y = _compute_point(model, variables, model.f)
179171
Y_proj = _project(Y, k)
180172
if !(Y in YN)
181173
push!(solutions, SolutionPoint(X, Y))

src/algorithms/Lexicographic.jl

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -72,26 +72,16 @@ function _solve_in_sequence(
7272
if MOI.get(model.inner, MOI.TerminationStatus()) != MOI.OPTIMAL
7373
return MOI.OTHER_ERROR, nothing
7474
end
75-
# Add tolerance constraints
76-
X = Dict{MOI.VariableIndex,Float64}(
77-
x => MOI.get(model.inner, MOI.VariablePrimal(), x) for
78-
x in variables
79-
)
80-
Y = MOI.Utilities.eval_variables(x -> X[x], f)
81-
sense = MOI.get(model.inner, MOI.ObjectiveSense())
75+
X, Y = _compute_point(model, variables, f)
8276
rtol = MOI.get(algorithm, ObjectiveRelativeTolerance(i))
83-
set = if sense == MOI.MIN_SENSE
77+
set = if MOI.get(model.inner, MOI.ObjectiveSense()) == MOI.MIN_SENSE
8478
MOI.LessThan(Y + rtol * abs(Y))
8579
else
8680
MOI.GreaterThan(Y - rtol * abs(Y))
8781
end
8882
push!(constraints, MOI.add_constraint(model, f, set))
8983
end
90-
X = Dict{MOI.VariableIndex,Float64}(
91-
x => MOI.get(model.inner, MOI.VariablePrimal(), x) for x in variables
92-
)
93-
Y = MOI.Utilities.eval_variables(x -> X[x], model.f)
94-
# Remove tolerance constraints
84+
X, Y = _compute_point(model, variables, model.f)
9585
for c in constraints
9686
MOI.delete(model, c)
9787
end

src/algorithms/NISE.jl

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,8 @@ function _solve_weighted_sum(model::Optimizer, ::NISE, weights::Vector{Float64})
4545
if status != MOI.OPTIMAL
4646
return status, nothing
4747
end
48-
X = Dict{MOI.VariableIndex,Float64}(
49-
x => MOI.get(model.inner, MOI.VariablePrimal(), x) for
50-
x in MOI.get(model.inner, MOI.ListOfVariableIndices())
51-
)
52-
Y = MOI.Utilities.eval_variables(x -> X[x], model.f)
48+
variables = MOI.get(model.inner, MOI.ListOfVariableIndices())
49+
X, Y = _compute_point(model, variables, model.f)
5350
return status, SolutionPoint(X, Y)
5451
end
5552

0 commit comments

Comments
 (0)