nlp01.gms : Test of correctness for levels and marginals of NLP

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 MINOS-style link.
It includes most/all of the different sorts of variables and
constraints one finds in such links.

Contributor: Steve


Small Model of Type : NLP


Category : GAMS Test library


Main file : nlp01.gms

$title Test of correctness for levels & marginals of NLP (NLP01,SEQ=415)

$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 MINOS-style link.
It includes most/all of the different sorts of variables and
constraints one finds in such links.

Contributor: Steve
$offText

$if not set MTYPE   $set MTYPE nlp
$if not set TESTTOL $set TESTTOL 1e-6
scalar mchecks / 0 /;
$if not %MCHECKS% == 0 mchecks = 1;

$escape =
$echo if{%=1, display '%=1 failed', '%=2'; failed=1}; > tmp.gms
$escape %

scalars
  cz / 1 /
  cb / 0 /;

variables
  t   'linear in obj, nonlinear in constraints'
  u   'nonlinear in obj and constraints'
  v   'nonlinear in obj, linear in constraints'
  w   'not in obj, nonlinear in constraints'
  x   'linear in obj and constraints'
  y   'not in obj, linear in constraints'
  z   'objective var'
  ;
equations
  obj
  e   'linear, equality'
  f   'nonlinear, less-than'
  g   'nonlinear, greater-than'
  h   'nonlinear, equality'
  L   'linear, less-than'
  ;

obj.. cz * z =E= cb + 2*t + sqr(u) + sin(v/10) + 5*x;
e..   w =E= 2*t;
L..   x + y =L= 7;
f..   u**1.5 + y =L= 3;
g..   1 =G= log(t) + v;
h..   w**1.1 =E= y;

model m / e, L, obj, f, g, h /;

t.lo = .1;    t.up = 2;
u.lo = 1e-3;  u.up = 3;
v.lo = 1e-3;  v.up = 4;
w.lo = 1e-3;  w.up = 1;
x.lo = 0;     x.up = 10;
y.lo = 0;     y.up = 10;

* solve m using nlp max z;
* $exit

scalars
  failed  /    0 /
  isMax   /    0 /
  tol     /    %TESTTOL% /
  obj_l   /    0.0 /
  obj_m   /    1.0 /
  objval  /   38.67540837055 /
  e_l     /    0 /
  e_m     /   -6.448473234922 /
  f_l     /    3 /
  f_m     /    1.8859080143051 /
  g_l     /   -1 /
  g_m     /   -0.094595854378246 /
  h_l     /    0 /
  h_m     /    6.8859080143051 /
  L_l     /    7 /
  L_m     /    5 /
  t_l     /    0.1 /
  t_m     /  -11.842905013627 /
  u_l     /    2.00061508410989 /
  u_m     /    0 /
  v_l     /    3.30258509299405 /
  v_m     /    0 /
  w_l     /    0.2 /
  w_m     /    0 /
  x_l     /    6.82973201549584 /
  x_m     /    0 /
  y_l     /    0.170267984504157 /
  y_m     /    0 /
  ;

set czvals 'obj multipliers' /
'cz=1',
'cz=0.5'
'cz=3'
'cz=-1'
'cz=-0.5'
'cz=-3'
/;
parameter czv(czvals) /
'cz=1'          1
'cz=0.5'        0.5
'cz=3'          3
'cz=-1'        -1
'cz=-0.5'      -0.5
'cz=-3'        -3
/;

set cbvals 'obj constants' /
'cb=0'
'cb=2'
'cb=-2'
/;
parameter cbv(cbvals) /
'cb=0'          0
'cb=2'          2
'cb=-2'        -2
/;

loop {czvals$[ord(czvals) <= INF],
 cz = czv(czvals);
 loop {cbvals$[ord(cbvals) <= INF],
  cb = cbv(cbvals);
  if {(cz > 0),
    isMax = 1;
    solve m using %MTYPE% max z;
  else
    isMax = -1;
    solve m using %MTYPE% min z;
  }

  if {(m.modelstat = %modelStat.noSolutionReturned%) and (m.solvestat = %solveStat.capabilityProblems%),
*   capability problems due to sin() or non-convex model
    abort.noerror 'Capability problems: further testing skipped: TEST PASSED';
  };
$ batInclude tmp "( m.solvestat <> %solveStat.normalCompletion% or (m.modelstat > %modelStat.locallyOptimal% and m.modelstat <> %modelStat.feasibleSolution%))" "wrong status codes"

$ batInclude tmp "(abs(cz*z.l-cb-objval) > tol)"          "bad z.l"

$ batInclude tmp "(abs(t.l-t_l) > tol)"                   "bad t.l"
$ batInclude tmp "(abs(u.l-u_l) > tol)"                   "bad u.l"
$ batInclude tmp "(abs(v.l-v_l) > tol)"                   "bad v.l"
$ batInclude tmp "(abs(w.l-w_l) > tol)"                   "bad w.l"
$ batInclude tmp "(abs(x.l-x_l) > tol)"                   "bad x.l"
$ batInclude tmp "(abs(y.l-y_l) > tol)"                   "bad y.l"

$ batInclude tmp "(abs(obj.l-cb) > tol)"                  "bad obj.l"
$ batInclude tmp "(abs(e.l-e_l) > tol)"                   "bad e.l"
$ batInclude tmp "(abs(f.l-f_l) > tol)"                   "bad f.l"
$ batInclude tmp "(abs(g.l-g_l) > tol)"                   "bad g.l"
$ batInclude tmp "(abs(h.l-h_l) > tol)"                   "bad h.l"
$ batInclude tmp "(abs(L.l-L_l) > tol)"                   "bad L.l"

  if {mchecks,
$   batInclude tmp "(abs(z.m) > tol)"                     "bad z.m"
$   batInclude tmp "(abs(cz*t.m -t_m) > tol)"             "bad t.m"
$   batInclude tmp "(abs(cz*u.m -u_m) > tol)"             "bad u.m"
$   batInclude tmp "(abs(cz*v.m -v_m) > tol)"             "bad v.m"
$   batInclude tmp "(abs(cz*w.m -w_m) > tol)"             "bad w.m"
$   batInclude tmp "(abs(cz*x.m -x_m) > tol)"             "bad x.m"
$   batInclude tmp "(abs(cz*y.m -y_m) > tol)"             "bad y.m"

$   batInclude tmp "(abs(cz*obj.m-obj_m) > tol)"          "bad obj.m"
$   batInclude tmp "(abs(cz*e.m -e_m) > tol)"             "bad e.m"
$   batInclude tmp "(abs(cz*f.m -f_m) > tol)"             "bad f.m"
$   batInclude tmp "(abs(cz*g.m -g_m) > tol)"             "bad g.m"
$   batInclude tmp "(abs(cz*h.m -h_m) > tol)"             "bad h.m"
$   batInclude tmp "(abs(cz*L.m -L_m) > tol)"             "bad L.m"
  };

$ifThen set doscalar
  if {failed,
    option %MTYPE%=convert;
    if {(cz > 0),
      solve m using %MTYPE% max z;
    else
      solve m using %MTYPE% min z;
    };
  };
$endIf
  abort$failed 'test failed', cz, cb;
 };
};