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