Skip to content

Commit f22659d

Browse files
committed
Add test for Luksan-Vlcek Problem 10 in test_lukvle10.py
1 parent ac6ebad commit f22659d

1 file changed

Lines changed: 49 additions & 0 deletions

File tree

tests/test_lukvle10.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import pytest
2+
3+
import pyoptinterface as poi
4+
from pyoptinterface import ipopt, nl
5+
6+
7+
def test_nlp_lukvle10(nlp_model_ctor):
8+
# LUKSAN-VLCEK Problem 10
9+
#
10+
# min sum[i=1..n] (x[2i]^2)^(x[2i+1]^2 + 1) + (x[2i+1]^2)^(x[2i]^2 + 1)
11+
# s.t. (3 - 2*x[i+1])*x[i+1] + 1 - x[i] - 2*x[i+2] = 0, i = 1,...,2n-2
12+
#
13+
# Starting point: x[2i] = 1, x[2i+1] = -1
14+
model = nlp_model_ctor()
15+
if isinstance(model, ipopt.Model):
16+
pytest.skip("lukvle10 is too large to be supported with IPOPT")
17+
18+
n = 100000
19+
x = model.add_m_variables(2 * n, name="x")
20+
21+
for i in range(2 * n - 2):
22+
model.add_quadratic_constraint(
23+
(3 - 2 * x[i + 1]) * x[i + 1] + 1 - x[i] - 2 * x[i + 2],
24+
poi.ConstraintSense.Equal,
25+
0.0,
26+
name=f"c{i}",
27+
)
28+
29+
with nl.graph():
30+
for i in range(n):
31+
x_sq_2i = x[2 * i] * x[2 * i]
32+
x_sq_2ip1 = x[2 * i + 1] * x[2 * i + 1]
33+
model.add_nl_objective(
34+
nl.pow(x_sq_2i, x_sq_2ip1 + 1) + nl.pow(x_sq_2ip1, x_sq_2i + 1)
35+
)
36+
37+
for i in range(n):
38+
model.set_variable_attribute(x[2 * i], poi.VariableAttribute.PrimalStart, 1.0)
39+
model.set_variable_attribute(
40+
x[2 * i + 1], poi.VariableAttribute.PrimalStart, -1.0
41+
)
42+
43+
model.optimize()
44+
45+
termination_status = model.get_model_attribute(poi.ModelAttribute.TerminationStatus)
46+
assert (
47+
termination_status == poi.TerminationStatusCode.LOCALLY_SOLVED
48+
or termination_status == poi.TerminationStatusCode.OPTIMAL
49+
)

0 commit comments

Comments
 (0)