Description
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 power cone work.
Small Model of Type : NLP
Category : GAMS Test library
Main file : powercone1.gms
$title Test of correct handling of power cone in DNLP (POWERCONE1,SEQ=798)
$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 power cone work.
The model is taken from (6.8) in
https://docs.mosek.com/9.0/capi/tutorial-pow-shared.html
Contributor: Stefan
$offText
$if not set TESTTOL $set TESTTOL 1e-3
$if not set MCHECKS $set MCHECKS 1
Nonnegative Variables x0, x1, x2;
Variable x3, x4, x5, z;
Equations e1, e2, e3a, e3b, e3c, e3d, e3e, e3f, objdef;
Scalar x4obj / 1 /;
objdef.. x3 + x4obj * x4 - x0 =E= z;
e1.. x0 + x1 + 0.5*x2 =E= 2;
e2.. x0**0.2 * x1**0.8 =G= abs(x3);
e3a.. x2**0.4 * x5**0.6 =G= abs(x4);
e3b.. -x2**0.4 * x5**0.6 =L= -abs(x4);
e3c.. x2**0.4 * x5**0.6 =G= sqrt(x4**2);
e3d.. -x2**0.4 * x5**0.6 =L= -sqrt(sqr(x4));
e3e.. x2**0.4 * x5**0.6 =G= x4;
e3f.. x5**0.6 * (-x2**0.4) =L= x4;
x5.fx = 1;
Model ma / objdef, e1, e2, e3a /;
Model mb / objdef, e1, e2, e3b /;
Model mc / objdef, e1, e2, e3c /;
Model md / objdef, e1, e2, e3d /;
Model me / objdef, e1, e2, e3e /;
Model mf / objdef, e1, e2, e3f /;
option bratio = 1;
Scalar modelnr;
Scalar solvestat, modelstat, e3l;
for( modelnr = 1 to 6,
x0.l = 0.05;
x1.l = 1;
x2.l = 3;
if( modelnr = 5, x4.lo = 0 )
if( modelnr = 6, x4.lo = -inf; x4.up = 0; x4obj = -1 )
if( modelnr = 1, Solve ma max z using DNLP; solvestat = ma.solvestat; modelstat = ma.modelstat; e3l = e3a.l )
if( modelnr = 2, Solve mb max z using DNLP; solvestat = mb.solvestat; modelstat = mb.modelstat; e3l = e3b.l )
if( modelnr = 3, Solve mc max z using DNLP; solvestat = mc.solvestat; modelstat = mc.modelstat; e3l = e3c.l )
if( modelnr = 4, Solve md max z using DNLP; solvestat = md.solvestat; modelstat = md.modelstat; e3l = e3d.l )
if( modelnr = 5, Solve me max z using DNLP; solvestat = me.solvestat; modelstat = me.modelstat; e3l = e3e.l )
if( modelnr = 6, Solve mf max z using DNLP; solvestat = mf.solvestat; modelstat = mf.modelstat; e3l = e3f.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.06389795) > %TESTTOL%) "wrong x0.l, expected 0.06389795", x0.l ;
abort$(abs(x1.l - 0.78336975) > %TESTTOL%) "wrong x1.l, expected 0.78336975", x1.l ;
abort$(abs(x2.l - 2.30546462) > %TESTTOL%) "wrong x2.l, expected 2.30546462", x2.l ;
abort$(abs(x3.l - 0.47453779) > %TESTTOL%) "wrong x3.l, expected 0.47453779", x3.l ;
abort$(abs(x4.l - x4obj*1.39670081) > %TESTTOL%) "wrong x4.l, expected x4obj*1.39670081", x4.l ;
abort$(abs(e1.l - 2) > %TESTTOL%) "wrong e1.l, expected 2", e1.l ;
abort$(abs(e2.l) > %TESTTOL%) "wrong e2.l, expected zero", e2.l ;
abort$(abs(e3l) > %TESTTOL%) "wrong e3?.l, expected zero", e3l ;
abort$(abs(z.l - 1.8073406571) > %TESTTOL%) "wrong z.l, expected 1.8073406571", 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(x3.m) > %TESTTOL%) "wrong x3.m, expected zero", x3.m ;
abort$(abs(x4.m) > %TESTTOL%) "wrong x4.m, expected zero", x4.m ;
abort$(abs(x5.m - 0.83801326) > %TESTTOL%) "wrong x5.m, expected 0.83801326", x5.m ;
abort$(abs(e1.m - 0.48466370) > %TESTTOL%) "wrong e1.m, expected 0.48466370", e1.m ;
abort$(abs(e2.m + 1) > %TESTTOL%) "wrong e2.m, expected -1", e2.m ;
abort$(modelnr = 1 and abs(e3a.m + 1) > %TESTTOL%) "wrong e3a.m, expected 1", e3a.m ;
abort$(modelnr = 2 and abs(e3b.m - 1) > %TESTTOL%) "wrong e3b.m, expected -1", e3b.m ;
abort$(modelnr = 3 and abs(e3c.m + 1) > %TESTTOL%) "wrong e3c.m, expected 1", e3c.m ;
abort$(modelnr = 4 and abs(e3d.m - 1) > %TESTTOL%) "wrong e3d.m, expected -1", e3d.m ;
abort$(modelnr = 5 and abs(e3e.m + 1) > %TESTTOL%) "wrong e3e.m, expected 1", e3e.m ;
abort$(modelnr = 6 and abs(e3f.m - 1) > %TESTTOL%) "wrong e3f.m, expected -1", e3f.m ;
)
)