diff --git a/Project.toml b/Project.toml index 3f21bba..f621566 100644 --- a/Project.toml +++ b/Project.toml @@ -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] diff --git a/src/MultiObjectiveAlgorithms.jl b/src/MultiObjectiveAlgorithms.jl index 6826554..fd57efb 100644 --- a/src/MultiObjectiveAlgorithms.jl +++ b/src/MultiObjectiveAlgorithms.jl @@ -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} @@ -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[], diff --git a/src/algorithms/Chalmet.jl b/src/algorithms/Chalmet.jl index 3714248..145f322 100644 --- a/src/algorithms/Chalmet.jl +++ b/src/algorithms/Chalmet.jl @@ -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)) diff --git a/src/algorithms/KirlikSayin.jl b/src/algorithms/KirlikSayin.jl index eea430d..e6688bd 100644 --- a/src/algorithms/KirlikSayin.jl +++ b/src/algorithms/KirlikSayin.jl @@ -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 = diff --git a/test/algorithms/Chalmet.jl b/test/algorithms/Chalmet.jl index f7ed540..5175108 100644 --- a/test/algorithms/Chalmet.jl +++ b/test/algorithms/Chalmet.jl @@ -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() diff --git a/test/algorithms/Dichotomy.jl b/test/algorithms/Dichotomy.jl index f79c578..05604e4 100644 --- a/test/algorithms/Dichotomy.jl +++ b/test/algorithms/Dichotomy.jl @@ -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() diff --git a/test/algorithms/DominguezRios.jl b/test/algorithms/DominguezRios.jl index 9704dc7..4b7d2db 100644 --- a/test/algorithms/DominguezRios.jl +++ b/test/algorithms/DominguezRios.jl @@ -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() diff --git a/test/algorithms/EpsilonConstraint.jl b/test/algorithms/EpsilonConstraint.jl index 2b8b89c..07c7fd9 100644 --- a/test/algorithms/EpsilonConstraint.jl +++ b/test/algorithms/EpsilonConstraint.jl @@ -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() diff --git a/test/algorithms/Hierarchical.jl b/test/algorithms/Hierarchical.jl index 4405aeb..c024e16 100644 --- a/test/algorithms/Hierarchical.jl +++ b/test/algorithms/Hierarchical.jl @@ -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() diff --git a/test/algorithms/KirlikSayin.jl b/test/algorithms/KirlikSayin.jl index 17187db..71ca424 100644 --- a/test/algorithms/KirlikSayin.jl +++ b/test/algorithms/KirlikSayin.jl @@ -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() diff --git a/test/algorithms/Lexicographic.jl b/test/algorithms/Lexicographic.jl index 670a6c7..b0ddde3 100644 --- a/test/algorithms/Lexicographic.jl +++ b/test/algorithms/Lexicographic.jl @@ -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()