diff --git a/Project.toml b/Project.toml index f69a86a5..ed6b3d88 100644 --- a/Project.toml +++ b/Project.toml @@ -7,6 +7,7 @@ DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" JuMP = "4076af6c-e467-56ae-b986-b466b2749572" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" Requires = "ae029012-a4dd-5104-9daa-d747884805df" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" diff --git a/src/ADNLPProblems/ackley.jl b/src/ADNLPProblems/ackley.jl new file mode 100644 index 00000000..d6599ef7 --- /dev/null +++ b/src/ADNLPProblems/ackley.jl @@ -0,0 +1,16 @@ +export ackley +using Random + +function ackley(; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} + rng = get(kwargs, :rng, Random.MersenneTwister(0)) + function f(x) + n = length(x) + sum1 = sum(x[i]^2 for i = 1:n) + sum2 = sum(cos(2 * T(π) * x[i]) for i = 1:n) + return -20 * exp(-T(0.2) * sqrt(sum1 / n)) - exp(sum2 / n) + 20 + T(ℯ) + end + x0 = T[-32 + 64 * rand(rng, T) for _ = 1:n] + lvar = fill(T(-32.768), n) + uvar = fill(T(32.768), n) + return ADNLPModels.ADNLPModel(f, x0; lvar = lvar, uvar = uvar, name = "ackley", kwargs...) +end diff --git a/src/ADNLPProblems/griewank.jl b/src/ADNLPProblems/griewank.jl new file mode 100644 index 00000000..34a2ccad --- /dev/null +++ b/src/ADNLPProblems/griewank.jl @@ -0,0 +1,12 @@ +export griewank + +function griewank(; n::Int = default_nvar, type::Type{T} = Float64, x0::Union{Nothing, AbstractVector{T}} = nothing, kwargs...) where {T} + function f(x) + n = length(x) + sum_term = sum(x[i]^2 for i = 1:n) / 4000 + prod_term = prod(cos(x[i] / sqrt(T(i))) for i = 1:n) + return sum_term - prod_term + 1 + end + x0_local = isnothing(x0) ? zeros(T, n) : x0 + return ADNLPModels.ADNLPModel(f, x0_local, name = "griewank"; kwargs...) +end diff --git a/src/ADNLPProblems/rastrigin.jl b/src/ADNLPProblems/rastrigin.jl new file mode 100644 index 00000000..b54df5a3 --- /dev/null +++ b/src/ADNLPProblems/rastrigin.jl @@ -0,0 +1,12 @@ +export rastrigin + +function rastrigin(; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} + function f(x) + n = length(x) + return 10 * n + sum(x[i]^2 - 10 * cos(2 * T(π) * x[i]) for i = 1:n) + end + x0 = zeros(T, n) + lvar = T[-5.12 for _ = 1:n] + uvar = T[5.12 for _ = 1:n] + return ADNLPModels.ADNLPModel(f, x0, lvar = lvar, uvar = uvar, name = "rastrigin"; kwargs...) +end diff --git a/src/ADNLPProblems/sphere.jl b/src/ADNLPProblems/sphere.jl new file mode 100644 index 00000000..632ad942 --- /dev/null +++ b/src/ADNLPProblems/sphere.jl @@ -0,0 +1,11 @@ +export sphere + +function sphere(; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} + function f(x) + return sum(x[i]^2 for i = 1:length(x)) + end + x0 = zeros(T, n) + lvar = fill(T(-5.12), n) + uvar = fill(T(5.12), n) + return ADNLPModels.ADNLPModel(f, x0; lvar = lvar, uvar = uvar, name = "sphere", kwargs...) +end diff --git a/src/Meta/ackley.jl b/src/Meta/ackley.jl new file mode 100644 index 00000000..c71f06e9 --- /dev/null +++ b/src/Meta/ackley.jl @@ -0,0 +1,25 @@ +ackley_meta = Dict( + :nvar => 100, + :variable_nvar => true, + :ncon => 0, + :variable_ncon => false, + :minimize => true, + :name => "ackley", + :has_equalities_only => false, + :has_inequalities_only => false, + :has_bounds => true, + :has_fixed_variables => false, + :objtype => :other, + :contype => :unconstrained, + :best_known_lower_bound => 0.0, + :best_known_upper_bound => 0.0, + :is_feasible => true, + :defined_everywhere => missing, + :origin => :unknown, +) +get_ackley_nvar(; n::Integer = default_nvar, kwargs...) = n +get_ackley_ncon(; n::Integer = default_nvar, kwargs...) = 0 +get_ackley_nlin(; n::Integer = default_nvar, kwargs...) = 0 +get_ackley_nnln(; n::Integer = default_nvar, kwargs...) = 0 +get_ackley_nequ(; n::Integer = default_nvar, kwargs...) = 0 +get_ackley_nineq(; n::Integer = default_nvar, kwargs...) = 0 diff --git a/src/Meta/griewank.jl b/src/Meta/griewank.jl new file mode 100644 index 00000000..4ad548a1 --- /dev/null +++ b/src/Meta/griewank.jl @@ -0,0 +1,25 @@ +griewank_meta = Dict( + :nvar => 100, + :variable_nvar => true, + :ncon => 0, + :variable_ncon => false, + :minimize => true, + :name => "griewank", + :has_equalities_only => false, + :has_inequalities_only => false, + :has_bounds => true, + :has_fixed_variables => false, + :objtype => :other, + :contype => :unconstrained, + :best_known_lower_bound => 0.0, + :best_known_upper_bound => 0.0, + :is_feasible => true, + :defined_everywhere => missing, + :origin => :unknown, +) +get_griewank_nvar(; n::Integer = default_nvar, kwargs...) = n +get_griewank_ncon(; n::Integer = default_nvar, kwargs...) = 0 +get_griewank_nlin(; n::Integer = default_nvar, kwargs...) = 0 +get_griewank_nnln(; n::Integer = default_nvar, kwargs...) = 0 +get_griewank_nequ(; n::Integer = default_nvar, kwargs...) = 0 +get_griewank_nineq(; n::Integer = default_nvar, kwargs...) = 0 diff --git a/src/Meta/rastrigin.jl b/src/Meta/rastrigin.jl new file mode 100644 index 00000000..ac6b3d69 --- /dev/null +++ b/src/Meta/rastrigin.jl @@ -0,0 +1,25 @@ +rastrigin_meta = Dict( + :nvar => 100, + :variable_nvar => true, + :ncon => 0, + :variable_ncon => false, + :minimize => true, + :name => "rastrigin", + :has_equalities_only => false, + :has_inequalities_only => false, + :has_bounds => true, + :has_fixed_variables => false, + :objtype => :other, + :contype => :unconstrained, + :best_known_lower_bound => 0.0, + :best_known_upper_bound => 0.0, + :is_feasible => true, + :defined_everywhere => missing, + :origin => :unknown, +) +get_rastrigin_nvar(; n::Integer = default_nvar, kwargs...) = n +get_rastrigin_ncon(; n::Integer = default_nvar, kwargs...) = 0 +get_rastrigin_nlin(; n::Integer = default_nvar, kwargs...) = 0 +get_rastrigin_nnln(; n::Integer = default_nvar, kwargs...) = 0 +get_rastrigin_nequ(; n::Integer = default_nvar, kwargs...) = 0 +get_rastrigin_nineq(; n::Integer = default_nvar, kwargs...) = 0 diff --git a/src/Meta/sphere.jl b/src/Meta/sphere.jl new file mode 100644 index 00000000..264425fb --- /dev/null +++ b/src/Meta/sphere.jl @@ -0,0 +1,25 @@ +sphere_meta = Dict( + :nvar => 100, + :variable_nvar => true, + :ncon => 0, + :variable_ncon => false, + :minimize => true, + :name => "sphere", + :has_equalities_only => false, + :has_inequalities_only => false, + :has_bounds => true, + :has_fixed_variables => false, + :objtype => :other, + :contype => :unconstrained, + :best_known_lower_bound => 0.0, + :best_known_upper_bound => 0.0, + :is_feasible => true, + :defined_everywhere => missing, + :origin => :unknown, +) +get_sphere_nvar(; n::Integer = default_nvar, kwargs...) = n +get_sphere_ncon(; n::Integer = default_nvar, kwargs...) = 0 +get_sphere_nlin(; n::Integer = default_nvar, kwargs...) = 0 +get_sphere_nnln(; n::Integer = default_nvar, kwargs...) = 0 +get_sphere_nequ(; n::Integer = default_nvar, kwargs...) = 0 +get_sphere_nineq(; n::Integer = default_nvar, kwargs...) = 0 diff --git a/src/PureJuMP/ackley.jl b/src/PureJuMP/ackley.jl new file mode 100644 index 00000000..88d4dc34 --- /dev/null +++ b/src/PureJuMP/ackley.jl @@ -0,0 +1,38 @@ +# Ackley test function +# +# A multivariate multimodal optimization problem from the +# AMPGO test set. +# +# Problem Ackley in +# http://infinity77.net/global_optimization/test_functions_nd_A.html +# Andrea Gavana +# +# f(x) = -20*exp(-0.2*sqrt(sum(x_i^2)/n)) - exp(sum(cos(2*pi*x_i))/n) + 20 + e +# +# Global minimum: f(0,...,0) = 0 +# Bounds: x_i in [-32, 32] for all i + +export ackley + +"Ackley multimodal minimization problem" +function ackley(args...; n::Int = default_nvar, kwargs...) + n < 1 && @warn("ackley: number of variables must be ≥ 1") + n = max(1, n) + + nlp = Model() + + x0 = [-32 + 64 * rand() for i = 1:n] + @variable(nlp, -32 <= x[i = 1:n] <= 32, start = x0[i]) + nlp.ext[:has_bounds] = true + + @objective( + nlp, + Min, + -20 * exp(-0.2 * sqrt(sum(x[i]^2 for i = 1:n) / n)) - + exp(sum(cos(2 * π * x[i]) for i = 1:n) / n) + + 20 + + exp(1) + ) + + return nlp +end diff --git a/src/PureJuMP/griewank.jl b/src/PureJuMP/griewank.jl new file mode 100644 index 00000000..75fc00d5 --- /dev/null +++ b/src/PureJuMP/griewank.jl @@ -0,0 +1,38 @@ +# Griewank test function +# +# A multivariate multimodal optimization problem from the +# AMPGO test set. +# +# Problem Griewank in +# http://infinity77.net/global_optimization/test_functions_nd_G.html +# Andrea Gavana +# +# f(x) = sum(x_i^2)/4000 - prod(cos(x_i/sqrt(i))) + 1 +# +# Global minimum: f(0,...,0) = 0 +# Bounds: x_i in [-600, 600] for all i + +export griewank + +"Griewank multimodal minimization problem" +function griewank(args...; n::Int = default_nvar, x0::Union{Nothing,AbstractVector} = nothing, kwargs...) + n < 1 && @warn("griewank: number of variables must be ≥ 1") + n = max(1, n) + + nlp = Model() + + if x0 === nothing + x0 = zeros(n) + elseif length(x0) != n + throw(ArgumentError("griewank: length(x0) = $(length(x0)) must equal n = $n")) + end + @variable(nlp, -600 <= x[i = 1:n] <= 600, start = x0[i]) + + @objective( + nlp, + Min, + sum(x[i]^2 for i = 1:n) / 4000 - prod(cos(x[i] / sqrt(i)) for i = 1:n) + 1 + ) + + return nlp +end diff --git a/src/PureJuMP/rastrigin.jl b/src/PureJuMP/rastrigin.jl new file mode 100644 index 00000000..1ec58322 --- /dev/null +++ b/src/PureJuMP/rastrigin.jl @@ -0,0 +1,30 @@ +# Rastrigin test function +# +# A multivariate highly multimodal optimization problem from the +# AMPGO test set. +# +# Problem Rastrigin in +# http://infinity77.net/global_optimization/test_functions_nd_R.html +# Andrea Gavana +# +# f(x) = 10*n + sum(x_i^2 - 10*cos(2*pi*x_i)) +# +# Global minimum: f(0,...,0) = 0 +# Bounds: x_i in [-5.12, 5.12] for all i + +export rastrigin + +"Rastrigin multimodal minimization problem" +function rastrigin(args...; n::Int = default_nvar, kwargs...) + n < 1 && @warn("rastrigin: number of variables must be ≥ 1") + n = max(1, n) + + nlp = Model() + + x0 = [0.0 for i = 1:n] + @variable(nlp, x[i = 1:n], lower_bound = -5.12, upper_bound = 5.12, start = x0[i]) + + @objective(nlp, Min, 10 * n + sum(x[i]^2 - 10 * cos(2 * π * x[i]) for i = 1:n)) + + return nlp +end diff --git a/src/PureJuMP/sphere.jl b/src/PureJuMP/sphere.jl new file mode 100644 index 00000000..9e8ef36b --- /dev/null +++ b/src/PureJuMP/sphere.jl @@ -0,0 +1,30 @@ +# Sphere test function +# +# A simple multivariate convex optimization problem from the +# AMPGO test set. +# +# Problem Sphere in +# http://infinity77.net/global_optimization/test_functions_nd_S.html +# Andrea Gavana +# +# f(x) = sum(x_i^2) +# +# Global minimum: f(0,...,0) = 0 +# Bounds: x_i in [-1, 1] for all i + +export sphere + +"Sphere convex minimization problem" +function sphere(args...; n::Int = default_nvar, kwargs...) + n < 1 && @warn("sphere: number of variables must be ≥ 1") + n = max(1, n) + + nlp = Model() + + x0 = zeros(n) + @variable(nlp, -1 <= x[i = 1:n] <= 1, start = x0[i]) + + @objective(nlp, Min, sum(x[i]^2 for i = 1:n)) + + return nlp +end