Skip to content

Commit f428189

Browse files
committed
Add hs85 and hs89 problems
1 parent 1cee776 commit f428189

7 files changed

Lines changed: 502 additions & 0 deletions

File tree

Project.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
1010
Requires = "ae029012-a4dd-5104-9daa-d747884805df"
1111
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
1212
SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"
13+
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
1314

1415
[compat]
1516
DataFrames = "1"
1617
JLD2 = "0.5, 0.6"
1718
JuMP = "^1.15"
1819
Requires = "1"
1920
SpecialFunctions = "2"
21+
StaticArrays = "1.9.18"
2022
julia = "1.6"
2123

2224
[extras]

src/ADNLPProblems/hs85.jl

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
export hs85
2+
3+
function hs85(; type::Type{T}=Float64, kwargs...) where {T}
4+
a = T[0, 17.505, 11.275, 214.228, 7.458, 0.961, 1.612, 0.146, 107.99,
5+
922.693, 926.832, 18.766, 1072.163, 8961.448, 0.063, 71084.33, 2802713]
6+
b = T[0, 1053.6667, 35.03, 665.585, 584.463, 265.916, 7.046, 0.222,
7+
273.366, 1286.105, 1444.046, 537.141, 3247.039, 26844.086, 0.386,
8+
140000, 12146108]
9+
c10 = T(12.3) / T(752.3)
10+
11+
# Variable bounds and starting point (exact from the standard model)
12+
lvar = T[704.4148, 68.6, 0.0, 193.0, 25.0]
13+
uvar = T[906.3855, 288.88, 134.75, 287.0966, 84.1988]
14+
x0 = T[900.0, 80.0, 115.0, 267.0, 27.0]
15+
16+
# Best known value ≈ -1.90513375
17+
function f(x::AbstractVector{T})
18+
# All intermediates (identical to those used in constraints)
19+
y1 = x[2] + x[3] + T(41.6)
20+
c1 = T(0.024) * x[4] - T(4.62)
21+
y2 = T(12.5) / c1 + T(12)
22+
c2 = T(0.0003535) * x[1]^2 + T(0.5311) * x[1] + T(0.08705) * y2 * x[1]
23+
c3 = T(0.052) * x[1] + T(78) + T(0.002377) * y2 * x[1]
24+
y3 = c2 / c3
25+
y4 = T(19) * y3
26+
c4 = T(0.04782) * (x[1] - y3) + T(0.1956) * (x[1] - y3)^2 / x[2] +
27+
T(0.6376) * y4 + T(1.594) * y3
28+
c5 = T(100) * x[2]
29+
c6 = x[1] - y3 - y4
30+
c7 = T(0.95) - c4 / c5
31+
y5 = c6 * c7
32+
y6 = x[1] - y5 - y4 - y3
33+
c8 = (y5 + y4) * T(0.995)
34+
y7 = c8 / y1
35+
y8 = c8 / T(3798)
36+
c9 = y7 - T(0.0663) * y7 / y8 - T(0.3153)
37+
y9 = T(96.82) / c9 + T(0.321) * y1
38+
y10 = T(1.29) * y5 + T(1.258) * y4 + T(2.29) * y3 + T(1.71) * y6
39+
y11 = T(1.71) * x[1] - T(0.452) * y4 + T(0.58) * y3
40+
c11 = T(1.75) * y2 * T(0.995) * x[1]
41+
c12 = T(0.995) * y10 + T(1998)
42+
y12 = c10 * x[1] + c11 / c12
43+
y13 = c12 - T(1.75) * y2
44+
y14 = T(3623) + T(64.4) * x[2] + T(58.4) * x[3] + T(146312) / (y9 + x[5])
45+
c13 = T(0.995) * y10 + T(60.8) * x[2] + T(48) * x[4] -
46+
T(0.1121) * y14 - T(5095)
47+
y15 = y13 / c13
48+
y16 = T(148000) - T(331000) * y15 + T(40) * y13 - T(61) * y15 * y13
49+
c14 = T(2324) * y10 - T(28740000) * y2
50+
y17 = T(14130000) - T(1328) * y10 - T(531) * y11 + c14 / c12
51+
c15 = y13 / y15 - y13 / T(0.52)
52+
c16 = T(1.104) - T(0.72) * y15
53+
# c17 not needed for objective
54+
55+
return -T(5.843e-7) * y17 +
56+
T(1.17e-4) * y14 +
57+
T(2.358e-5) * y13 +
58+
T(1.502e-6) * y16 +
59+
T(0.0321) * y12 +
60+
T(0.004324) * y5 +
61+
T(1e-4) * c15 / c16 +
62+
T(37.48) * y2 / c12 +
63+
T(0.1365)
64+
end
65+
66+
# Constraint function (48 inequalities, all of the form c(x) >= 0)
67+
function c!(cx::AbstractVector{T}, x::AbstractVector{T})
68+
# All intermediates (identical to those used in objective)
69+
y1 = x[2] + x[3] + T(41.6)
70+
c1 = T(0.024) * x[4] - T(4.62)
71+
y2 = T(12.5) / c1 + T(12)
72+
c2 = T(0.0003535) * x[1]^2 + T(0.5311) * x[1] + T(0.08705) * y2 * x[1]
73+
c3 = T(0.052) * x[1] + T(78) + T(0.002377) * y2 * x[1]
74+
y3 = c2 / c3
75+
y4 = T(19) * y3
76+
c4 = T(0.04782) * (x[1] - y3) + T(0.1956) * (x[1] - y3)^2 / x[2] + T(0.6376) * y4 + T(1.594) * y3
77+
c5 = T(100) * x[2]
78+
c6 = x[1] - y3 - y4
79+
c7 = T(0.95) - c4 / c5
80+
y5 = c6 * c7
81+
y6 = x[1] - y5 - y4 - y3
82+
c8 = (y5 + y4) * T(0.995)
83+
y7 = c8 / y1
84+
y8 = c8 / T(3798)
85+
c9 = y7 - T(0.0663) * y7 / y8 - T(0.3153)
86+
y9 = T(96.82) / c9 + T(0.321) * y1
87+
y10 = T(1.29) * y5 + T(1.258) * y4 + T(2.29) * y3 + T(1.71) * y6
88+
y11 = T(1.71) * x[1] - T(0.452) * y4 + T(0.58) * y3
89+
c11 = T(1.75) * y2 * T(0.995) * x[1]
90+
c12 = T(0.995) * y10 + T(1998)
91+
y12 = c10 * x[1] + c11 / c12
92+
y13 = c12 - T(1.75) * y2
93+
y14 = T(3623) + T(64.4) * x[2] + T(58.4) * x[3] + T(146312) / (y9 + x[5])
94+
c13 = T(0.995) * y10 + T(60.8) * x[2] + T(48) * x[4] - T(0.1121) * y14 - T(5095)
95+
y15 = y13 / c13
96+
y16 = T(148000) - T(331000) * y15 + T(40) * y13 - T(61) * y15 * y13
97+
c14 = T(2324) * y10 - T(28740000) * y2
98+
y17 = T(14130000) - T(1328) * y10 - T(531) * y11 + c14 / c12
99+
c15 = y13 / y15 - y13 / T(0.52)
100+
c16 = T(1.104) - T(0.72) * y15
101+
c17 = y9 + x[5]
102+
# Constraints
103+
cx[1] = T(1.5) * x[2] - x[3]
104+
cx[2] = y1 - T(213.1)
105+
cx[3] = T(405.23) - y1
106+
cx[4] = y2 - a[2]
107+
cx[5] = y3 - a[3]
108+
cx[6] = y4 - a[4]
109+
cx[7] = y5 - a[5]
110+
cx[8] = y6 - a[6]
111+
cx[9] = y7 - a[7]
112+
cx[10] = y8 - a[8]
113+
cx[11] = y9 - a[9]
114+
cx[12] = y10 - a[10]
115+
cx[13] = y11 - a[11]
116+
cx[14] = y12 - a[12]
117+
cx[15] = y13 - a[13]
118+
cx[16] = y14 - a[14]
119+
cx[17] = y15 - a[15]
120+
cx[18] = y16 - a[16]
121+
cx[19] = y17 - a[17]
122+
cx[20] = b[2] - y2
123+
cx[21] = b[3] - y3
124+
cx[22] = b[4] - y4
125+
cx[23] = b[5] - y5
126+
cx[24] = b[6] - y6
127+
cx[25] = b[7] - y7
128+
cx[26] = b[8] - y8
129+
cx[27] = b[9] - y9
130+
cx[28] = b[10] - y10
131+
cx[29] = b[11] - y11
132+
cx[30] = b[12] - y12
133+
cx[31] = b[13] - y13
134+
cx[32] = b[14] - y14
135+
cx[33] = b[15] - y15
136+
cx[34] = b[16] - y16
137+
cx[35] = b[17] - y17
138+
cx[36] = y4 - (T(0.28) / T(0.72)) * y5
139+
cx[37] = T(21) - T(3496) * y2 / c12
140+
cx[38] = T(62212) / c17 - T(110.6) - y1
141+
# 10 box constraints (5 lower, 5 upper)
142+
cx[39] = x[1] - lvar[1]
143+
cx[40] = x[2] - lvar[2]
144+
cx[41] = x[3] - lvar[3]
145+
cx[42] = x[4] - lvar[4]
146+
cx[43] = x[5] - lvar[5]
147+
cx[44] = uvar[1] - x[1]
148+
cx[45] = uvar[2] - x[2]
149+
cx[46] = uvar[3] - x[3]
150+
cx[47] = uvar[4] - x[4]
151+
cx[48] = uvar[5] - x[5]
152+
return cx
153+
end
154+
# Constraint bounds: all inequalities of the form c(x) >= 0
155+
m = 48
156+
cl = zeros(T, m)
157+
cu = fill(T(Inf), m)
158+
return ADNLPModels.ADNLPModel!(
159+
f, x0, lvar, uvar,
160+
c!, cl, cu;
161+
name = "hs85",
162+
kwargs...
163+
)
164+
end

