$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 4 equivalent ways to specify the same VI. The VI statement always contains the matching pair "F_y y" and "gCons", the equation defining the constraint set. Each variant specifies the matching between the "z" variable and the zero mapping differently. 1) z appears right after the "vi" keyword: it is in the VI and perpendicular to 0 (null) functions. 2) z is matched with F_z := 0. 3) z is matched with "0", representing zero functions. 4) a variant of (3), where the order of the pair "0 z" and "F_y y" has been swapped. Cases 3 and 4 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 z F_y y gCons' /; solve mVI using emp; abort$[mVI.modelStat <> %modelStat.locallyOptimal%] 'VI should solve OK'; abort$[mVI.solveStat <> %solveStat.normalCompletion%] 'VI should solve OK'; abort$[mVI.iterusd > 0] 'should have started at VI solution!'; * case 2) putclose myinfo 'vi F_z z F_y y gCons' /; solve mVI0 using emp; abort$[mVI0.modelStat <> %modelStat.locallyOptimal%] 'VI should solve OK'; abort$[mVI0.solveStat <> %solveStat.normalCompletion%] 'VI should solve OK'; abort$[mVI0.iterusd > 0] 'should have started at VI solution!'; * case 3) putclose myinfo 'vi 0 z F_y y gCons' /; solve mVI using emp; abort$[mVI.modelStat <> %modelStat.locallyOptimal%] 'VI should solve OK'; abort$[mVI.solveStat <> %solveStat.normalCompletion%] 'VI should solve OK'; abort$[mVI.iterusd > 0] 'should have started at VI solution!'; * case 4) putclose myinfo 'vi F_y y 0 z gCons' /; solve mVI using emp; abort$[mVI.modelStat <> %modelStat.locallyOptimal%] 'VI should solve OK'; abort$[mVI.solveStat <> %solveStat.normalCompletion%] 'VI should solve OK'; abort$[mVI.iterusd > 0] 'should have started at VI solution!';