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;
solve lcpBad using mcp;