Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee"
Combinatorics = "1"
HiGHS = "1"
Ipopt = "1"
MathOptInterface = "1.12"
MathOptInterface = "1.13"
julia = "1.6"

[extras]
Expand Down
17 changes: 6 additions & 11 deletions src/MultiObjectiveAlgorithms.jl
Original file line number Diff line number Diff line change
Expand Up @@ -92,16 +92,6 @@ abstract type AbstractAlgorithm end

MOI.Utilities.map_indices(::Function, x::AbstractAlgorithm) = x

function _instantiate_with_cache(optimizer_factory)
model = MOI.instantiate(optimizer_factory)
if !MOI.supports_incremental_interface(model)
# A cache will already have been added
return model
end
cache = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}())
return MOI.Utilities.CachingOptimizer(cache, model)
end

mutable struct Optimizer <: MOI.AbstractOptimizer
inner::MOI.AbstractOptimizer
algorithm::Union{Nothing,AbstractAlgorithm}
Expand All @@ -112,8 +102,13 @@ mutable struct Optimizer <: MOI.AbstractOptimizer
solve_time::Float64

function Optimizer(optimizer_factory)
inner = MOI.instantiate(
optimizer_factory;
with_bridge_type = Float64,
with_cache_type = Float64,
)
return new(
_instantiate_with_cache(optimizer_factory),
inner,
nothing,
nothing,
SolutionPoint[],
Expand Down
3 changes: 2 additions & 1 deletion src/algorithms/Chalmet.jl
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ function _solve_constrained_model(
rhs::Vector{Float64},
)
f = MOI.Utilities.scalarize(model.f)
MOI.set(model.inner, MOI.ObjectiveFunction{typeof(sum(f))}(), sum(f))
g = sum(1.0 * fi for fi in f)
MOI.set(model.inner, MOI.ObjectiveFunction{typeof(g)}(), g)
constraints = [
MOI.add_constraint(model.inner, f[1], MOI.LessThan(rhs[1] - 1))
MOI.add_constraint(model.inner, f[2], MOI.LessThan(rhs[2] - 1))
Expand Down
2 changes: 1 addition & 1 deletion src/algorithms/KirlikSayin.jl
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ function optimize_multiobjective!(algorithm::KirlikSayin, model::Optimizer)
zₖ = MOI.get(model.inner, MOI.ObjectiveValue())
# Solving the second stage model: Q_k(ε, zₖ)
# Set objective sum(model.f)
sum_f = sum(scalars)
sum_f = sum(1.0 * s for s in scalars)
MOI.set(model.inner, MOI.ObjectiveFunction{typeof(sum_f)}(), sum_f)
# Constraint to eliminate weak dominance
zₖ_constraint =
Expand Down
15 changes: 15 additions & 0 deletions test/algorithms/Chalmet.jl
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,21 @@ function test_infeasible()
return
end

function test_vector_of_variables_objective()
model = MOA.Optimizer(HiGHS.Optimizer)
MOI.set(model, MOA.Algorithm(), MOA.Chalmet())
MOI.set(model, MOI.Silent(), true)
x = MOI.add_variables(model, 2)
MOI.add_constraint.(model, x, MOI.ZeroOne())
f = MOI.VectorOfVariables(x)
MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE)
MOI.set(model, MOI.ObjectiveFunction{typeof(f)}(), f)
MOI.add_constraint(model, sum(1.0 * xi for xi in x), MOI.GreaterThan(1.0))
MOI.optimize!(model)
MOI.get(model, MOI.TerminationStatus()) == MOI.OPTIMAL
return
end

end

TestChalmet.run_tests()
15 changes: 15 additions & 0 deletions test/algorithms/Dichotomy.jl
Original file line number Diff line number Diff line change
Expand Up @@ -392,6 +392,21 @@ function test_quadratic()
return
end

function test_vector_of_variables_objective()
model = MOA.Optimizer(HiGHS.Optimizer)
MOI.set(model, MOA.Algorithm(), MOA.Dichotomy())
MOI.set(model, MOI.Silent(), true)
x = MOI.add_variables(model, 2)
MOI.add_constraint.(model, x, MOI.ZeroOne())
f = MOI.VectorOfVariables(x)
MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE)
MOI.set(model, MOI.ObjectiveFunction{typeof(f)}(), f)
MOI.add_constraint(model, sum(1.0 * xi for xi in x), MOI.GreaterThan(1.0))
MOI.optimize!(model)
MOI.get(model, MOI.TerminationStatus()) == MOI.OPTIMAL
return
end

end

