$title Test of correct handling of exponential cone in NLP (EXPCONE1,SEQ=800) $onText Test of correctness of the levels and marginals returned. Although this test should work for all NLP solvers, it is designed specifically to test a conic solvers, e.g., Mosek. It also tests whether slight variations in the algebraic formulation of the exponential cone work. The model is taken from (6.9) in https://docs.mosek.com/9.0/capi/tutorial-ceo-shared.html Contributor: Stefan $offText $if not set TESTTOL $set TESTTOL 1e-5 $if not set MCHECKS $set MCHECKS 1 Nonnegative Variables x0, x1; Variable x2, z; Equations e1, e2a, e2b, e2c, e2d, objdef; objdef.. x0 + x1 =E= z; e1.. x0 + x1 + x2 =E= 1; e2a.. x0 =G= x1 * exp(x2/x1); e2b.. x0 + exp(x2/x1) * (-x1) =G= 0; e2c.. -x0 =L= -x1 * exp(x2/x1); e2d.. x0 * (-1) + x1 * exp(1/x1*x2) =L= 0; Model ma / objdef, e1, e2a /; Model mb / objdef, e1, e2b /; Model mc / objdef, e1, e2c /; Model md / objdef, e1, e2d /; option bratio = 1; Scalar modelnr; Scalar solvestat, modelstat, e2l; for( modelnr = 1 to 4, x1.l = 1; if( modelnr = 1, Solve ma min z using NLP; solvestat = ma.solvestat; modelstat = ma.modelstat; e2l = e2a.l ) if( modelnr = 2, Solve mb min z using NLP; solvestat = mb.solvestat; modelstat = mb.modelstat; e2l = e2b.l ) if( modelnr = 3, Solve mc min z using NLP; solvestat = mc.solvestat; modelstat = mc.modelstat; e2l = e2c.l ) if( modelnr = 4, Solve md min z using NLP; solvestat = md.solvestat; modelstat = md.modelstat; e2l = e2d.l ) abort$(solvestat <> %solveStat.normalCompletion%) "wrong solver status, expected normal completion", solvestat ; abort$(modelstat > %modelStat.locallyOptimal% and modelstat <> %modelStat.feasibleSolution%) "wrong model status, expected at least feasibility", modelstat ; abort$(abs(x0.l - 0.61181852) > %TESTTOL%) "wrong x0.l, expected 0.61181852", x0.l ; abort$(abs(x1.l - 0.17036977) > %TESTTOL%) "wrong x1.l, expected 0.17036977", x1.l ; abort$(abs(x2.l - 0.21781170) > %TESTTOL%) "wrong x2.l, expected 0.21781170", x2.l ; abort$(abs(e1.l - 1) > %TESTTOL%) "wrong e1.l, expected 1", e1.l ; abort$(abs(e2l) > %TESTTOL%) "wrong e2?.l, expected zero", e2l ; abort$(abs(z.l - 0.78218829) > %TESTTOL%) "wrong z.l, expected 0.78218829", z.l ; if( %MCHECKS% <> 0, abort$(abs(x0.m) > %TESTTOL%) "wrong x0.m, expected zero", x0.m ; abort$(abs(x1.m) > %TESTTOL%) "wrong x1.m, expected zero", x1.m ; abort$(abs(x2.m) > %TESTTOL%) "wrong x2.m, expected zero", x2.m ; abort$(abs(e1.m - 0.78218829) > %TESTTOL%) "wrong e1.m, expected 0.78218829", e1.m ; abort$(modelnr = 1 and abs(e2a.m - 0.21781171) > %TESTTOL%) "wrong e2a.m, expected 0.21781171", e2a.m ; abort$(modelnr = 2 and abs(e2b.m - 0.21781171) > %TESTTOL%) "wrong e2b.m, expected 0.21781171", e2b.m ; abort$(modelnr = 3 and abs(e2c.m + 0.21781171) > %TESTTOL%) "wrong e2c.m, expected -0.21781171", e2c.m ; ) )