mcp07.gms : Test level/marginal correctness and conventions for MCP

Description

```For MCP models with free variables and equality constraints, the matching
between these can be seen as somewhat arbitrary or even unnecessary.
However, the "right" match may arise naturally from the model,
and the matching used may make a difference to a solver.

This model illustrates a case where the solver prefers one matching
over another.  It is not a coincidence that the preferred matching is the
natural one for the KKT conditions.

Contributor: Steve Dirkse, April 2008.  Model obtained from Michael Ferris.
```

Small Model of Type : MCP

Category : GAMS Test library

Main file : mcp07.gms

``````\$title 'Example MCP where explicit matching helps the solver' (MCP07,SEQ=389)

\$ontext

For MCP models with free variables and equality constraints, the matching
between these can be seen as somewhat arbitrary or even unnecessary.
However, the "right" match may arise naturally from the model,
and the matching used may make a difference to a solver.

This model illustrates a case where the solver prefers one matching
over another.  It is not a coincidence that the preferred matching is the
natural one for the KKT conditions.

Contributor: Steve Dirkse, April 2008.  Model obtained from Michael Ferris.
\$offtext

set I / i1 * i2 /;
set J / j1 * j5 /;

table A(I,J)
j1        j2        j3        j4        j5
i1       0.609209  0.189873  0.921892  0.957156  0.105726
i2       0.714106  0.551532  0.263135  0.349604  0.407247
;

positive variables x(J);
variables u(I);
variable z;

equations
eq1(I) 'equality constraints'
cost;

eq1(I)..  sum {J, A(I,J)*x(J)} =E= 1;
cost..    z =E= sum {J, x(J)};

model mlp / eq1, cost /;
solve mlp min z using lp;

equation
permdLdx(J) 'permute the default matching'
dLdx(J)
;

dLdx(J)     .. 1 - sum{I, u(I) * A(I,J)} =N= 0;
permdLdx(J) .. 1 - sum{I, u(I++1) * A(I,J)} =N= 0;

model lcpGood 'normal matching, identical to default' / dLdx.x, eq1.u /;
model lcpBad 'permuted matching: still legal and valid' / permdLdx.x, eq1.u /;

* u.l(I) = eq1.m(I);
x.m(J) = 0;  x.l(J) = 0;  u.m(I) = 0;  u.l(I) = 0;
dLdx.m(J) = 0;  eq1.m(I) = 0;
solve lcpGood using mcp;

x.m(J) = 0;  x.l(J) = 0;  u.m(I) = 0;  u.l(I) = 0;
permdLdx.m(J) = 0;  eq1.m(I) = 0;