Skip to content

Commit 0a64e74

Browse files
committed
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.
1 parent cacd031 commit 0a64e74

8 files changed

Lines changed: 231 additions & 0 deletions

File tree

src/Meta/ackley.jl

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
ackley_meta = Dict(
2+
:nvar => 100,
3+
:variable_nvar => true,
4+
:ncon => 0,
5+
:variable_ncon => false,
6+
:minimize => true,
7+
:name => "ackley",
8+
:has_equalities_only => false,
9+
:has_inequalities_only => false,
10+
:has_bounds => false,
11+
:has_fixed_variables => false,
12+
:objtype => :other,
13+
:contype => :unconstrained,
14+
:best_known_lower_bound => -Inf,
15+
:best_known_upper_bound => 20.0 + exp(1.0),
16+
:is_feasible => true,
17+
:defined_everywhere => missing,
18+
:origin => :unknown,
19+
)
20+
get_ackley_nvar(; n::Integer = default_nvar, kwargs...) = n
21+
get_ackley_ncon(; n::Integer = default_nvar, kwargs...) = 0
22+
get_ackley_nlin(; n::Integer = default_nvar, kwargs...) = 0
23+
get_ackley_nnln(; n::Integer = default_nvar, kwargs...) = 0
24+
get_ackley_nequ(; n::Integer = default_nvar, kwargs...) = 0
25+
get_ackley_nineq(; n::Integer = default_nvar, kwargs...) = 0

src/Meta/griewank.jl

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
griewank_meta = Dict(
2+
:nvar => 100,
3+
:variable_nvar => true,
4+
:ncon => 0,
5+
:variable_ncon => false,
6+
:minimize => true,
7+
:name => "griewank",
8+
:has_equalities_only => false,
9+
:has_inequalities_only => false,
10+
:has_bounds => false,
11+
:has_fixed_variables => false,
12+
:objtype => :other,
13+
:contype => :unconstrained,
14+
:best_known_lower_bound => -Inf,
15+
:best_known_upper_bound => 360001.0,
16+
:is_feasible => true,
17+
:defined_everywhere => missing,
18+
:origin => :unknown,
19+
)
20+
get_griewank_nvar(; n::Integer = default_nvar, kwargs...) = n
21+
get_griewank_ncon(; n::Integer = default_nvar, kwargs...) = 0
22+
get_griewank_nlin(; n::Integer = default_nvar, kwargs...) = 0
23+
get_griewank_nnln(; n::Integer = default_nvar, kwargs...) = 0
24+
get_griewank_nequ(; n::Integer = default_nvar, kwargs...) = 0
25+
get_griewank_nineq(; n::Integer = default_nvar, kwargs...) = 0

src/Meta/rastrigin.jl

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
rastrigin_meta = Dict(
2+
:nvar => 100,
3+
:variable_nvar => true,
4+
:ncon => 0,
5+
:variable_ncon => false,
6+
:minimize => true,
7+
:name => "rastrigin",
8+
:has_equalities_only => false,
9+
:has_inequalities_only => false,
10+
:has_bounds => false,
11+
:has_fixed_variables => false,
12+
:objtype => :other,
13+
:contype => :unconstrained,
14+
:best_known_lower_bound => -Inf,
15+
:best_known_upper_bound => 10000.0,
16+
:is_feasible => true,
17+
:defined_everywhere => missing,
18+
:origin => :unknown,
19+
)
20+
get_rastrigin_nvar(; n::Integer = default_nvar, kwargs...) = n
21+
get_rastrigin_ncon(; n::Integer = default_nvar, kwargs...) = 0
22+
get_rastrigin_nlin(; n::Integer = default_nvar, kwargs...) = 0
23+
get_rastrigin_nnln(; n::Integer = default_nvar, kwargs...) = 0
24+
get_rastrigin_nequ(; n::Integer = default_nvar, kwargs...) = 0
25+
get_rastrigin_nineq(; n::Integer = default_nvar, kwargs...) = 0

src/Meta/sphere.jl

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
sphere_meta = Dict(
2+
:nvar => 100,
3+
:variable_nvar => true,
4+
:ncon => 0,
5+
:variable_ncon => false,
6+
:minimize => true,
7+
:name => "sphere",
8+
:has_equalities_only => false,
9+
:has_inequalities_only => false,
10+
:has_bounds => false,
11+
:has_fixed_variables => false,
12+
:objtype => :other,
13+
:contype => :unconstrained,
14+
:best_known_lower_bound => -Inf,
15+
:best_known_upper_bound => 100.0,
16+
:is_feasible => true,
17+
:defined_everywhere => missing,
18+
:origin => :unknown,
19+
)
20+
get_sphere_nvar(; n::Integer = default_nvar, kwargs...) = n
21+
get_sphere_ncon(; n::Integer = default_nvar, kwargs...) = 0
22+
get_sphere_nlin(; n::Integer = default_nvar, kwargs...) = 0
23+
get_sphere_nnln(; n::Integer = default_nvar, kwargs...) = 0
24+
get_sphere_nequ(; n::Integer = default_nvar, kwargs...) = 0
25+
get_sphere_nineq(; n::Integer = default_nvar, kwargs...) = 0

