Description
This example is based on ex2.gms, an NLP example of an unconstrained QP. Here, we start with the same model, write down its KKT conditions, and then implement these KKT conditions using an external equation
Small Model of Type : GAMS
Category : GAMS Test library
Main file : exmcp1.gms
$title External Equation - Example MCP 1 (EXMCP1,SEQ=573)
$onText
This example is based on ex2.gms, an NLP example of
an unconstrained QP.
Here, we start with the same model, write down its KKT conditions,
and then implement these KKT conditions using an external equation
$offText
set I /i1*i14/;
alias (I,J);
scalar compz;
parameter Q(I,I) 'Covariance Matrix',
X0(I) 'Targets';
Q(I,J) = power(0.5, abs(ord(I)-ord(J)) );
X0(I) = ord(I) / card(I);
display Q, X0;
variables
x(I), z;
equations
zdef 'objective function, in GAMS',
dzdx(I) 'del z wrt x(I)',
dzdxX(I) 'del z wrt x(I), eXternal version';
zdef.. sum {(I,J),
(x(I)-x0(I)) * Q(I,J) * (x(J)-x0(J)) }
=e= z;
dzdx(I).. 2 * sum {J, Q(I,J) * (x(J) - x0(J)) } =e= 0;
dzdxX(I).. sum {J, ord(J) * x(J) } =x= ord(I);
$ set pre
$ifI %system.filesys%==unix $set pre 'lib'
$ set suf '64'
$set N exmcp1
$set cN %pre%%N%c%suf%
$set fN %pre%%N%f%suf%
model exnlp1 / zdef /;
model %N% 'GAMS implementation' / dzdx /;
model %cN% 'External equations in C' / dzdxX /;
model %fN% 'External equations in F77' / dzdxX /;
file f / 'exmcp1.put' /; f.nw = 0; f.nd = 13;
f.nr = 0; put f card(i):0:0 /; f.nr = 2;
loop {i,
put x0(i) /;
loop {j,
put q(i,j) /;
};
};
putclose f;
parameter report(*, *, *) 'Solution Summary';
scalar totdist /0/;
$onEchoV > runme.gms
x.l(j) = 0;
x.m(j) = 0;
$if %2==nlp solve %1 using nlp min z;
$if not %2==nlp solve %1 using mcp; z.l = sum {(I,J), (x.l(I)-x0(I)) * Q(I,J) * (x.l(J)-x0(J))};
report('Solve ','Stat', '%1') = %1.solvestat;
report('Model ','Stat', '%1') = %1.modelstat;
report('OBJ', 'Z', '%1') = z.l;
report(i,'Target', '%1') = x0(i);
report(i,'Value', '%1') = x.l(i);
report(i,'Distance','%1') = abs(x.l(i) - x0(i));
totdist = totdist + sum(i,abs(x.l(i) - x0(i)));
$offEcho
$ set ext '.dll'
$ifI %system.filesys%==unix $set ext '.so'
$ifI %system.platform%==dex $set ext '.dylib'
$ifI %system.platform%==dax $set ext '.dylib'
$ set eq
$ifI %system.filesys%==unix $set eq "'"
$if set runall $set runC '1' set runF '1'
$ifThen not set nocomp
$ ifI set runC $call gams complink lo=%gams.lo% --lang=c --files=exmcp1c.c --libname=%cN%%ext%
$ if errorlevel 1 $abort Error compiling C Library
$ ifI set runF $call gams complink lo=%gams.lo% --lang=fortran90 --files=%eq%"gehelper.f90 exmcp1f.f90"%eq% --libname=%fN%%ext%
$ if errorlevel 1 $abort Error compiling Fortran90 Library
$endIf
$ batInclude runme exnlp1 nlp
$ batInclude runme %N% mcp
$if set runC $batInclude runme %cN% mcp
$if set runF $batInclude runme %fN% mcp
display report;
* this totdist tolerance is pretty wide;
* we don't get a solution to full precision with the NLP solver.
* Compare the precision of the NLP to the MCP technique!
if ((totdist < 1.0E-4),
display "@@@@ #Test passed.";
else
abort totdist, "@@@@ #Test not passed. Inspect exmcp1.lst for details.";
);