TestDichotomy.run_tests()
15 changes: 15 additions & 0 deletions test/algorithms/DominguezRios.jl
Original file line number Diff line number Diff line change
Expand Up @@ -583,6 +583,21 @@ function test_time_limit()
return
end

function test_vector_of_variables_objective()
model = MOA.Optimizer(HiGHS.Optimizer)
MOI.set(model, MOA.Algorithm(), MOA.DominguezRios())
MOI.set(model, MOI.Silent(), true)
x = MOI.add_variables(model, 2)
MOI.add_constraint.(model, x, MOI.ZeroOne())
f = MOI.VectorOfVariables(x)
MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE)
MOI.set(model, MOI.ObjectiveFunction{typeof(f)}(), f)
MOI.add_constraint(model, sum(1.0 * xi for xi in x), MOI.GreaterThan(1.0))
MOI.optimize!(model)
MOI.get(model, MOI.TerminationStatus()) == MOI.OPTIMAL
return
end

end

TestDominguezRios.run_tests()
15 changes: 15 additions & 0 deletions test/algorithms/EpsilonConstraint.jl
Original file line number Diff line number Diff line change
Expand Up @@ -417,6 +417,21 @@ function test_time_limit_large()
return
end

function test_vector_of_variables_objective()
model = MOA.Optimizer(HiGHS.Optimizer)
MOI.set(model, MOA.Algorithm(), MOA.EpsilonConstraint())
MOI.set(model, MOI.Silent(), true)
x = MOI.add_variables(model, 2)
MOI.add_constraint.(model, x, MOI.ZeroOne())
f = MOI.VectorOfVariables(x)
MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE)
MOI.set(model, MOI.ObjectiveFunction{typeof(f)}(), f)
MOI.add_constraint(model, sum(1.0 * xi for xi in x), MOI.GreaterThan(1.0))
MOI.optimize!(model)
MOI.get(model, MOI.TerminationStatus()) == MOI.OPTIMAL
return
end

end

TestEpsilonConstraint.run_tests()
15 changes: 15 additions & 0 deletions test/algorithms/Hierarchical.jl
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,21 @@ function test_unbounded()
return
end

function test_vector_of_variables_objective()
model = MOA.Optimizer(HiGHS.Optimizer)
MOI.set(model, MOA.Algorithm(), MOA.Hierarchical())
MOI.set(model, MOI.Silent(), true)
x = MOI.add_variables(model, 2)
MOI.add_constraint.(model, x, MOI.ZeroOne())
f = MOI.VectorOfVariables(x)
MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE)
MOI.set(model, MOI.ObjectiveFunction{typeof(f)}(), f)
MOI.add_constraint(model, sum(1.0 * xi for xi in x), MOI.GreaterThan(1.0))
MOI.optimize!(model)
MOI.get(model, MOI.TerminationStatus()) == MOI.OPTIMAL
return
end

end

TestHierarchical.run_tests()
15 changes: 15 additions & 0 deletions test/algorithms/KirlikSayin.jl
Original file line number Diff line number Diff line change
Expand Up @@ -586,6 +586,21 @@ function test_time_limit()
return
end

function test_vector_of_variables_objective()
model = MOA.Optimizer(HiGHS.Optimizer)
MOI.set(model, MOA.Algorithm(), MOA.KirlikSayin())
MOI.set(model, MOI.Silent(), true)
x = MOI.add_variables(model, 2)
MOI.add_constraint.(model, x, MOI.ZeroOne())
f = MOI.VectorOfVariables(x)
MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE)
MOI.set(model, MOI.ObjectiveFunction{typeof(f)}(), f)
MOI.add_constraint(model, sum(1.0 * xi for xi in x), MOI.GreaterThan(1.0))
MOI.optimize!(model)
MOI.get(model, MOI.TerminationStatus()) == MOI.OPTIMAL
return
end

end

TestKirlikSayin.run_tests()
15 changes: 15 additions & 0 deletions test/algorithms/Lexicographic.jl
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,21 @@ function test_unbounded()
return
end

function test_vector_of_variables_objective()
model = MOA.Optimizer(HiGHS.Optimizer)
MOI.set(model, MOA.Algorithm(), MOA.Lexicographic())
MOI.set(model, MOI.Silent(), true)
x = MOI.add_variables(model, 2)
MOI.add_constraint.(model, x, MOI.ZeroOne())
f = MOI.VectorOfVariables(x)
MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE)
MOI.set(model, MOI.ObjectiveFunction{typeof(f)}(), f)
MOI.add_constraint(model, sum(1.0 * xi for xi in x), MOI.GreaterThan(1.0))
MOI.optimize!(model)
MOI.get(model, MOI.TerminationStatus()) == MOI.OPTIMAL
return
end

end

TestLexicographic.run_tests()