|
| 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