@@ -22,3 +22,93 @@ function hs100(args...; kwargs...)
2222
2323 return nlp
2424end
25+
26+ " HS100 model with the 2 middle constraints as VectorNonlinearOracle"
27+ function hs100_oracle(args... ; kwargs... )
28+ model = Model()
29+ x0 = [1 , 2 , 0 , 4 , 0 , 1 , 1 ]
30+ @variable(model, x[i = 1 : 7 ], start = x0[i])
31+
32+ # 1st constraint: keep as NLconstraint
33+ @NLconstraint(model,
34+ 127 - 2 * x[1 ]^ 2 - 3 * x[2 ]^ 4 - x[3 ] - 4 * x[4 ]^ 2 - 5 * x[5 ] ≥ 0
35+ )
36+
37+ # 2nd constraint as oracle:
38+ # Original: 282 - 7x1 - 3x2 - 10x3^2 - x4 + x5 ≥ 0
39+ # Canonical: f2(x) = -7x1 - 3x2 - 10x3^2 - x4 + x5, l2 = -282, u2 = +∞
40+ set2 = MOI. VectorNonlinearOracle(;
41+ dimension = 5 , # inputs: x1, x2, x3, x4, x5
42+ l = [- 282.0 ],
43+ u = [Inf ],
44+ eval_f = (ret, xv) -> begin
45+ # xv = [x1, x2, x3, x4, x5]
46+ ret[1 ] = - 7.0 * xv[1 ] - 3.0 * xv[2 ] - 10.0 * xv[3 ]^ 2 - xv[4 ] + xv[5 ]
47+ end ,
48+ # ∇f2 = [-7, -3, -20*x3, -1, 1]
49+ jacobian_structure = [(1 , 1 ), (1 , 2 ), (1 , 3 ), (1 , 4 ), (1 , 5 )],
50+ eval_jacobian = (ret, xv) -> begin
51+ ret[1 ] = - 7.0 # ∂f2/∂x1
52+ ret[2 ] = - 3.0 # ∂f2/∂x2
53+ ret[3 ] = - 20.0 * xv[3 ] # ∂f2/∂x3
54+ ret[4 ] = - 1.0 # ∂f2/∂x4
55+ ret[5 ] = 1.0 # ∂f2/∂x5
56+ end ,
57+ # Hessian of f2: only (3,3) = -20
58+ hessian_lagrangian_structure = [(3 , 3 )],
59+ eval_hessian_lagrangian = (ret, xv, μ) -> begin
60+ # Hessian of μ[1] * f2(x)
61+ ret[1 ] = μ[1 ] * (- 20.0 ) # (3,3)
62+ end ,
63+ )
64+ @constraint(model, [x[1 ], x[2 ], x[3 ], x[4 ], x[5 ]] in set2)
65+
66+ # 3rd constraint as oracle:
67+ # Original: -196 + 23x1 + x2^2 + 6x6^2 - 8x7 ≤ 0
68+ # Canonical: f3(x) = 23x1 + x2^2 + 6x6^2 - 8x7, l3 = -∞, u3 = 196
69+ set3 = MOI. VectorNonlinearOracle(;
70+ dimension = 4 , # inputs: x1, x2, x6, x7
71+ l = [- Inf ],
72+ u = [196.0 ],
73+ eval_f = (ret, xv) -> begin
74+ # xv = [x1, x2, x6, x7]
75+ ret[1 ] = 23.0 * xv[1 ] + xv[2 ]^ 2 + 6.0 * xv[3 ]^ 2 - 8.0 * xv[4 ]
76+ end ,
77+ # ∇f3 = [23, 2*x2, 12*x6, -8]
78+ jacobian_structure = [(1 , 1 ), (1 , 2 ), (1 , 3 ), (1 , 4 )],
79+ eval_jacobian = (ret, xv) -> begin
80+ ret[1 ] = 23.0 # ∂f3/∂x1
81+ ret[2 ] = 2.0 * xv[2 ] # ∂f3/∂x2
82+ ret[3 ] = 12.0 * xv[3 ] # ∂f3/∂x6
83+ ret[4 ] = - 8.0 # ∂f3/∂x7
84+ end ,
85+ # Hessian of f3: (2,2) = 2, (3,3) = 12
86+ hessian_lagrangian_structure = [(2 , 2 ), (3 , 3 )],
87+ eval_hessian_lagrangian = (ret, xv, μ) -> begin
88+ # Hessian of μ[1] * f3(x)
89+ ret[1 ] = μ[1 ] * 2.0 # (2,2)
90+ ret[2 ] = μ[1 ] * 12.0 # (3,3)
91+ end ,
92+ )
93+ @constraint(model, [x[1 ], x[2 ], x[6 ], x[7 ]] in set3)
94+
95+ # 4th constraint: keep as standard nonlinear
96+ @constraint(model,
97+ - 4 * x[1 ]^ 2 - x[2 ]^ 2 + 3 * x[1 ] * x[2 ] - 2 * x[3 ]^ 2 - 5 * x[6 ] + 11 * x[7 ] ≥ 0
98+ )
99+
100+ # Objective: same as original
101+ @NLobjective(
102+ model,
103+ Min,
104+ (x[1 ] - 10 )^ 2 +
105+ 5 * (x[2 ] - 12 )^ 2 +
106+ x[3 ]^ 4 +
107+ 3 * (x[4 ] - 11 )^ 2 +
108+ 10 * x[5 ]^ 6 +
109+ 7 * x[6 ]^ 2 +
110+ x[7 ]^ 4 - 4 * x[6 ] * x[7 ] - 10 * x[6 ] - 8 * x[7 ]
111+ )
112+
113+ return model
114+ end
0 commit comments