src/PureJuMP/ackley.jl

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# Ackley test function
2+
#
3+
# A multivariate multimodal optimization problem from the
4+
# AMPGO test set.
5+
#
6+
# Problem Ackley in
7+
# http://infinity77.net/global_optimization/test_functions_nd_A.html
8+
# Andrea Gavana
9+
#
10+
# f(x) = -20*exp(-0.2*sqrt(sum(x_i^2)/n)) - exp(sum(cos(2*pi*x_i))/n) + 20 + e
11+
#
12+
# Global minimum: f(0,...,0) = 0
13+
# Bounds: x_i in [-32, 32] for all i
14+
15+
export ackley
16+
17+
"Ackley multimodal minimization problem"
18+
function ackley(args...; n::Int = default_nvar, kwargs...)
19+
n < 1 && @warn("ackley: number of variables must be ≥ 1")
20+
n = max(1, n)
21+
22+
nlp = Model()
23+
24+
x0 = [-32 + 64 * rand() for i = 1:n]
25+
@variable(nlp, x[i = 1:n], start = x0[i])
26+
27+
@objective(
28+
nlp,
29+
Min,
30+
-20 * exp(-0.2 * sqrt(sum(x[i]^2 for i = 1:n) / n)) -
31+
exp(sum(cos(2 * π * x[i]) for i = 1:n) / n) +
32+
20 +
33+
exp(1)
34+
)
35+
36+
return nlp
37+
end

src/PureJuMP/griewank.jl

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Griewank test function
2+
#
3+
# A multivariate multimodal optimization problem from the
4+
# AMPGO test set.
5+
#
6+
# Problem Griewank in
7+
# http://infinity77.net/global_optimization/test_functions_nd_G.html
8+
# Andrea Gavana
9+
#
10+
# f(x) = sum(x_i^2)/4000 - prod(cos(x_i/sqrt(i))) + 1
11+
#
12+
# Global minimum: f(0,...,0) = 0
13+
# Bounds: x_i in [-600, 600] for all i
14+
15+
export griewank
16+
17+
"Griewank multimodal minimization problem"
18+
function griewank(args...; n::Int = default_nvar, kwargs...)
19+
n < 1 && @warn("griewank: number of variables must be ≥ 1")
20+
n = max(1, n)
21+
22+
nlp = Model()
23+
24+
x0 = [-600 + 1200 * rand() for i = 1:n]
25+
@variable(nlp, x[i = 1:n], start = x0[i])
26+
27+
@objective(
28+
nlp,
29+
Min,
30+
sum(x[i]^2 for i = 1:n) / 4000 - prod(cos(x[i] / sqrt(i)) for i = 1:n) + 1
31+
)
32+
33+
return nlp
34+
end

src/PureJuMP/rastrigin.jl

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Rastrigin test function
2+
#
3+
# A multivariate highly multimodal optimization problem from the
4+
# AMPGO test set.
5+
#
6+
# Problem Rastrigin in
7+
# http://infinity77.net/global_optimization/test_functions_nd_R.html
8+
# Andrea Gavana
9+
#
10+
# f(x) = 10*n + sum(x_i^2 - 10*cos(2*pi*x_i))
11+
#
12+
# Global minimum: f(0,...,0) = 0
13+
# Bounds: x_i in [-5.12, 5.12] for all i
14+
15+
export rastrigin
16+
17+
"Rastrigin multimodal minimization problem"
18+
function rastrigin(args...; n::Int = default_nvar, kwargs...)
19+
n < 1 && @warn("rastrigin: number of variables must be ≥ 1")
20+
n = max(1, n)
21+
22+
nlp = Model()
23+
24+
x0 = [-5.12 + 10.24 * rand() for i = 1:n]
25+
@variable(nlp, x[i = 1:n], start = x0[i])
26+
27+
@objective(nlp, Min, 10 * n + sum(x[i]^2 - 10 * cos(2 * π * x[i]) for i = 1:n))
28+
29+
return nlp
30+
end

src/PureJuMP/sphere.jl

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Sphere test function
2+
#
3+
# A simple multivariate convex optimization problem from the
4+
# AMPGO test set.
5+
#
6+
# Problem Sphere in
7+
# http://infinity77.net/global_optimization/test_functions_nd_S.html
8+
# Andrea Gavana
9+
#
10+
# f(x) = sum(x_i^2)
11+
#
12+
# Global minimum: f(0,...,0) = 0
13+
# Bounds: x_i in [-1, 1] for all i
14+
15+
export sphere
16+
17+
"Sphere convex minimization problem"
18+
function sphere(args...; n::Int = default_nvar, kwargs...)
19+
n < 1 && @warn("sphere: number of variables must be ≥ 1")
20+
n = max(1, n)
21+
22+
nlp = Model()
23+
24+
x0 = [-1 + 2 * rand() for i = 1:n]
25+
@variable(nlp, x[i = 1:n], start = x0[i])
26+
27+
@objective(nlp, Min, sum(x[i]^2 for i = 1:n))
28+
29+
return nlp
30+
end

0 commit comments

Comments
 (0)