$title VI with dualvar specified for VI constraint (VIDUALVAR,SEQ=96) $onText Usually when we use the empinfo syntax dualvar x e it is for the case where e is a constraint in an optimization model, and we want to use the dual multiplier e.m (aka x) in our algebra. It is also possible to do this when e is a constraint in a VI, as we show here. This wasn't working in GAMS Distribution 24.1.1 and previous. Contributor: Dirkse & Ferris, June 2013 $offText $onText We'll specify a simple two-agent problem and then model it in EMP in several different ways. min v + w =: z s.t. sqr(v) + 2*w >= 1 perp-to u >= 0 v, w >= 0 VI: F_y() := y - 4*u - 1 perp-to y free To get a model with dualVar involving a constraint in a VI, we will rewrite the min agent as a VI. $offText positive variables v 'belongs to min agent' w 'belongs to min agent' u 'equivalenced to g.m' ; free variables y 'belongs to VI agent' z 'objective var' ; equations defz 'objective def' g 'constraint for min agent' Fy 'VI function' Dv 'Lagrangian deriv wrt v' Dw 'Lagrangian deriv wrt w' Fv 'VI function in opt-as-VI' Fw 'VI function in opt-as-VI' ; defz.. v+w =e= z; g .. sqrt(v+1) + 2*w =g= 2; Fy .. y =e= 4*u - 1; Dv .. 1 - (1/(v+1))*u =N= 0; Dw .. 1 - 2 *u =N= 0; Fv .. 1 =N= 0; Fw .. 1 =N= 0; model opt 'min agent and VI agent' / defz, g, Fy /; model vi 'VI agent and VI agent' / Fv, Fw, g, Fy /; model m 'explicit MCP' / Dv.v, Dw.w, g.u, Fy.y /; file jamsopt / 'jams.opt'/; file empinfo / '%emp.info%' /; putclose jamsopt 'FileName mcpOpt.gms' / 'Dict dictOpt.txt' / * 'debug 2' / ; putclose empinfo 'equilibrium' / ' min z v w defz g' / ' vi Fy y' / ' dualvar u g' / ; opt.optfile = 1; opt.iterlim = 0; defz.m = -1; g.m = 0.5; Fy.m = 1; v.l = 0; w.l = 0.5; y.l = 1; u.l = 0.5; solve opt using emp; abort$[opt.modelStat <> %modelStat.locallyOptimal%] 'Opt should solve OK in zero iters'; abort$[opt.solveStat <> %solveStat.normalCompletion%] 'Opt should solve OK in zero iters'; m.iterlim = 0; solve m using mcp; abort$[m.modelStat > %modelStat.locallyOptimal%] 'm should solve OK in zero iters'; abort$[m.solveStat <> %solveStat.normalCompletion%] 'm should solve OK in zero iters'; putclose jamsopt 'FileName mcpVI.gms' / 'Dict dictVI.txt' / * 'debug 2' / ; putclose empinfo 'equilibrium' / ' vi Fv v Fw w g' / ' vi Fy y' / ' dualvar u g' / ; vi.optfile = 1; vi.iterlim = 0; solve vi using emp; abort$[vi.modelStat <> %modelStat.locallyOptimal%] 'VI should solve OK in zero iters'; abort$[vi.solveStat <> %solveStat.normalCompletion%] 'VI should solve OK in zero iters';