diff --git a/src/ADNLPProblems/auglag.jl b/src/ADNLPProblems/auglag.jl new file mode 100644 index 00000000..5ea6648c --- /dev/null +++ b/src/ADNLPProblems/auglag.jl @@ -0,0 +1,52 @@ +export auglag + +function auglag(; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} + λ₁ = T(-0.002008) + λ₂ = T(-0.001900) + λ₃ = T(-0.000261) + + function f(x; n = length(x)) + s = zero(T) + for i = 1:n + if mod(i, 5) == 0 + prod_term = one(T) + sum_sq = zero(T) + for j = 1:5 + idx = i + 1 - j + if 1 <= idx <= n + prod_term *= x[idx] + sum_sq += x[idx]^2 + end + end + s += exp(prod_term) + 10 * (sum_sq - 10 - λ₁)^2 + + if i >= 4 + s += 10 * (x[i - 3] * x[i - 2] - 5 * x[i - 1] * x[i] - λ₂)^2 + end + + if i >= 4 + s += 10 * (x[i - 4]^3 + x[i - 3]^3 + 1 - λ₃)^2 + end + end + end + return s + end + + x0 = zeros(T, n) + for i = 1:n + m = mod(i, 5) + if m == 1 + x0[i] = i <= 2 ? -2 : -1 + elseif m == 2 + x0[i] = i <= 2 ? 2 : -1 + elseif m == 3 + x0[i] = 2 + elseif m == 4 + x0[i] = -1 + else + x0[i] = -1 + end + end + + return ADNLPModels.ADNLPModel(f, x0, name = "auglag"; kwargs...) +end diff --git a/src/ADNLPProblems/browngen1.jl b/src/ADNLPProblems/browngen1.jl new file mode 100644 index 00000000..8516338d --- /dev/null +++ b/src/ADNLPProblems/browngen1.jl @@ -0,0 +1,14 @@ +export browngen1 + +function browngen1(; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} + n = max(2, n) + function f(x; n = length(x)) + s = zero(T) + @inbounds for i = 2:n + s += (x[i - 1] - 3)^2 + (x[i - 1] - x[i])^2 + exp(20 * (x[i - 1] - x[i])) + end + return s + end + x0 = [isodd(i) ? zero(T) : -one(T) for i = 1:n] + return ADNLPModels.ADNLPModel(f, x0, name = "browngen1"; kwargs...) +end diff --git a/src/ADNLPProblems/browngen2.jl b/src/ADNLPProblems/browngen2.jl new file mode 100644 index 00000000..da7789ad --- /dev/null +++ b/src/ADNLPProblems/browngen2.jl @@ -0,0 +1,14 @@ +export browngen2 + +function browngen2(; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} + n = max(2, n) + function f(x; n = length(x)) + s = zero(T) + @inbounds for i = 2:n + s += (x[i - 1]^2)^(x[i]^2 + 1) + (x[i]^2)^(x[i - 1]^2 + 1) + end + return s + end + x0 = [isodd(i) ? -one(T) : one(T) for i = 1:n] + return ADNLPModels.ADNLPModel(f, x0, name = "browngen2"; kwargs...) +end diff --git a/src/ADNLPProblems/broyden7d.jl b/src/ADNLPProblems/broyden7d.jl new file mode 100644 index 00000000..454dc9fb --- /dev/null +++ b/src/ADNLPProblems/broyden7d.jl @@ -0,0 +1,48 @@ +export broyden7d + +function broyden7d(; use_nls::Bool = false, kwargs...) + model = use_nls ? :nls : :nlp + return broyden7d(Val(model); kwargs...) +end + +function broyden7d(::Val{:nlp}; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} + p = 7 // 3 + function f(x; n = length(x), p = p) + x0 = zero(T) + xn1 = zero(T) + s = zero(T) + s += abs((3 - 2 * x[1]) * x[1] - x0 - x[2] + 1)^p + for i = 2:(n - 1) + s += abs((3 - 2 * x[i]) * x[i] - x[i - 1] - x[i + 1] + 1)^p + end + s += abs((3 - 2 * x[n]) * x[n] - x[n - 1] - xn1 + 1)^p + nh = div(n, 2) + for i = 1:nh + s += abs(x[i] + x[i + nh])^p + end + return s + end + x0 = fill(-one(T), n) + return ADNLPModels.ADNLPModel(f, x0, name = "broyden7d"; kwargs...) +end + +function broyden7d(::Val{:nls}; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} + x0 = fill(-one(T), n) + function F!(r, x; n = length(x)) + p = 7 // 6 + nh = div(n, 2) + @inbounds begin + r[1] = abs((3 - 2 * x[1]) * x[1] - zero(T) - x[2] + one(T))^p + for i = 2:(n - 1) + r[i] = abs((3 - 2 * x[i]) * x[i] - x[i - 1] - x[i + 1] + one(T))^p + end + r[n] = abs((3 - 2 * x[n]) * x[n] - x[n - 1] - zero(T) + one(T))^p + for i = 1:nh + r[n + i] = abs(x[i] + x[i + nh])^p + end + end + return r + end + nequ = n + div(n, 2) + return ADNLPModels.ADNLSModel!(F!, x0, nequ, name = "broyden7d-nls"; kwargs...) +end diff --git a/src/ADNLPProblems/chainwoo.jl b/src/ADNLPProblems/chainwoo.jl index e7d93586..9d1520fe 100644 --- a/src/ADNLPProblems/chainwoo.jl +++ b/src/ADNLPProblems/chainwoo.jl @@ -1,6 +1,11 @@ export chainwoo -function chainwoo(; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} +function chainwoo(; use_nls::Bool = false, kwargs...) + model = use_nls ? :nls : :nlp + return chainwoo(Val(model); kwargs...) +end + +function chainwoo(::Val{:nlp}; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} (n % 4 == 0) || @warn("chainwoo: number of variables adjusted to be a multiple of 4") n = 4 * max(1, div(n, 4)) function f(x; n = length(x)) @@ -16,3 +21,26 @@ function chainwoo(; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) w x0 = vcat([-3, -1, -3, -1], -2 * ones(T, n - 4)) return ADNLPModels.ADNLPModel(f, x0, name = "chainwoo"; kwargs...) end + +function chainwoo(::Val{:nls}; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} + (n % 4 == 0) || @warn("chainwoo: number of variables adjusted to be a multiple of 4") + n = 4 * max(1, div(n, 4)) + function F!(r, x; n = length(x)) + nb = div(n, 2) - 1 + r[1] = 1 + idx = 2 + @inbounds for i = 1:nb + r[idx] = 10 * (x[2 * i] - x[2 * i - 1]^2) + r[idx + 1] = 1 - x[2 * i - 1] + r[idx + 2] = T(sqrt(90)) * (x[2 * i + 2] - x[2 * i + 1]^2) + r[idx + 3] = 1 - x[2 * i + 1] + r[idx + 4] = T(sqrt(10)) * (x[2 * i] + x[2 * i + 2] - 2) + r[idx + 5] = (x[2 * i] - x[2 * i + 2]) / T(sqrt(10)) + idx += 6 + end + return r + end + nequ = 1 + 6 * (div(n, 2) - 1) + x0 = vcat([-3, -1, -3, -1], -2 * ones(T, n - 4)) + return ADNLPModels.ADNLSModel!(F!, x0, nequ, name = "chainwoo-nls"; kwargs...) +end diff --git a/src/ADNLPProblems/cragglvy2.jl b/src/ADNLPProblems/cragglvy2.jl index 0411752d..5fb26059 100644 --- a/src/ADNLPProblems/cragglvy2.jl +++ b/src/ADNLPProblems/cragglvy2.jl @@ -1,6 +1,11 @@ export cragglvy2 -function cragglvy2(; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} +function cragglvy2(; use_nls::Bool = false, kwargs...) + model = use_nls ? :nls : :nlp + return cragglvy2(Val(model); kwargs...) +end + +function cragglvy2(::Val{:nlp}; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} n < 2 && @warn("cragglvy2: number of variables must be ≥ 2") n = max(2, n) function f(x; n = length(x)) @@ -15,3 +20,21 @@ function cragglvy2(; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) x0 = vcat(1, 2 * ones(T, n - 1)) return ADNLPModels.ADNLPModel(f, x0, name = "cragglvy2"; kwargs...) end + +function cragglvy2(::Val{:nls}; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} + n < 2 && @warn("cragglvy2: number of variables must be ≥ 2") + n = max(2, n) + function F!(r, x; n = length(x)) + for i = 1:(div(n, 2) - 1) + r[5 * (i - 1) + 1] = (exp(x[2 * i - 1]) - x[2 * i])^2 + r[5 * (i - 1) + 2] = 10 * (x[2 * i] - x[2 * i + 1])^3 + r[5 * (i - 1) + 3] = (tan(x[2 * i + 1] - x[2 * i + 2]))^2 + r[5 * (i - 1) + 4] = x[2 * i - 1]^4 + r[5 * (i - 1) + 5] = x[2 * i + 2] - 1 + end + return r + end + nequ = 5 * (div(n, 2) - 1) + x0 = vcat(T(1), T(2) * ones(T, n - 1)) + return ADNLPModels.ADNLSModel!(F!, x0, nequ, name = "cragglvy2-nls"; kwargs...) +end diff --git a/src/ADNLPProblems/genbroydenb.jl b/src/ADNLPProblems/genbroydenb.jl new file mode 100644 index 00000000..be50d1de --- /dev/null +++ b/src/ADNLPProblems/genbroydenb.jl @@ -0,0 +1,47 @@ +export genbroydenb + +function genbroydenb(; use_nls::Bool = false, kwargs...) + model = use_nls ? :nls : :nlp + return genbroydenb(Val(model); kwargs...) +end + +function genbroydenb(::Val{:nlp}; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} + p = 7 // 3 + function f(x; n = length(x)) + s = zero(T) + for i = 1:n + diag = (2 + 5 * x[i]^2) * x[i] + 1 + neigh = zero(T) + @inbounds for j = max(1, i - 5):min(n, i + 1) + if j != i + neigh += x[j] * (1 + x[j]) + end + end + s += abs(diag + neigh)^p + end + return s + end + x0 = fill(-one(T), n) + return ADNLPModels.ADNLPModel(f, x0, name = "genbroydenb", minimize = true; kwargs...) +end + +function genbroydenb(::Val{:nls}; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} + p = 7 // 6 + function F!(r, x) + m = length(x) + @inbounds for i = 1:m + diag = (2 + 5 * x[i]^2) * x[i] + 1 + neigh = zero(T) + for j = max(1, i - 5):min(m, i + 1) + if j != i + neigh += x[j] * (1 + x[j]) + end + end + z = diag + neigh + r[i] = abs(z)^(p) + end + return r + end +x0 = fill(-one(T), n) + return ADNLPModels.ADNLSModel!(F!, x0, n, name = "genbroydenb-nls"; kwargs...) +end diff --git a/src/ADNLPProblems/genbroydentri.jl b/src/ADNLPProblems/genbroydentri.jl new file mode 100644 index 00000000..0cf95c19 --- /dev/null +++ b/src/ADNLPProblems/genbroydentri.jl @@ -0,0 +1,50 @@ +export genbroydentri + +function genbroydentri(; use_nls::Bool = false, kwargs...) + model = use_nls ? :nls : :nlp + return genbroydentri(Val(model); kwargs...) +end + +function genbroydentri( + ::Val{:nlp}; + n::Int = default_nvar, + type::Type{T} = Float64, + kwargs..., +) where {T} + p = 7 // 3 + function f(x; n = length(x)) + x0 = zero(T) + xn1 = zero(T) + s = abs((3 - 2 * x[1]) * x[1] - x0 - x[2] + 1)^p + for i = 2:(n - 1) + s += abs((3 - 2 * x[i]) * x[i] - x[i - 1] - x[i + 1] + 1)^p + end + s += abs((3 - 2 * x[n]) * x[n] - x[n - 1] - xn1 + 1)^p + return s + end + x0 = fill(-one(T), n) + return ADNLPModels.ADNLPModel(f, x0, name = "genbroydentri"; kwargs...) +end + +function genbroydentri( + ::Val{:nls}; + n::Int = default_nvar, + type::Type{T} = Float64, + kwargs..., +) where {T} + p = 7 // 6 + x0 = fill(-one(T), n) + function F!(r, x) + x0_val = zero(T) + xn1_val = zero(T) + @inbounds begin + r[1] = abs((3 - 2 * x[1]) * x[1] - x0_val - x[2] + 1)^p + for i = 2:(n - 1) + r[i] = abs((3 - 2 * x[i]) * x[i] - x[i - 1] - x[i + 1] + 1)^p + end + r[n] = abs((3 - 2 * x[n]) * x[n] - x[n - 1] - xn1_val + 1)^p + end + return r + end + return ADNLPModels.ADNLSModel!(F!, x0, n, name = "genbroydentri-nls"; kwargs...) +end diff --git a/src/ADNLPProblems/genrose.jl b/src/ADNLPProblems/genrose.jl index 9448d2f6..d48c85a6 100644 --- a/src/ADNLPProblems/genrose.jl +++ b/src/ADNLPProblems/genrose.jl @@ -1,6 +1,11 @@ export genrose, rosenbrock -function genrose(; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} +function genrose(; use_nls::Bool = false, kwargs...) + model = use_nls ? :nls : :nlp + return genrose(Val(model); kwargs...) +end + +function genrose(::Val{:nlp}; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} n < 2 && @warn("genrose: number of variables must be ≥ 2") n = max(2, n) function f(x; n = length(x)) @@ -12,5 +17,22 @@ function genrose(; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) wh return ADNLPModels.ADNLPModel(f, x0, name = "genrose"; kwargs...) end +function genrose(::Val{:nls}; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} + n = max(2, n) + nequ = 2 * (n - 1) + 1 + function F!(r, x; n = length(x)) + @inbounds begin + r[1] = 1 + for i = 1:(n - 1) + r[i + 1] = 10 * (x[i + 1] - x[i]^2) + r[i + n] = x[i] - 1 + end + end + return r + end + x0 = T.([i / (n + 1) for i = 1:n]) + return ADNLPModels.ADNLSModel!(F!, x0, nequ, name = "genrose-nls"; kwargs...) +end + rosenbrock(args...; kwargs...) = genrose(args..., n = 2, name = "rosenbrock"; delete!(Dict(kwargs), :n)...) diff --git a/src/ADNLPProblems/nazareth.jl b/src/ADNLPProblems/nazareth.jl new file mode 100644 index 00000000..04ae25bc --- /dev/null +++ b/src/ADNLPProblems/nazareth.jl @@ -0,0 +1,85 @@ +export nazareth + +function nazareth(; use_nls::Bool = false, kwargs...) + model = use_nls ? :nls : :nlp + return nazareth(Val(model); kwargs...) +end + +function nazareth(::Val{:nlp}; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} + nh = div(n, 2) + neighbors = Vector{Vector{Int}}(undef, n) + a_row = Vector{Vector{T}}(undef, n) + b_row = Vector{Vector{T}}(undef, n) + for i = 1:n + lo = max(1, i - 2) + hi = min(n, i + 2) + neigh = collect(lo:hi) + j1 = i - nh + j2 = i + nh + for j in (j1, j2) + if 1 <= j <= n && !(j >= lo && j <= hi) + push!(neigh, j) + end + end + neighbors[i] = neigh + a_row[i] = [5 * (1 + mod(i, 5) + mod(j, 5)) for j in neigh] + b_row[i] = [(i + j) / 10 for j in neigh] + end + + function f(x; n = length(x)) + s = zero(T) + for i = 1:n + sumtrig = zero(T) + neigh = neighbors[i] + ai = a_row[i] + bi = b_row[i] + @inbounds for k = 1:length(neigh) + j = neigh[k] + sumtrig += ai[k] * sin(x[j]) + bi[k] * cos(x[j]) + end + s += (n + i - sumtrig)^2 + end + return s / n + end + x0 = fill(one(T) / n, n) + return ADNLPModels.ADNLPModel(f, x0, name = "nazareth", minimize = true; kwargs...) +end + +function nazareth(::Val{:nls}; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} + nh = div(n, 2) + neighbors = Vector{Vector{Int}}(undef, n) + a_row = Vector{Vector{T}}(undef, n) + b_row = Vector{Vector{T}}(undef, n) + for i = 1:n + lo = max(1, i - 2) + hi = min(n, i + 2) + neigh = collect(lo:hi) + j1 = i - nh + j2 = i + nh + for j in (j1, j2) + if 1 <= j <= n && !(j >= lo && j <= hi) + push!(neigh, j) + end + end + neighbors[i] = neigh + a_row[i] = [5 * (1 + mod(i, 5) + mod(j, 5)) for j in neigh] + b_row[i] = [(i + j) / 10 for j in neigh] + end + + x0 = fill(one(T) / n, n) + function F!(r, x) + @inbounds for i = 1:n + sumtrig = zero(T) + neigh = neighbors[i] + ai = a_row[i] + bi = b_row[i] + for k = 1:length(neigh) + j = neigh[k] + sumtrig += ai[k] * sin(x[j]) + bi[k] * cos(x[j]) + end + r[i] = (n + i - sumtrig) / sqrt(T(n)) + end + return r + end + return ADNLPModels.ADNLSModel!(F!, x0, n, name = "nazareth"; kwargs...) +end diff --git a/src/ADNLPProblems/powellsg.jl b/src/ADNLPProblems/powellsg.jl index ee0c09c5..38ac7db6 100644 --- a/src/ADNLPProblems/powellsg.jl +++ b/src/ADNLPProblems/powellsg.jl @@ -1,6 +1,11 @@ export powellsg -function powellsg(; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} +function powellsg(; use_nls::Bool = false, kwargs...) + model = use_nls ? :nls : :nlp + return powellsg(Val(model); kwargs...) +end + +function powellsg(::Val{:nlp}; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} (n % 4 == 0) || @warn("powellsg: number of variables adjusted to be a multiple of 4") n = 4 * max(1, div(n, 4)) # number of variables adjusted to be a multiple of 4 function f(x; n = length(x)) @@ -17,3 +22,22 @@ function powellsg(; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) w x0[4 * (collect(1:div(n, 4)))] .= 1 return ADNLPModels.ADNLPModel(f, x0, name = "powellsg"; kwargs...) end + +function powellsg(::Val{:nls}; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T} + (n % 4 == 0) || @warn("powellsg: number of variables adjusted to be a multiple of 4") + n = 4 * max(1, div(n, 4)) + function F!(r, x; n = length(x)) + @inbounds for j = 1:4:n + r[j] = x[j] + 10 * x[j + 1] + r[j + 1] = T(sqrt(5)) * (x[j + 2] - x[j + 3]) + r[j + 2] = (x[j + 1] - 2 * x[j + 2])^2 + r[j + 3] = T(sqrt(10)) * (x[j] - x[j + 3])^2 + end + return r + end + x0 = zeros(T, n) + x0[4 * (collect(1:div(n, 4))) .- 3] .= 3 + x0[4 * (collect(1:div(n, 4))) .- 2] .= -1 + x0[4 * (collect(1:div(n, 4)))] .= 1 + return ADNLPModels.ADNLSModel!(F!, x0, n, name = "powellsg-nls"; kwargs...) +end diff --git a/src/Meta/auglag.jl b/src/Meta/auglag.jl new file mode 100644 index 00000000..75f7e5bc --- /dev/null +++ b/src/Meta/auglag.jl @@ -0,0 +1,27 @@ +auglag_meta = Dict( + :nvar => 100, + :variable_nvar => true, + :ncon => 0, + :variable_ncon => false, + :minimize => true, + :name => "auglag", + :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 => Inf, + :is_feasible => missing, + :defined_everywhere => missing, + :origin => :literature, +) + +get_auglag_nvar(; n::Integer = default_nvar, kwargs...) = n +get_auglag_ncon(; n::Integer = default_nvar, kwargs...) = 0 +get_auglag_nlin(; n::Integer = default_nvar, kwargs...) = 0 +get_auglag_nnln(; n::Integer = default_nvar, kwargs...) = 0 +get_auglag_nequ(; n::Integer = default_nvar, kwargs...) = 0 +get_auglag_nineq(; n::Integer = default_nvar, kwargs...) = 0 +get_auglag_nls_nequ(; n::Integer = default_nvar, kwargs...) = 0 diff --git a/src/Meta/browngen1.jl b/src/Meta/browngen1.jl new file mode 100644 index 00000000..1691c13f --- /dev/null +++ b/src/Meta/browngen1.jl @@ -0,0 +1,27 @@ +browngen1_meta = Dict( + :nvar => 100, + :variable_nvar => true, + :ncon => 0, + :variable_ncon => false, + :minimize => true, + :name => "browngen1", + :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 => Inf, + :is_feasible => missing, + :defined_everywhere => missing, + :origin => :literature, +) + +get_browngen1_nvar(; n::Integer = default_nvar, kwargs...) = max(n, 2) +get_browngen1_ncon(; n::Integer = default_nvar, kwargs...) = 0 +get_browngen1_nlin(; n::Integer = default_nvar, kwargs...) = 0 +get_browngen1_nnln(; n::Integer = default_nvar, kwargs...) = 0 +get_browngen1_nequ(; n::Integer = default_nvar, kwargs...) = 0 +get_browngen1_nineq(; n::Integer = default_nvar, kwargs...) = 0 +get_browngen1_nls_nequ(; n::Integer = default_nvar, kwargs...) = 0 diff --git a/src/Meta/browngen2.jl b/src/Meta/browngen2.jl new file mode 100644 index 00000000..35ba4d17 --- /dev/null +++ b/src/Meta/browngen2.jl @@ -0,0 +1,27 @@ +browngen2_meta = Dict( + :nvar => 100, + :variable_nvar => true, + :ncon => 0, + :variable_ncon => false, + :minimize => true, + :name => "browngen2", + :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 => Inf, + :is_feasible => missing, + :defined_everywhere => missing, + :origin => :literature, +) + +get_browngen2_nvar(; n::Integer = default_nvar, kwargs...) = max(2, n) +get_browngen2_ncon(; n::Integer = default_nvar, kwargs...) = 0 +get_browngen2_nlin(; n::Integer = default_nvar, kwargs...) = 0 +get_browngen2_nnln(; n::Integer = default_nvar, kwargs...) = 0 +get_browngen2_nequ(; n::Integer = default_nvar, kwargs...) = 0 +get_browngen2_nineq(; n::Integer = default_nvar, kwargs...) = 0 +get_browngen2_nls_nequ(; n::Integer = default_nvar, kwargs...) = 0 diff --git a/src/Meta/broyden7d.jl b/src/Meta/broyden7d.jl new file mode 100644 index 00000000..e257af74 --- /dev/null +++ b/src/Meta/broyden7d.jl @@ -0,0 +1,27 @@ +broyden7d_meta = Dict( + :nvar => 100, + :variable_nvar => true, + :ncon => 0, + :variable_ncon => false, + :minimize => true, + :name => "broyden7d", + :has_equalities_only => false, + :has_inequalities_only => false, + :has_bounds => false, + :has_fixed_variables => false, + :objtype => :least_squares, + :contype => :unconstrained, + :best_known_lower_bound => -Inf, + :best_known_upper_bound => Inf, + :is_feasible => missing, + :defined_everywhere => missing, + :origin => :literature, +) + +get_broyden7d_nvar(; n::Integer = default_nvar, kwargs...) = n +get_broyden7d_ncon(; n::Integer = default_nvar, kwargs...) = 0 +get_broyden7d_nlin(; n::Integer = default_nvar, kwargs...) = 0 +get_broyden7d_nnln(; n::Integer = default_nvar, kwargs...) = 0 +get_broyden7d_nequ(; n::Integer = default_nvar, kwargs...) = 0 +get_broyden7d_nineq(; n::Integer = default_nvar, kwargs...) = 0 +get_broyden7d_nls_nequ(; n::Integer = default_nvar, kwargs...) = n + div(n, 2) diff --git a/src/Meta/chainwoo.jl b/src/Meta/chainwoo.jl index bd6a2ccd..63036f1f 100644 --- a/src/Meta/chainwoo.jl +++ b/src/Meta/chainwoo.jl @@ -9,7 +9,7 @@ chainwoo_meta = Dict( :has_inequalities_only => false, :has_bounds => false, :has_fixed_variables => false, - :objtype => :other, + :objtype => :least_squares, :contype => :unconstrained, :best_known_lower_bound => -Inf, :best_known_upper_bound => 371954.1, @@ -23,3 +23,4 @@ get_chainwoo_nlin(; n::Integer = default_nvar, kwargs...) = 0 get_chainwoo_nnln(; n::Integer = default_nvar, kwargs...) = 0 get_chainwoo_nequ(; n::Integer = default_nvar, kwargs...) = 0 get_chainwoo_nineq(; n::Integer = default_nvar, kwargs...) = 0 +get_chainwoo_nls_nequ(; n::Integer = default_nvar, kwargs...) = 1 + 6 * (div(n, 2) - 1) diff --git a/src/Meta/cragglvy2.jl b/src/Meta/cragglvy2.jl index ab90537e..194bfca9 100644 --- a/src/Meta/cragglvy2.jl +++ b/src/Meta/cragglvy2.jl @@ -9,7 +9,7 @@ cragglvy2_meta = Dict( :has_inequalities_only => false, :has_bounds => false, :has_fixed_variables => false, - :objtype => :other, + :objtype => :least_squares, :contype => :unconstrained, :best_known_lower_bound => -Inf, :best_known_upper_bound => 52823.07152952862, @@ -17,9 +17,11 @@ cragglvy2_meta = Dict( :defined_everywhere => missing, :origin => :unknown, ) + get_cragglvy2_nvar(; n::Integer = default_nvar, kwargs...) = 1 * n + 0 get_cragglvy2_ncon(; n::Integer = default_nvar, kwargs...) = 0 get_cragglvy2_nlin(; n::Integer = default_nvar, kwargs...) = 0 get_cragglvy2_nnln(; n::Integer = default_nvar, kwargs...) = 0 get_cragglvy2_nequ(; n::Integer = default_nvar, kwargs...) = 0 get_cragglvy2_nineq(; n::Integer = default_nvar, kwargs...) = 0 +get_cragglvy2_nls_nequ(; n::Integer = default_nvar, kwargs...) = 5 * (div(n, 2) - 1) diff --git a/src/Meta/genbroydenb.jl b/src/Meta/genbroydenb.jl new file mode 100644 index 00000000..2ecb87ad --- /dev/null +++ b/src/Meta/genbroydenb.jl @@ -0,0 +1,27 @@ +genbroydenb_meta = Dict( + :nvar => 100, + :variable_nvar => true, + :ncon => 0, + :variable_ncon => false, + :minimize => true, + :name => "genbroydenb", + :has_equalities_only => false, + :has_inequalities_only => false, + :has_bounds => false, + :has_fixed_variables => false, + :objtype => :least_squares, + :contype => :unconstrained, + :best_known_lower_bound => -Inf, + :best_known_upper_bound => Inf, + :is_feasible => missing, + :defined_everywhere => missing, + :origin => :literature, +) + +get_genbroydenb_nvar(; n::Integer = default_nvar, kwargs...) = n +get_genbroydenb_ncon(; n::Integer = default_nvar, kwargs...) = 0 +get_genbroydenb_nlin(; n::Integer = default_nvar, kwargs...) = 0 +get_genbroydenb_nnln(; n::Integer = default_nvar, kwargs...) = 0 +get_genbroydenb_nequ(; n::Integer = default_nvar, kwargs...) = 0 +get_genbroydenb_nineq(; n::Integer = default_nvar, kwargs...) = 0 +get_genbroydenb_nls_nequ(; n::Integer = default_nvar, kwargs...) = n diff --git a/src/Meta/genbroydentri.jl b/src/Meta/genbroydentri.jl new file mode 100644 index 00000000..4ee3003d --- /dev/null +++ b/src/Meta/genbroydentri.jl @@ -0,0 +1,27 @@ +genbroydentri_meta = Dict( + :nvar => 100, + :variable_nvar => true, + :ncon => 0, + :variable_ncon => false, + :minimize => true, + :name => "genbroydentri", + :has_equalities_only => false, + :has_inequalities_only => false, + :has_bounds => false, + :has_fixed_variables => false, + :objtype => :least_squares, + :contype => :unconstrained, + :best_known_lower_bound => -Inf, + :best_known_upper_bound => Inf, + :is_feasible => missing, + :defined_everywhere => missing, + :origin => :literature, +) + +get_genbroydentri_nvar(; n::Integer = default_nvar, kwargs...) = n +get_genbroydentri_ncon(; n::Integer = default_nvar, kwargs...) = 0 +get_genbroydentri_nlin(; n::Integer = default_nvar, kwargs...) = 0 +get_genbroydentri_nnln(; n::Integer = default_nvar, kwargs...) = 0 +get_genbroydentri_nequ(; n::Integer = default_nvar, kwargs...) = 0 +get_genbroydentri_nineq(; n::Integer = default_nvar, kwargs...) = 0 +get_genbroydentri_nls_nequ(; n::Integer = default_nvar, kwargs...) = n diff --git a/src/Meta/genrose.jl b/src/Meta/genrose.jl index de76deb4..53fe1bc2 100644 --- a/src/Meta/genrose.jl +++ b/src/Meta/genrose.jl @@ -9,7 +9,7 @@ genrose_meta = Dict( :has_inequalities_only => false, :has_bounds => false, :has_fixed_variables => false, - :objtype => :other, + :objtype => :least_squares, :contype => :unconstrained, :best_known_lower_bound => -Inf, :best_known_upper_bound => 405.1064193957891, @@ -23,3 +23,4 @@ get_genrose_nlin(; n::Integer = default_nvar, kwargs...) = 0 get_genrose_nnln(; n::Integer = default_nvar, kwargs...) = 0 get_genrose_nequ(; n::Integer = default_nvar, kwargs...) = 0 get_genrose_nineq(; n::Integer = default_nvar, kwargs...) = 0 +get_genrose_nls_nequ(; n::Integer = default_nvar, kwargs...) = 2 * (n - 1) + 1 diff --git a/src/Meta/nazareth.jl b/src/Meta/nazareth.jl new file mode 100644 index 00000000..1efd0599 --- /dev/null +++ b/src/Meta/nazareth.jl @@ -0,0 +1,27 @@ +nazareth_meta = Dict( + :nvar => 100, + :variable_nvar => true, + :ncon => 0, + :variable_ncon => false, + :minimize => true, + :name => "nazareth", + :has_equalities_only => false, + :has_inequalities_only => false, + :has_bounds => false, + :has_fixed_variables => false, + :objtype => :least_squares, + :contype => :unconstrained, + :best_known_lower_bound => -Inf, + :best_known_upper_bound => Inf, + :is_feasible => missing, + :defined_everywhere => missing, + :origin => :literature, +) + +get_nazareth_nvar(; n::Integer = default_nvar, kwargs...) = n +get_nazareth_ncon(; n::Integer = default_nvar, kwargs...) = 0 +get_nazareth_nlin(; n::Integer = default_nvar, kwargs...) = 0 +get_nazareth_nnln(; n::Integer = default_nvar, kwargs...) = 0 +get_nazareth_nequ(; n::Integer = default_nvar, kwargs...) = 0 +get_nazareth_nineq(; n::Integer = default_nvar, kwargs...) = 0 +get_nazareth_nls_nequ(; n::Integer = default_nvar, kwargs...) = n diff --git a/src/Meta/powellsg.jl b/src/Meta/powellsg.jl index 331e3a47..51b2de14 100644 --- a/src/Meta/powellsg.jl +++ b/src/Meta/powellsg.jl @@ -9,7 +9,7 @@ powellsg_meta = Dict( :has_inequalities_only => false, :has_bounds => false, :has_fixed_variables => false, - :objtype => :other, + :objtype => :least_squares, :contype => :unconstrained, :best_known_lower_bound => -Inf, :best_known_upper_bound => 5375.0, @@ -23,3 +23,4 @@ get_powellsg_nlin(; n::Integer = default_nvar, kwargs...) = 0 get_powellsg_nnln(; n::Integer = default_nvar, kwargs...) = 0 get_powellsg_nequ(; n::Integer = default_nvar, kwargs...) = 0 get_powellsg_nineq(; n::Integer = default_nvar, kwargs...) = 0 +get_powellsg_nls_nequ(; n::Integer = default_nvar, kwargs...) = 4 * max(1, div(n, 4)) diff --git a/src/Meta/rosenbrock.jl b/src/Meta/rosenbrock.jl index 32a08387..e39be54a 100644 --- a/src/Meta/rosenbrock.jl +++ b/src/Meta/rosenbrock.jl @@ -9,7 +9,7 @@ rosenbrock_meta = Dict( :has_inequalities_only => false, :has_bounds => false, :has_fixed_variables => false, - :objtype => :other, + :objtype => :least_squares, :contype => :unconstrained, :best_known_lower_bound => -Inf, :best_known_upper_bound => 32.308641975308646, @@ -23,3 +23,4 @@ get_rosenbrock_nlin(; n::Integer = default_nvar, kwargs...) = 0 get_rosenbrock_nnln(; n::Integer = default_nvar, kwargs...) = 0 get_rosenbrock_nequ(; n::Integer = default_nvar, kwargs...) = 0 get_rosenbrock_nineq(; n::Integer = default_nvar, kwargs...) = 0 +get_rosenbrock_nls_nequ(; n::Integer = default_nvar, kwargs...) = 3 diff --git a/src/PureJuMP/auglag.jl b/src/PureJuMP/auglag.jl new file mode 100644 index 00000000..8508767f --- /dev/null +++ b/src/PureJuMP/auglag.jl @@ -0,0 +1,52 @@ +# Augmented Lagrangian function +# +# Problem 11 in +# L. Luksan, C. Matonoha and J. Vlcek +# Sparse Test Problems for Unconstrained Optimization, +# Technical Report 1064, +# Institute of Computer Science, +# Academy of Science of the Czech Republic +# +# https://www.researchgate.net/publication/325314400_Sparse_Test_Problems_for_Unconstrained_Optimization +# +export auglag + +function auglag(; n::Int = default_nvar) + λ₁ = -0.002008 + λ₂ = -0.001900 + λ₃ = -0.000261 + + nlp = Model() + @variable(nlp, x[1:n]) + + for i = 1:n + m = mod(i, 5) + if m == 1 + set_start_value(x[i], i <= 2 ? -2.0 : -1.0) + elseif m == 2 + set_start_value(x[i], i <= 2 ? 2.0 : -1.0) + elseif m == 3 + set_start_value(x[i], 2.0) + elseif m == 4 + set_start_value(x[i], -1.0) + else + set_start_value(x[i], -1.0) + end + end + + # Build objective only for i where mod(i, 5) == 0 and i >= 5 + indices = [i for i = 5:n if mod(i, 5) == 0] + + @objective( + nlp, + Min, + sum( + exp(prod(x[i + 1 - j] for j = 1:5)) + + 10 * (sum(x[i + 1 - j]^2 for j = 1:5) - 10 - λ₁)^2 + + 10 * (x[i - 3]*x[i - 2] - 5*x[i - 1]*x[i] - λ₂)^2 + + 10 * (x[i - 4]^3 + x[i - 3]^3 + 1 - λ₃)^2 for i in indices + ) + ) + + return nlp +end diff --git a/src/PureJuMP/browngen1.jl b/src/PureJuMP/browngen1.jl new file mode 100644 index 00000000..a2af8afa --- /dev/null +++ b/src/PureJuMP/browngen1.jl @@ -0,0 +1,27 @@ +# Generalization of the Brown function 1 +# +# Problem 12 in +# L. Luksan, C. Matonoha and J. Vlcek +# Sparse Test Problems for Unconstrained Optimization, +# Technical Report 1064, +# Institute of Computer Science, +# Academy of Science of the Czech Republic +# +# https://www.researchgate.net/publication/325314400_Sparse_Test_Problems_for_Unconstrained_Optimization +export browngen1 + +function browngen1(; n::Int = default_nvar) + nlp = Model() + n = max(2, n) + @variable(nlp, x[1:n]) + for i = 1:n + set_start_value(x[i], isodd(i) ? 0.0 : -1.0) + end + + @objective( + nlp, + Min, + sum((x[i - 1] - 3)^2 + (x[i - 1] - x[i])^2 + exp(20 * (x[i - 1] - x[i])) for i = 2:n) + ) + return nlp +end diff --git a/src/PureJuMP/browngen2.jl b/src/PureJuMP/browngen2.jl new file mode 100644 index 00000000..d779cc6a --- /dev/null +++ b/src/PureJuMP/browngen2.jl @@ -0,0 +1,23 @@ +# Generalization of the Brown function 2 +# +# Problem 13 in +# L. Luksan, C. Matonoha and J. Vlcek +# Sparse Test Problems for Unconstrained Optimization, +# Technical Report 1064, +# Institute of Computer Science, +# Academy of Science of the Czech Republic +# +# https://www.researchgate.net/publication/325314400_Sparse_Test_Problems_for_Unconstrained_Optimization +export browngen2 + +function browngen2(; n::Int = default_nvar) + nlp = Model() + n = max(2, n) + @variable(nlp, x[1:n]) + for i = 1:n + set_start_value(x[i], isodd(i) ? -1.0 : 1.0) + end + + @objective(nlp, Min, sum((x[i - 1]^2)^(x[i]^2 + 1) + (x[i]^2)^(x[i - 1]^2 + 1) for i = 2:n)) + return nlp +end diff --git a/src/PureJuMP/broyden7d.jl b/src/PureJuMP/broyden7d.jl new file mode 100644 index 00000000..60c8d49a --- /dev/null +++ b/src/PureJuMP/broyden7d.jl @@ -0,0 +1,27 @@ +# Seven diagonal generalization of the Broyden tridiagonal function +# +# Problem 7 in +# L. Luksan, C. Matonoha and J. Vlcek +# Sparse Test Problems for Unconstrained Optimization, +# Technical Report 1064, +# Institute of Computer Science, +# Academy of Science of the Czech Republic +# +# https://www.researchgate.net/publication/325314400_Sparse_Test_Problems_for_Unconstrained_Optimization +export broyden7d + +function broyden7d(; n::Int = default_nvar) + p = 7 / 3 + nh = div(n, 2) + nlp = Model() + @variable(nlp, x[1:n], start = -1.0) + @objective( + nlp, + Min, + abs((3 - 2 * x[1]) * x[1] - 0 - x[2] + 1)^p + + sum(abs((3 - 2 * x[i]) * x[i] - x[i - 1] - x[i + 1] + 1)^p for i = 2:(n - 1)) + + abs((3 - 2 * x[n]) * x[n] - x[n - 1] - 0 + 1)^p + + sum(abs(x[i] + x[i + nh])^p for i = 1:nh) + ) + return nlp +end diff --git a/src/PureJuMP/genbroydenb.jl b/src/PureJuMP/genbroydenb.jl new file mode 100644 index 00000000..483478b7 --- /dev/null +++ b/src/PureJuMP/genbroydenb.jl @@ -0,0 +1,29 @@ +# Generalized Broyden banded function +# +# Problem 6 in +# L. Luksan, C. Matonoha and J. Vlcek +# Sparse Test Problems for Unconstrained Optimization, +# Technical Report 1064, +# Institute of Computer Science, +# Academy of Science of the Czech Republic +# +# https://www.researchgate.net/publication/325314400_Sparse_Test_Problems_for_Unconstrained_Optimization +export genbroydenb + +function genbroydenb(; n::Int = default_nvar) + p = 7 / 3 + nlp = Model() + @variable(nlp, x[1:n], start = -1.0) + @objective( + nlp, + Min, + sum( + abs( + (2 + 5 * x[i]^2) * x[i] + + 1 + + sum(x[j] * (1 + x[j]) for j = max(1, i - 5):min(n, i + 1) if j != i), + )^p for i = 1:n + ) + ) + return nlp +end diff --git a/src/PureJuMP/genbroydentri.jl b/src/PureJuMP/genbroydentri.jl new file mode 100644 index 00000000..9abdf6e7 --- /dev/null +++ b/src/PureJuMP/genbroydentri.jl @@ -0,0 +1,25 @@ +# Generalized Broyden Tridiagonal Function +# +# Problem 5 in +# L. Luksan, C. Matonoha and J. Vlcek +# Sparse Test Problems for Unconstrained Optimization, +# Technical Report 1064, +# Institute of Computer Science, +# Academy of Science of the Czech Republic +# +# https://www.researchgate.net/publication/325314400_Sparse_Test_Problems_for_Unconstrained_Optimization +export genbroydentri + +function genbroydentri(; n::Int = default_nvar) + p = 7 / 3 + nlp = Model() + @variable(nlp, x[1:n], start = -1.0) + @objective( + nlp, + Min, + abs((3 - 2 * x[1]) * x[1] - 0 - x[2] + 1)^p + + sum(abs((3 - 2 * x[i]) * x[i] - x[i - 1] - x[i + 1] + 1)^p for i = 2:(n - 1)) + + abs((3 - 2 * x[n]) * x[n] - x[n - 1] - 0 + 1)^p + ) + return nlp +end diff --git a/src/PureJuMP/nazareth.jl b/src/PureJuMP/nazareth.jl new file mode 100644 index 00000000..f719ac16 --- /dev/null +++ b/src/PureJuMP/nazareth.jl @@ -0,0 +1,45 @@ +# Sparse modification of the Nazareth trigonometric function +# +# Problem 8 in +# L. Luksan, C. Matonoha and J. Vlcek +# Sparse Test Problems for Unconstrained Optimization, +# Technical Report 1064, +# Institute of Computer Science, +# Academy of Science of the Czech Republic +# +# https://www.researchgate.net/publication/325314400_Sparse_Test_Problems_for_Unconstrained_Optimization +export nazareth + +function nazareth(; n::Int = default_nvar) + nh = div(n, 2) + + nlp = Model() + @variable(nlp, x[1:n], start = 1 / n) + + @objective(nlp, Min, sum(( + begin + lo = max(1, i - 2) + hi = min(n, i + 2) + + sumtrig = 0 + for j = lo:hi + aij = 5 * (1 + mod(i, 5) + mod(j, 5)) + bij = (i + j) / 10 + sumtrig += aij * sin(x[j]) + bij * cos(x[j]) + end + + j1 = i - nh + j2 = i + nh + for j in (j1, j2) + if 1 <= j <= n && (j < lo || j > hi) + aij = 5 * (1 + mod(i, 5) + mod(j, 5)) + bij = (i + j) / 10 + sumtrig += aij * sin(x[j]) + bij * cos(x[j]) + end + end + + (n + i - sumtrig)^2 + end + ) for i = 1:n) / n) + return nlp +end