Description
Test isolated implicit variable. In the example, z is an isolated implicit variable with respect to the first agent. The problem has a unique solution (x*,y*,z*,q*) = (0.5,2.25,2.25,0.25). Contributor: Youngdae Kim (09.10.2017)
Small Model of Type : GAMS
Category : GAMS Test library
Main file : selkie14.gms
$title 'SELKIE test suite: isolated implicit variable' (SELKIE14,SEQ=770)
$ontext
Test isolated implicit variable. In the example, z is an isolated implicit
variable with respect to the first agent.
The problem has a unique solution (x*,y*,z*,q*) = (0.5,2.25,2.25,0.25).
Contributor: Youngdae Kim (09.10.2017)
$offtext
$if not set TESTTOL $set TESTTOL 1e-4
scalar tol / %TESTTOL% /;
file opt / 'selkie.opt' /;
file info / '%emp.info%' /;
variable objx, objy, z, q;
positive variable x, y;
equation defobjx, implz, implq, defobjy;
defobjx..
objx =E= sqr(x-1) + q + 1;
implz..
z =E= sqr(x) + 2;
implq..
q =E= sqr(x);
defobjy..
objy =E= sqr(y-z) + 1;
model m / defobjx, implz, implq, defobjy /;
put info 'equilibrium';
put / 'implicit z implz';
put / 'implicit q implq';
put / 'min objx x z q defobjx';
put / 'min objy y defobjy';
putclose;
* Run without removing isolated implicit variables.
putclose opt 'remove_isolated_implvar no';
m.optfile = 1;
option emp = selkie;
solve m using emp;
abort$[ abs(x.l - 0.5) > tol ] 'bad x.l', x.l;
abort$[ abs(y.l - 2.25) > tol ] 'bad y.l', y.l;
abort$[ abs(z.l - 2.25) > tol ] 'bad z.l', z.l;
abort$[ abs(q.l - 0.25) > tol ] 'bad q.l', q.l;
abort$[ abs(objx.l - 1.5) > tol ] 'bad objx.l', objx.l;
abort$[ abs(objy.l - 1) > tol ] 'bad objy.l', objy.l;
$onecho > agent1_gms
Variables x1,x3,x4,x5;
Positive Variables x5;
Equations e1,e2,e3;
e1.. -sqr((-1) + x5) + x1 - x4 =E= 1;
e2.. -sqr(x5) + x3 =E= 2;
e3.. -sqr(x5) + x4 =E= 0;
Model m / e1,e2,e3 /;
Solve m using nlp minimizing x1;
$offecho
execute 'cat agent1_gms > agent1.gms.want';
execute 'cat "%gams.scrdir%agent1.gms" > agent1.gms.got';
execute '=diff -bw agent1.gms.want agent1.gms.got';
abort$errorlevel 'Files agent1.gms.want and agent1.gms.got differ';
$onecho > agent2_gms
Variables x2,x3,x6;
Positive Variables x6;
Equations e4;
e4.. -sqr(x6 - x3) + x2 =E= 1;
* fix levels belonging to other agents
x3.fx = 0;
Model m / e4 /;
Solve m using nlp minimizing x2;
$offecho
execute 'cat agent2_gms > agent2.gms.want';
execute 'cat "%gams.scrdir%agent2.gms" > agent2.gms.got';
execute '=diff -bw agent2.gms.want agent2.gms.got';
abort$errorlevel 'Files agent2.gms.want and agent2.gms.got differ';
x.l = 0; x.m = 0;
y.l = 0; y.m = 0;
z.l = 0; z.m = 0;
q.l = 0; q.m = 0;
objx.l = 0; objx.m = 0;
objy.l = 0; objy.m = 0;
defobjx.m = 0;
implz.m = 0;
implq.m = 0;
defobjy.m = 0;
* Run with isolated implicit variables removed.
putclose opt 'remove_isolated_implvar yes';
m.optfile = 1;
option emp = selkie;
solve m using emp;
abort$[ abs(x.l - 0.5) > tol ] 'bad x.l', x.l;
abort$[ abs(y.l - 2.25) > tol ] 'bad y.l', y.l;
abort$[ abs(z.l - 2.25) > tol ] 'bad z.l', z.l;
abort$[ abs(q.l - 0.25) > tol ] 'bad q.l', q.l;
abort$[ abs(objx.l - 1.5) > tol ] 'bad objx.l', objx.l;
abort$[ abs(objy.l - 1) > tol ] 'bad objy.l', objy.l;
$onecho > agent1_rm_gms
Variables x1,x4,x5;
Positive Variables x5;
Equations e1,e3;
e1.. -sqr((-1) + x5) + x1 - x4 =E= 1;
e3.. -sqr(x5) + x4 =E= 0;
Model m / e1,e3 /;
Solve m using nlp minimizing x1;
$offecho
execute 'cat agent1_rm_gms > agent1_rm.gms.want';
execute 'cat "%gams.scrdir%agent1.gms" > agent1_rm.gms.got';
execute '=diff -bw agent1_rm.gms.want agent1_rm.gms.got';
abort$errorlevel 'Files agent1_rm.gms.want and agent1_rm.gms.got differ';
$onecho > agent2_rm_gms
Variables x2,x3,x6;
Positive Variables x6;
Equations e4;
e4.. -sqr(x6 - x3) + x2 =E= 1;
* fix levels belonging to other agents
x3.fx = 0;
Model m / e4 /;
Solve m using nlp minimizing x2;
$offecho
execute 'cat agent2_rm_gms > agent2_rm.gms.want';
execute 'cat "%gams.scrdir%agent2.gms" > agent2_rm.gms.got';
execute '=diff -bw agent2_rm.gms.want agent2_rm.gms.got';
abort$errorlevel 'Files agent2_rm.gms.want and agent2_rm.gms.got differ';