src/ADNLPProblems/hs89.jl

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
export hs89
2+
3+
function hs89(; type::Type{T} = Float64, kwargs...) where T
4+
# First 30 positive roots of tan(μ) = μ
5+
mu = T[
6+
0.8603335890193798, 3.425618459481728, 6.437298179171945, 9.529334405361963,
7+
12.645287223856588, 15.771284874815820, 18.902409956860000, 22.036496727938500,
8+
25.172446326646600, 28.309642854452000, 31.447714637546200, 34.586424215288900,
9+
37.725612827776500, 40.865170330488000, 44.005017920830800, 47.145097736761000,
10+
50.285366337773600, 53.425790477394600, 56.566344279821500, 59.707007305335400,
11+
62.847763194454400, 65.988598698490300, 69.129502973895200, 72.270467060308900,
12+
75.411483488848100, 78.552545984242900, 81.693649235601600, 84.834788718042200,
13+
87.975960552493200, 91.117161394464700
14+
]
15+
16+
# Precomputed coefficients A_j = 2 sin(μ_j) / (μ_j + sin(μ_j) cos(μ_j))
17+
A = [2 * sin(mu[j]) / (mu[j] + sin(mu[j]) * cos(mu[j])) for j in 1:30]
18+
19+
# Objective: φ(x) = ∑_{j=1}^{30} A_j ρ_j(x)
20+
function f(x::AbstractVector{T})
21+
s = zero(T)
22+
r = x[1]^2 + x[2]^2 + x[3]^2
23+
for j = 1:30
24+
μ² = mu[j]^2
25+
exp_r = exp(-μ² * r)
26+
ρ = - (exp_r + 2*exp(-μ²*(x[2]^2 + x[3]^2)) + 2*exp(-μ²*x[3]^2) + 1) / μ²
27+
s += A[j] * ρ
28+
end
29+
return s
30+
end
31+
32+
# Equality constraint c(x) = 0
33+
# Full expression with cross terms (double sum over i < j)
34+
function c!(cx::AbstractVector{T}, x::AbstractVector{T})
35+
r = x[1]^2 + x[2]^2 + x[3]^2
36+
termA = zero(T)
37+
termB = zero(T)
38+
# Compute termA and termB directly, no heap allocation
39+
for j = 1:30
40+
μ = mu[j]
41+
μ² = μ^2
42+
exp_r = exp(-μ² * r)
43+
exp_r23 = exp(-μ² * (x[2]^2 + x[3]^2))
44+
exp_r3 = exp(-μ² * x[3]^2)
45+
ρj = - (exp_r + 2*exp_r23 + 2*exp_r3 + 1) / μ²
46+
termA += A[j]^2 * ρj^2 * (sin(2*μ)/(2*μ) + one(T)) / 2
47+
end
48+
for i = 1:29
49+
μi = mu[i]
50+
μi² = μi^2
51+
exp_ri = exp(-μi² * r)
52+
exp_ri23 = exp(-μi² * (x[2]^2 + x[3]^2))
53+
exp_ri3 = exp(-μi² * x[3]^2)
54+
ρi = - (exp_ri + 2*exp_ri23 + 2*exp_ri3 + 1) / μi²
55+
for j = i+1:30
56+
μj = mu[j]
57+
μj² = μj^2
58+
exp_rj = exp(-μj² * r)
59+
exp_rj23 = exp(-μj² * (x[2]^2 + x[3]^2))
60+
exp_rj3 = exp(-μj² * x[3]^2)
61+
ρj = - (exp_rj + 2*exp_rj23 + 2*exp_rj3 + 1) / μj²
62+
denom_plus = μi + μj
63+
denom_minus = μi - μj
64+
sin_plus = iszero(denom_plus) ? one(T) : sin(denom_plus)/denom_plus
65+
sin_minus = iszero(denom_minus) ? one(T) : sin(denom_minus)/denom_minus
66+
termB += A[i] * A[j] * ρi * ρj * (sin_plus + sin_minus)
67+
end
68+
end
69+
cx[1] = termA + termB - T(2)/15
70+
return cx
71+
end
72+
73+
# Starting point (common in literature / CUTE)
74+
x0 = T[0.5, -0.5, 0.5]
75+
76+
# One equality constraint c(x) = 0
77+
lcon = ucon = T[0]
78+
79+
return ADNLPModels.ADNLPModel!(
80+
f, x0,
81+
c!, lcon, ucon;
82+
name = "hs89",
83+
lin = Int[], # no linear constraints
84+
kwargs...
85+
)
86+
end

