$title 'Test JAMS/EMP on QVI model' (EMP28,SEQ=742) $onText Test JAMS behavior on a small QVI model. Contributors: Youngdae Kim & Steve Dirkse, Feb 2018 $offText $if not set TESTTOL $set TESTTOL 1e-6 scalars tol / %TESTTOL% /; file opt / 'jams.opt' /; file info / '%emp.info%' /; set i / 1*2 /; alias(i,j); table A(i,j) 1 2 1 2 [8/3] 2 [5/4] 2 ; parameters b(i) / 1 [100/3], 2 22.5 / Cy(i,j) / 1.1 1, 2.2 1 / Cx(i,j) / 1.2 1, 2.1 1 / rhs(i) / 1 15, 2 20 / ; variables y(j), x(j); equations F(i), g(i); F(i).. sum(j, A(i,j)*y(j)) - b(i) =N= 0; g(i).. sum(j, Cy(i,j)*y(j)) + sum(j, Cx(i,j)*x(j)) - rhs(i) =L= 0; model m / F, g /; * Test QVI. putclose info 'qvi F y x g'; putclose opt 'Dict qviDict.txt' / 'FileName qvi.gms' ; y.lo(j) = 0; y.up(j) = 11; x.lo(j) = 0; x.up(j) = 11; m.optfile = 1; solve m using emp; abort$[m.solvestat <> %solveStat.normalCompletion%] 'wrong m.solvestat', m.solvestat; abort$[m.modelstat <> %modelStat.optimal%] 'wrong m.modelstat', m.modelstat; abort$[ abs(y.l('1')- 10) > tol ] 'bad y.l("1")', y.l; abort$[ abs(y.l('2')- 5) > tol ] 'bad y.l("2")', y.l; abort$[ abs(x.l('1')- 10) > tol ] 'bad x.l("1")', x.l; abort$[ abs(x.l('2')- 5) > tol ] 'bad x.l("2")', x.l; abort$[ smax{i, abs(g.m(i)- 0)} > tol ] 'bad g.m("i")', g.m; y.l(j) = 0; x.l(j) = 0; g.m(i) = 0; $onEcho > qvi_gms *********************************************** * written by GAMS/JAMS at 06/21/17 12:13:40 * for more information use JAMS option "Dict" *********************************************** Variables x1,x2,u3,u4; Negative Variables u3,u4; Positive Variables x1,x2; Equations e1,e2,e3,e4; e1.. 2*x1 + 2.66666666666667*x2 - u3 =N= 33.3333333333333; e2.. 1.25*x1 + 2*x2 - u4 =N= 22.5; e3.. x1 + x2 =L= 15; e4.. x2 + x1 =L= 20; * set non-default bounds x1.up = 11; x2.up = 11; Model m / e1.x1,e2.x2,e3.u3,e4.u4 /; m.limrow=0; m.limcol=0; Solve m using MCP; $offEcho execute 'grep -v " written by GAMS" qvi_gms > qvi.gms.want' execute 'grep -v " written by GAMS" qvi.gms > qvi.gms.got' execute '=diff -I reslim -bw qvi.gms.want qvi.gms.got' abort$errorlevel 'Files qvi.gms.want and qvi.gms.got differ'; $onEcho > qvi_dict * written by GAMS/JAMS at 06/21/17 11:08:51 ******************************************************************************** Contents 1 Content of EMP Information File 2 Processed EMP Information 3 Dictionary 3.1 Constraints 3.2 Variables ******************************************************************************** 1 Content of EMP Information File --------------------------------- 1:qvi F y x g 2 Processed EMP Information --------------------------- Number of VI functions specified = 2 * e1 is VI Func and perpendicular to x1 * e2 is VI Func and perpendicular to x2 3 Dictionary ------------ 3.1 Constraints --------------- e1 F(1) e2 F(2) e3 g(1) e4 g(2) 3.2 Variables -------------- x1 y(1) x2 y(2) x1 x(1) x2 x(2) u3 {new} u4 {new} $offEcho execute 'grep -v " written by GAMS" qvi_dict > qvidict.txt.want' execute 'grep -v " written by GAMS" qviDict.txt > qvidict.txt.got' execute '=diff -bw qvidict.txt.want qvidict.txt.got' abort$errorlevel 'Files qvidict.txt.want and qvidict.txt.got differ'; $exit * We changed the bound-checking code in EMP-QVI: it now expects the * bounds to be consistent, and it won't patch them up if this is not * the case. * Change the bounds to larger than the ones of the parameter variable. * In this case, we should adjust those bounds to be consistent with * the ones of the parameter variable, i.e., take the intersection. y.lo(j) = -10; y.up(j) = 20; putclose opt 'Dict qviBndDict.txt' / 'FileName qviBnd.gms' ; m.optfile = 1; solve m using emp; abort$[m.solvestat <> %solveStat.normalCompletion%] 'wrong m.solvestat', m.solvestat; abort$[m.modelstat <> %modelStat.optimal%] 'wrong m.modelstat', m.modelstat; abort$[ abs(y.l('1')- 10) > tol ] 'bad y.l("1")', y.l; abort$[ abs(y.l('2')- 5) > tol ] 'bad y.l("2")', y.l; abort$[ abs(x.l('1')- 10) > tol ] 'bad x.l("1")', x.l; abort$[ abs(x.l('2')- 5) > tol ] 'bad x.l("2")', x.l; abort$[ smax{i, abs(g.m(i)- 0)} > tol ] 'bad g.m("i")', g.m; $onEcho > qviBnd_gms *********************************************** * written by GAMS/JAMS at 06/21/17 12:13:40 * for more information use JAMS option "Dict" *********************************************** Variables x1,x2,u3,u4; Negative Variables u3,u4; Equations e1,e2,e3,e4; e1.. 2*x1 + 2.66666666666667*x2 - u3 =N= 33.3333333333333; e2.. 1.25*x1 + 2*x2 - u4 =N= 22.5; e3.. x1 + x2 =L= 15; e4.. x2 + x1 =L= 20; * set non-default bounds x1.lo = 0; x1.up = 11; x2.lo = 0; x2.up = 11; Model m / e1.x1,e2.x2,e3.u3,e4.u4 /; m.limrow=0; m.limcol=0; option bratio = 0; Solve m using MCP; $offEcho execute 'grep -v " written by GAMS" qviBnd_gms > qvi.gms.want' execute 'grep -v " written by GAMS" qviBnd.gms > qvi.gms.got' execute '=diff -I reslim -bw qvi.gms.want qvi.gms.got' abort$errorlevel 'Files qvi.gms.want and qvi.gms.got differ'; $onEcho > qviBnd_dict * written by GAMS/JAMS at 06/21/17 11:08:51 ******************************************************************************** Contents 1 Content of EMP Information File 2 Processed EMP Information 3 Dictionary 3.1 Constraints 3.2 Variables ******************************************************************************** 1 Content of EMP Information File --------------------------------- 1:qvi F y x g 2 Processed EMP Information --------------------------- Number of VI functions specified = 2 * e1 is VI Func and perpendicular to x1 * e2 is VI Func and perpendicular to x2 3 Dictionary ------------ 3.1 Constraints --------------- e1 F(1) e2 F(2) e3 g(1) e4 g(2) 3.2 Variables -------------- x1 y(1) x2 y(2) x1 x(1) x2 x(2) u3 {new} u4 {new} $offEcho execute 'grep -v " written by GAMS" qviBnd_dict > qvidict.txt.want' execute 'grep -v " written by GAMS" qviBndDict.txt > qvidict.txt.got' execute '=diff -bw qvidict.txt.want qvidict.txt.got' abort$errorlevel 'Files qvidict.txt.want and qvidict.txt.got differ';