vi_mcp.gms : Identical models specified using MCP and VI syntax

Description

Demonstrate that a RVI (rectangular VI) is equivalent to MCP

Contributor: Steven Dirkse, August 2013


Small Model of Type : VI


Category : GAMS EMP library


Main file : vi_mcp.gms   includes :  qpdata.inc [html]

$title Identical models specified using MCP and VI syntax (VI_MCP,SEQ=98)

$ontext

Demonstrate that a RVI (rectangular VI) is equivalent to MCP

Contributor: Steven Dirkse, August 2013

$offtext

$include qpdata.inc

* ----------- STEP 0: solve QP as a QP
* solve
*   min   1/2 xQx + cx
*   s.t.  Ax >= b
*           x >=0

option nlp = conopt;
solve mqp using nlp min z;
abort$[mqp.solvestat <> %solvestat.NormalCompletion%] 'mqp not solved', mqp.solvestat;
abort$[mqp.modelstat  > %modelstat.LocallyOptimal%] 'mqp not solved', mqp.modelstat;


* ----------- STEP 1: formulate KKT conditions of the QP using MCP -----------
positive variable u(i);
equation dLdx(j);
dLdx(j) .. sum{jj, Q(j,jj)*x(jj)} + c(j) - sum{i, u(i)*A(i,j)} =N= 0;

model kkt / dLdx.x, g.u /;

file pathopt / 'path.opt' /;
putclose pathopt 'preprocess no'
               / 'crash_iteration_limit 0'
               / 'major_iteration_limit 0'
               /;
kkt.optfile = 1;
u.l(i) = g.m(i);
solve kkt using mcp;
abort$[kkt.solvestat <> %solvestat.NormalCompletion%] 'kkt not solved', kkt.solvestat;
abort$[kkt.modelstat <> %modelstat.Optimal%] 'kkt not solved', kkt.modelstat;
abort$[kkt.iterusd <> 0]  'expected to start at a solution', kkt.iterusd;

file copt / 'convert.opt' /;
putclose copt 'gams mcpScalar.gms'
            / 'dict mcpDict.txt'
            /;
option mcp=convert;
solve kkt using mcp;
option mcp=default;


* ----------- STEP 2: formulate the MCP from step 1 using VI -----------
* an MCP(F,B) (where B is the box [L,U]) is identical to VI(F,B)

model vi / dLdx, g /;

file jopt / 'jams.opt' /;
putclose jopt 'fileName viScalar.gms'
            / 'dict viDict.txt'
            /;

file empinfo / '%emp.info%' /;
putclose empinfo 'VI dLdx x  g u' / ;

vi.optfile = 1;
solve vi using emp;
abort$[vi.solvestat <> %solvestat.NormalCompletion%] 'VI not solved', vi.solvestat;
abort$[vi.iterusd <> 0]  'expected to start at a solution', vi.iterusd;


execute 'rm -f path.opt convert.opt mcpScalar.??? mcpDict.txt'
execute 'rm -f jams.opt viScalar.??? vi?calarpf.pf viDict.txt empinfo.txt'