Skip to content

Commit

Permalink
Add gulf (#257)
Browse files Browse the repository at this point in the history
  • Loading branch information
tmigot committed Apr 10, 2023
1 parent 03c3f99 commit 7822c02
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 0 deletions.
28 changes: 28 additions & 0 deletions src/ADNLPProblems/gulf.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
export gulf

function gulf(;use_nls::Bool = false, kwargs...)
model = use_nls ? :nls : :nlp
return gulf(Val(model); kwargs...)
end

function gulf(::Val{:nlp}; n::Int = default_nvar, type::Val{T} = Val(Float64), m::Int = 100, kwargs...) where {T}
m = min(m, 100)
function f(x; m = m)
return 1 // 2 * sum((exp(-abs((25 + (-50 * log(i * one(T) / 100))^(2 // 3)) * m * i * x[2])^x[3] / x[1]) - i // 100)^2 for i=1:m)
end
x0 = T[5, 2.5, 0.15]
return ADNLPModels.ADNLPModel(f, x0, name = "gulf"; kwargs...)
end

function gulf(::Val{:nls}; n::Int = default_nvar, type::Val{T} = Val(Float64), m::Int = 100, kwargs...) where {T}
m = min(m, 100)

function F!(r, x; m = m)
for i=1:n
r[i] = exp(-abs((25 + (-50 * log(i * one(T) / 100))^(2 // 3)) * m * i * x[2])^x[3] / x[1]) - i // 100
end
return r
end
x0 = T[5, 2.5, 0.15]
return ADNLPModels.ADNLSModel!(F!, x0, m, name = "gulf-nls"; kwargs...)
end
26 changes: 26 additions & 0 deletions src/Meta/gulf.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
gulf_meta = Dict(
:nvar => 3,
:variable_nvar => true,
:ncon => 0,
:variable_ncon => false,
:minimize => true,
:name => "gulf",
: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 => 0.0,
:is_feasible => true,
:defined_everywhere => missing,
:origin => :unknown,
)
get_gulf_nvar(; n::Integer = default_nvar, kwargs...) = 3
get_gulf_ncon(; n::Integer = default_nvar, kwargs...) = 0
get_gulf_nlin(; n::Integer = default_nvar, kwargs...) = 0
get_gulf_nnln(; n::Integer = default_nvar, kwargs...) = 0
get_gulf_nequ(; n::Integer = default_nvar, kwargs...) = 0
get_gulf_nineq(; n::Integer = default_nvar, kwargs...) = 0
get_gulf_nls_nequ(; n::Integer = default_nvar, m = 100, kwargs...) = m
34 changes: 34 additions & 0 deletions src/PureJuMP/gulf.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# The Gulf research and development function for m = 99.
#
# Source: problem 11 in
# J.J. More', B.S. Garbow and K.E. Hillstrom,
# "Testing Unconstrained Optimization Software",
# ACM Transactions on Mathematical Software, vol. 7(1), pp. 17-41, 1981.
# Also problem 27 (p. 57) in
# A.R. Buckley,
# "Test functions for unconstrained minimization",
# TR 1989CS-3, Mathematics, statistics and computing centre,
# Dalhousie University, Halifax (CDN), 1989.
#
# SUR2-MN-3-0

export gulf

"Linear function with `n` parameters and `m` observations - full rank"
function gulf(args...; n::Int = default_nvar, m::Int = 100, kwargs...)
n = 3
m = min(m, 100)

nlp = Model()

@variable(nlp, x[j = 1:n])
set_start_value.(x, [5, 2.5, 0.15])

@NLobjective(
nlp,
Min,
0.5 * sum((exp(-abs((25 + (-50 * log(i / 100))^(2 / 3)) * m * i * x[2])^x[3] / x[1]) - i / 100)^2 for i=1:m)
)

return nlp
end

0 comments on commit 7822c02

Please sign in to comment.