src/Meta/hs85.jl

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
hs85_meta = Dict(
2+
:nvar => 5,
3+
:variable_nvar => false,
4+
:ncon => 48,
5+
:variable_ncon => false,
6+
:minimize => true,
7+
:name => "hs85",
8+
:has_equalities_only => false,
9+
:has_inequalities_only => true,
10+
:has_bounds => true,
11+
:has_fixed_variables => false,
12+
:objtype => :other,
13+
:contype => :general,
14+
:best_known_lower_bound => -Inf,
15+
:best_known_upper_bound => -1.90513375,
16+
:is_feasible => true,
17+
:defined_everywhere => missing,
18+
:origin => :unknown,
19+
)
20+
get_hs85_nvar(; n::Integer = 5, kwargs...) = 5
21+
get_hs85_ncon(; n::Integer = 48, kwargs...) = 48
22+
get_hs85_nlin(; n::Integer = 48, kwargs...) = 0
23+
get_hs85_nnln(; n::Integer = 48, kwargs...) = 48

src/Meta/hs89.jl

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
hs89_meta = Dict(
2+
:nvar => 3,
3+
:variable_nvar => false,
4+
:ncon => 1,
5+
:variable_ncon => false,
6+
:minimize => true,
7+
:name => "hs89",
8+
:has_equalities_only => false,
9+
:has_inequalities_only => true,
10+
:has_bounds => false,
11+
:has_fixed_variables => false,
12+
:objtype => :other,
13+
:contype => :general,
14+
:best_known_lower_bound => -Inf,
15+
:best_known_upper_bound => 1.36265681,
16+
:is_feasible => true,
17+
:defined_everywhere => missing,
18+
:origin => :unknown,
19+
)
20+
get_hs89_nvar(; n::Integer = 3, kwargs...) = 3
21+
get_hs89_ncon(; n::Integer = 1, kwargs...) = 1
22+
get_hs89_nlin(; n::Integer = 1, kwargs...) = 0
23+
get_hs89_nnln(; n::Integer = 1, kwargs...) = 1

0 commit comments

Comments
 (0)