zerofunc.gms : Match unmatched vars with zero functions in VI

Description

```If the feasible set is defined in terms of variables that don't appear
in the VI function F, we should not need to mention these variables
explicitly in a match.  Any unmatched variable will be treated as
matched to the zero function.  The optimization analogy is variables
that appear in the constraints but not in the objective.  We
test/define the proper behavior in this model.

Contributor: Steven Dirkse, February 2009
```

Small Model of Type : VI

Category : GAMS EMP library

Main file : zerofunc.gms

``````\$title Match unmatched vars with zero functions in VI (ZEROFUNC,SEQ=18)

\$ontext

If the feasible set is defined in terms of variables that don't appear
in the VI function F, we should not need to mention these variables
explicitly in a match.  Any unmatched variable will be treated as
matched to the zero function.  The optimization analogy is variables
that appear in the constraints but not in the objective.  We
test/define the proper behavior in this model.

Contributor: Steven Dirkse, February 2009

\$offtext

\$ontext
First we define an NLP in two variables, then write down the MCP version,
then write down the VI version.

General case                       Specific case
NLP: min f(x)                           1/3 y^3
s.t. g(x) >= 0                      y >= sqr(z)
L <= x <= U                     y, z free

MCP: take derivatives of Lagrangian function wrt x,u
dfdx - u * dgdx  perpto x          y^2 - u*1  perpto y free
0   + u*2z perpto z free
g(x)             perpto u >= 0     y - sqr(z) perpto u >= 0

VI:  F(x) := dfdx,                      F_y := y^2
F_z := 0
X = {x:g(x) >= 0, L <= x <= U }        y >= sqr(z), y, z in bounds

All of this to show/test that it is not necessary to include the pair
F_z.z in the model statement, and that since z is not mentioned
explicitly in a match, it is matched with the zero function.
\$offtext

free variables y, z;
free variable obj;
equation objDef, gCons;

objDef..  obj =E= power(y,3) / 3;
gCons..   y   =G= sqr(z);

model mNLP / objDef, gCons /;
solve mNLP min obj using nlp;

positive variable u 'explicit multiplier for MCP';
u.l = gCons.m;
equations
dLdy, dLdz,
dLdu;

dLdy..  sqr(y)     - u     =N= 0;
dLdz..  0          - u*2*z =N= 0;
dLdu..  y - sqr(z)         =N= 0;

model mMCP / dLdy.y, dLdz.z, dLdu.u /;
solve mMCP using mcp;
abort\$[mMCP.iterusd > 0] 'should have started at MCP solution!';

equations
F_y 'dfdy'
F_z 'dfdz'
;
F_y.. sqr(y) =N= 0;
F_z.. 0 =N= 0;

model mVI / F_y, gCons /;
model mVI0 / F_z, F_y, gCons /;

\$ontext
N.B.: we test 7 equivalent ways to specify the same VI.  Each includes
the pair F_y.y, this is not optional.
1) minimal empinfo file giving required info only
assumes z is in the model and is perp to 0-func,
assumes gCons defines the feasible set for the VI
2) specify explicitly that z is in the VI, assumed to be perp to 0-func,
assumes gCons defines the feasible set for the VI
3) specify explicitly that z is in the VI, assumed to be perp to 0-func,
explicitly that gCons defines the feasible set for the VI
4) specify explicitly that z is in the VI and perp to F_z := 0,
assumes gCons defines the feasible set for the VI
5) specify explicitly that z is in the VI and perp to F_z := 0,
explicitly that gCons defines the feasible set for the VI
6) specify explicitly that z is in the VI and perp to "0",
assumes gCons defines the feasible set for the VI
7) specify explicitly that z is in the VI and perp to "0",
explicitly that gCons defines the feasible set for the VI

Cases 6 and 7 use EMP info file syntax introduced with GAMS 25.1.

For this trivial case of a single VI these differences are not
important, but when combining VI models and max/min models as
different agents in an equilibrium model the differences do matter.
\$offtext

file myinfo / '%emp.info%' /;

* case 1)
putclose myinfo  'vi  F_y y' /;
solve mVI using emp;
abort\$[mVI.modelStat <> %MODELSTAT.LOCALLY OPTIMAL%] 'VI should solve OK';
abort\$[mVI.solveStat <> %SOLVESTAT.NORMAL COMPLETION%] 'VI should solve OK';
abort\$[mVI.iterusd > 0] 'should have started at VI solution!';

* case 2)
putclose myinfo  'vi  z  F_y y' /;
solve mVI using emp;
abort\$[mVI.modelStat <> %MODELSTAT.LOCALLY OPTIMAL%] 'VI should solve OK';
abort\$[mVI.solveStat <> %SOLVESTAT.NORMAL COMPLETION%] 'VI should solve OK';
abort\$[mVI.iterusd > 0] 'should have started at VI solution!';

* case 3)
putclose myinfo  'vi  z  F_y y  gCons' /;
solve mVI using emp;
abort\$[mVI.modelStat <> %MODELSTAT.LOCALLY OPTIMAL%] 'VI should solve OK';
abort\$[mVI.solveStat <> %SOLVESTAT.NORMAL COMPLETION%] 'VI should solve OK';
abort\$[mVI.iterusd > 0] 'should have started at VI solution!';

* case 4)
putclose myinfo  'vi  F_z z  F_y y' /;
solve mVI0 using emp;
abort\$[mVI0.modelStat <> %MODELSTAT.LOCALLY OPTIMAL%] 'VI should solve OK';
abort\$[mVI0.solveStat <> %SOLVESTAT.NORMAL COMPLETION%] 'VI should solve OK';
abort\$[mVI0.iterusd > 0] 'should have started at VI solution!';

* case 5)
putclose myinfo  'vi  F_z z  F_y y  gCons' /;
solve mVI0 using emp;
abort\$[mVI0.modelStat <> %MODELSTAT.LOCALLY OPTIMAL%] 'VI should solve OK';
abort\$[mVI0.solveStat <> %SOLVESTAT.NORMAL COMPLETION%] 'VI should solve OK';
abort\$[mVI0.iterusd > 0] 'should have started at VI solution!';

* case 6)
putclose myinfo  'vi  0 z  F_y y' /;
solve mVI using emp;
abort\$[mVI.modelStat <> %MODELSTAT.LOCALLY OPTIMAL%] 'VI should solve OK';
abort\$[mVI.solveStat <> %SOLVESTAT.NORMAL COMPLETION%] 'VI should solve OK';
abort\$[mVI.iterusd > 0] 'should have started at VI solution!';

* case 7)
putclose myinfo  'vi  0 z  F_y y  gCons' /;
solve mVI using emp;
abort\$[mVI.modelStat <> %MODELSTAT.LOCALLY OPTIMAL%] 'VI should solve OK';
abort\$[mVI.solveStat <> %SOLVESTAT.NORMAL COMPLETION%] 'VI should solve OK';
abort\$[mVI.iterusd > 0] 'should have started at VI solution!';
``````