From cacd03119956163c88890d7dbdeea5f66cd6d6de Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Mon, 2 Mar 2026 15:15:44 +0530 Subject: [PATCH 1/6] Add AMPGO multivariate test functions (Ackley, Rastrigin, Griewank, Sphere) Implements four commonly-used multivariate optimization benchmark functions from the AMPGO test set as part of addressing issue #236. These functions are widely used in global optimization and provide good test cases for optimization algorithms. - Ackley: n-dimensional multimodal function with bounds [-32, 32] - Rastrigin: n-dimensional highly multimodal function with bounds [-5.12, 5.12] - Griewank: n-dimensional multimodal function with bounds [-600, 600] - Sphere: simple n-dimensional convex function with bounds [-1, 1] All functions follow the standard ADNLPProblems pattern and support arbitrary dimensions and data types. Closes #236 (partial - adds 4 of 184 multivariate problems) --- src/ADNLPProblems/ackley.jl | 12 ++++++++++++ src/ADNLPProblems/griewank.jl | 12 ++++++++++++ src/ADNLPProblems/rastrigin.jl | 10 ++++++++++ src/ADNLPProblems/sphere.jl | 9 +++++++++ 4 files changed, 43 insertions(+) create mode 100644 src/ADNLPProblems/ackley.jl create mode 100644 src/ADNLPProblems/griewank.jl create mode 100644 src/ADNLPProblems/rastrigin.jl create mode 100644 src/ADNLPProblems/sphere.jl diff --git a/src/ADNLPProblems/ackley.jl b/src/ADNLPProblems/ackley.jl new file mode 100644 index 00000000..09169ee6 --- /dev/null +++ b/src/ADNLPProblems/ackley.jl @@ -0,0 +1,12 @@ +export ackley + +function ackley(; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} + 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(T) for _ = 1:n] + return ADNLPModels.ADNLPModel(f, x0, name = "ackley"; kwargs...) +end diff --git a/src/ADNLPProblems/griewank.jl b/src/ADNLPProblems/griewank.jl new file mode 100644 index 00000000..330df3c5 --- /dev/null +++ b/src/ADNLPProblems/griewank.jl @@ -0,0 +1,12 @@ +export griewank + +function griewank(; n::Int = default_nvar, type::Type{T} = Float64, 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 = T[-600 + 1200 * rand(T) for _ = 1:n] + return ADNLPModels.ADNLPModel(f, x0, name = "griewank"; kwargs...) +end diff --git a/src/ADNLPProblems/rastrigin.jl b/src/ADNLPProblems/rastrigin.jl new file mode 100644 index 00000000..b2786cd1 --- /dev/null +++ b/src/ADNLPProblems/rastrigin.jl @@ -0,0 +1,10 @@ +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 = T[-5.12 + 10.24 * rand(T) for _ = 1:n] + return ADNLPModels.ADNLPModel(f, x0, name = "rastrigin"; kwargs...) +end diff --git a/src/ADNLPProblems/sphere.jl b/src/ADNLPProblems/sphere.jl new file mode 100644 index 00000000..dd14432b --- /dev/null +++ b/src/ADNLPProblems/sphere.jl @@ -0,0 +1,9 @@ +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 = T[-1 + 2 * rand(T) for _ = 1:n] + return ADNLPModels.ADNLPModel(f, x0, name = "sphere"; kwargs...) +end From 0a64e742d097da9a71ba36f4b09a937e8eb11c0b Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Mon, 2 Mar 2026 15:19:00 +0530 Subject: [PATCH 2/6] Add Meta and PureJuMP implementations for AMPGO multivariate functions Adds Meta metadata and PureJuMP model definitions for the four AMPGO multivariate test functions (Ackley, Rastrigin, Griewank, Sphere). Meta files include: - Problem metadata (dimensions, constraints, bounds) - Helper functions for getting problem dimensions PureJuMP files include: - JuMP model definitions using @variable and @objective - Support for arbitrary dimensions via n parameter - Random initial points within specified bounds - Problem documentation with references These complement the ADNLPProblems implementations added in the previous commit. --- src/Meta/ackley.jl | 25 +++++++++++++++++++++++++ src/Meta/griewank.jl | 25 +++++++++++++++++++++++++ src/Meta/rastrigin.jl | 25 +++++++++++++++++++++++++ src/Meta/sphere.jl | 25 +++++++++++++++++++++++++ src/PureJuMP/ackley.jl | 37 +++++++++++++++++++++++++++++++++++++ src/PureJuMP/griewank.jl | 34 ++++++++++++++++++++++++++++++++++ src/PureJuMP/rastrigin.jl | 30 ++++++++++++++++++++++++++++++ src/PureJuMP/sphere.jl | 30 ++++++++++++++++++++++++++++++ 8 files changed, 231 insertions(+) create mode 100644 src/Meta/ackley.jl create mode 100644 src/Meta/griewank.jl create mode 100644 src/Meta/rastrigin.jl create mode 100644 src/Meta/sphere.jl create mode 100644 src/PureJuMP/ackley.jl create mode 100644 src/PureJuMP/griewank.jl create mode 100644 src/PureJuMP/rastrigin.jl create mode 100644 src/PureJuMP/sphere.jl diff --git a/src/Meta/ackley.jl b/src/Meta/ackley.jl new file mode 100644 index 00000000..6c386d66 --- /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 => false, + :has_fixed_variables => false, + :objtype => :other, + :contype => :unconstrained, + :best_known_lower_bound => -Inf, + :best_known_upper_bound => 20.0 + exp(1.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..04026a87 --- /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 => false, + :has_fixed_variables => false, + :objtype => :other, + :contype => :unconstrained, + :best_known_lower_bound => -Inf, + :best_known_upper_bound => 360001.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..2c4c965d --- /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 => false, + :has_fixed_variables => false, + :objtype => :other, + :contype => :unconstrained, + :best_known_lower_bound => -Inf, + :best_known_upper_bound => 10000.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..d2e2fec4 --- /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 => false, + :has_fixed_variables => false, + :objtype => :other, + :contype => :unconstrained, + :best_known_lower_bound => -Inf, + :best_known_upper_bound => 100.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..402a34d3 --- /dev/null +++ b/src/PureJuMP/ackley.jl @@ -0,0 +1,37 @@ +# 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, x[i = 1:n], start = x0[i]) + + @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..7aeaf3d5 --- /dev/null +++ b/src/PureJuMP/griewank.jl @@ -0,0 +1,34 @@ +# 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, kwargs...) + n < 1 && @warn("griewank: number of variables must be ≥ 1") + n = max(1, n) + + nlp = Model() + + x0 = [-600 + 1200 * rand() for i = 1:n] + @variable(nlp, x[i = 1:n], 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..d154b6bb --- /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 = [-5.12 + 10.24 * rand() for i = 1:n] + @variable(nlp, x[i = 1:n], 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..25cfca67 --- /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 = [-1 + 2 * rand() for i = 1:n] + @variable(nlp, x[i = 1:n], start = x0[i]) + + @objective(nlp, Min, sum(x[i]^2 for i = 1:n)) + + return nlp +end From c38d708a00919542f504548650cac12bf81f474f Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Mon, 2 Mar 2026 15:34:27 +0530 Subject: [PATCH 3/6] Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/ADNLPProblems/ackley.jl | 8 ++++++-- src/ADNLPProblems/griewank.jl | 6 +++--- src/ADNLPProblems/rastrigin.jl | 6 ++++-- src/ADNLPProblems/sphere.jl | 6 ++++-- src/Meta/ackley.jl | 6 +++--- src/Meta/griewank.jl | 6 +++--- src/Meta/rastrigin.jl | 4 ++-- src/Meta/sphere.jl | 6 +++--- src/PureJuMP/ackley.jl | 3 ++- src/PureJuMP/griewank.jl | 10 +++++++--- src/PureJuMP/rastrigin.jl | 4 ++-- src/PureJuMP/sphere.jl | 4 ++-- 12 files changed, 41 insertions(+), 28 deletions(-) diff --git a/src/ADNLPProblems/ackley.jl b/src/ADNLPProblems/ackley.jl index 09169ee6..d6599ef7 100644 --- a/src/ADNLPProblems/ackley.jl +++ b/src/ADNLPProblems/ackley.jl @@ -1,12 +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(T) for _ = 1:n] - return ADNLPModels.ADNLPModel(f, x0, name = "ackley"; kwargs...) + 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 index 330df3c5..3869656c 100644 --- a/src/ADNLPProblems/griewank.jl +++ b/src/ADNLPProblems/griewank.jl @@ -1,12 +1,12 @@ export griewank -function griewank(; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} +function griewank(; n::Int = default_nvar, type::Type{T} = Float64, x0::AbstractVector{T} = T[], 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 = T[-600 + 1200 * rand(T) for _ = 1:n] - return ADNLPModels.ADNLPModel(f, x0, name = "griewank"; kwargs...) + x0_local = isempty(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 index b2786cd1..b54df5a3 100644 --- a/src/ADNLPProblems/rastrigin.jl +++ b/src/ADNLPProblems/rastrigin.jl @@ -5,6 +5,8 @@ function rastrigin(; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) n = length(x) return 10 * n + sum(x[i]^2 - 10 * cos(2 * T(π) * x[i]) for i = 1:n) end - x0 = T[-5.12 + 10.24 * rand(T) for _ = 1:n] - return ADNLPModels.ADNLPModel(f, x0, name = "rastrigin"; kwargs...) + 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 index dd14432b..632ad942 100644 --- a/src/ADNLPProblems/sphere.jl +++ b/src/ADNLPProblems/sphere.jl @@ -4,6 +4,8 @@ function sphere(; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) whe function f(x) return sum(x[i]^2 for i = 1:length(x)) end - x0 = T[-1 + 2 * rand(T) for _ = 1:n] - return ADNLPModels.ADNLPModel(f, x0, name = "sphere"; kwargs...) + 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 index 6c386d66..c71f06e9 100644 --- a/src/Meta/ackley.jl +++ b/src/Meta/ackley.jl @@ -7,12 +7,12 @@ ackley_meta = Dict( :name => "ackley", :has_equalities_only => false, :has_inequalities_only => false, - :has_bounds => false, + :has_bounds => true, :has_fixed_variables => false, :objtype => :other, :contype => :unconstrained, - :best_known_lower_bound => -Inf, - :best_known_upper_bound => 20.0 + exp(1.0), + :best_known_lower_bound => 0.0, + :best_known_upper_bound => 0.0, :is_feasible => true, :defined_everywhere => missing, :origin => :unknown, diff --git a/src/Meta/griewank.jl b/src/Meta/griewank.jl index 04026a87..4ad548a1 100644 --- a/src/Meta/griewank.jl +++ b/src/Meta/griewank.jl @@ -7,12 +7,12 @@ griewank_meta = Dict( :name => "griewank", :has_equalities_only => false, :has_inequalities_only => false, - :has_bounds => false, + :has_bounds => true, :has_fixed_variables => false, :objtype => :other, :contype => :unconstrained, - :best_known_lower_bound => -Inf, - :best_known_upper_bound => 360001.0, + :best_known_lower_bound => 0.0, + :best_known_upper_bound => 0.0, :is_feasible => true, :defined_everywhere => missing, :origin => :unknown, diff --git a/src/Meta/rastrigin.jl b/src/Meta/rastrigin.jl index 2c4c965d..b2a653c7 100644 --- a/src/Meta/rastrigin.jl +++ b/src/Meta/rastrigin.jl @@ -11,8 +11,8 @@ rastrigin_meta = Dict( :has_fixed_variables => false, :objtype => :other, :contype => :unconstrained, - :best_known_lower_bound => -Inf, - :best_known_upper_bound => 10000.0, + :best_known_lower_bound => 0.0, + :best_known_upper_bound => 0.0, :is_feasible => true, :defined_everywhere => missing, :origin => :unknown, diff --git a/src/Meta/sphere.jl b/src/Meta/sphere.jl index d2e2fec4..264425fb 100644 --- a/src/Meta/sphere.jl +++ b/src/Meta/sphere.jl @@ -7,12 +7,12 @@ sphere_meta = Dict( :name => "sphere", :has_equalities_only => false, :has_inequalities_only => false, - :has_bounds => false, + :has_bounds => true, :has_fixed_variables => false, :objtype => :other, :contype => :unconstrained, - :best_known_lower_bound => -Inf, - :best_known_upper_bound => 100.0, + :best_known_lower_bound => 0.0, + :best_known_upper_bound => 0.0, :is_feasible => true, :defined_everywhere => missing, :origin => :unknown, diff --git a/src/PureJuMP/ackley.jl b/src/PureJuMP/ackley.jl index 402a34d3..88d4dc34 100644 --- a/src/PureJuMP/ackley.jl +++ b/src/PureJuMP/ackley.jl @@ -22,7 +22,8 @@ function ackley(args...; n::Int = default_nvar, kwargs...) nlp = Model() x0 = [-32 + 64 * rand() for i = 1:n] - @variable(nlp, x[i = 1:n], start = x0[i]) + @variable(nlp, -32 <= x[i = 1:n] <= 32, start = x0[i]) + nlp.ext[:has_bounds] = true @objective( nlp, diff --git a/src/PureJuMP/griewank.jl b/src/PureJuMP/griewank.jl index 7aeaf3d5..75fc00d5 100644 --- a/src/PureJuMP/griewank.jl +++ b/src/PureJuMP/griewank.jl @@ -15,14 +15,18 @@ export griewank "Griewank multimodal minimization problem" -function griewank(args...; n::Int = default_nvar, kwargs...) +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() - x0 = [-600 + 1200 * rand() for i = 1:n] - @variable(nlp, x[i = 1:n], start = x0[i]) + 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, diff --git a/src/PureJuMP/rastrigin.jl b/src/PureJuMP/rastrigin.jl index d154b6bb..1ec58322 100644 --- a/src/PureJuMP/rastrigin.jl +++ b/src/PureJuMP/rastrigin.jl @@ -21,8 +21,8 @@ function rastrigin(args...; n::Int = default_nvar, kwargs...) nlp = Model() - x0 = [-5.12 + 10.24 * rand() for i = 1:n] - @variable(nlp, x[i = 1:n], start = x0[i]) + 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)) diff --git a/src/PureJuMP/sphere.jl b/src/PureJuMP/sphere.jl index 25cfca67..9e8ef36b 100644 --- a/src/PureJuMP/sphere.jl +++ b/src/PureJuMP/sphere.jl @@ -21,8 +21,8 @@ function sphere(args...; n::Int = default_nvar, kwargs...) nlp = Model() - x0 = [-1 + 2 * rand() for i = 1:n] - @variable(nlp, x[i = 1:n], start = x0[i]) + 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)) From daa7ad21dd15f3ab27de0f4644621fef45b5a95a Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Mon, 2 Mar 2026 15:35:03 +0530 Subject: [PATCH 4/6] Update rastrigin.jl --- src/Meta/rastrigin.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Meta/rastrigin.jl b/src/Meta/rastrigin.jl index b2a653c7..ac6b3d69 100644 --- a/src/Meta/rastrigin.jl +++ b/src/Meta/rastrigin.jl @@ -7,7 +7,7 @@ rastrigin_meta = Dict( :name => "rastrigin", :has_equalities_only => false, :has_inequalities_only => false, - :has_bounds => false, + :has_bounds => true, :has_fixed_variables => false, :objtype => :other, :contype => :unconstrained, From 49dc51ad55aa702d7db9ad49ad8fd0e61ad819b3 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Tue, 3 Mar 2026 14:16:34 +0530 Subject: [PATCH 5/6] adding Random to Project.toml --- Project.toml | 1 + 1 file changed, 1 insertion(+) 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" From 249fb6dff8840ade49988e425c9c40758591c75e Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Wed, 4 Mar 2026 16:10:01 +0530 Subject: [PATCH 6/6] updating griewank --- src/ADNLPProblems/griewank.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ADNLPProblems/griewank.jl b/src/ADNLPProblems/griewank.jl index 3869656c..34a2ccad 100644 --- a/src/ADNLPProblems/griewank.jl +++ b/src/ADNLPProblems/griewank.jl @@ -1,12 +1,12 @@ export griewank -function griewank(; n::Int = default_nvar, type::Type{T} = Float64, x0::AbstractVector{T} = T[], kwargs...) where {T} +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 = isempty(x0) ? zeros(T, n) : x0 + x0_local = isnothing(x0) ? zeros(T, n) : x0 return ADNLPModels.ADNLPModel(f, x0_local, name = "griewank"; kwargs...) end