Description
This test checks that the singleton sets can be used as expected, especially if they are both refernced and assigned inside a loop. Note that there is more than the assignment statement to do the later: clear, kill, projection, matching, execute_load, ... Contributor: Lutz Westermann, February 2015
Small Model of Type : GAMS
Category : GAMS Test library
Main file : single04.gms
$title 'Check handling of singleton sets assigned and referenced in a loop' (SINGLE04,SEQ=677)
$onText
This test checks that the singleton sets can be used as expected, especially if
they are both refernced and assigned inside a loop. Note that there is more than
the assignment statement to do the later: clear, kill, projection, matching,
execute_load, ...
Contributor: Lutz Westermann, February 2015
$offText
set i /i1*i3/
j /j1*j3/
k /k1*k3/
l /l1*l3/;
singleton set si(i) /i2/
sj(j) /j3/
sk(k) /k2/
sl(l) /l2/
sij(i,j) /i2.j2/
sjk(j,k) /j2.k2/
skl(k,l) /k2.l2/ ;
parameter pi(i)
pii(i,i)
pij(i,j)
pijk(i,j,k)
pijkl(i,j,k,l);
alias (i,a);
pi(i) = ord(i);
pij(i,j) = 10 *ord(i)+ ord(j);
pii(i,a) = 10 *ord(i)+ ord(a);
pijk(i,j,k) = 100 *ord(i)+10 *ord(j)+ ord(k);
pijkl(i,j,k,l) = 1000*ord(i)+100*ord(j)+10*ord(k)+ord(l);
scalar x,y,z;
loop(i,
x = sum(j,pij(si,j));
y = sum(j,sum(si,pij(si,j)));
);
abort$(x<>y) 'Unexpected difference',x,y;
loop(i,
x = sum(j,pij(si,j));
y = sum(j,sum(si,pij(si,j)));
si(i)=yes;
);
abort$(x<>y) 'Unexpected difference',x,y;
loop(i,
x = sum(j,pij(si,j));
y = sum(j,sum(si,pij(si,j)));
option clear=si;
);
abort$(x<>y) 'Unexpected difference',x,y;
si('i3') = yes;
loop(i,
x = sum(j,pij(si,j));
y = sum(j,sum(si,pij(si,j)));
option kill=si;
);
abort$(x<>y) 'Unexpected difference',x,y;
option StrictSingleton=0;
loop(i,
option si<pii;
x = sum(j,pij(si,j));
y = sum(j,sum(si,pij(si,j)));
);
abort$(x<>y) 'Unexpected difference',x,y;
loop(i,
option si<=pii;
x = sum(j,pij(si,j));
y = sum(j,sum(si,pij(si,j)));
);
abort$(x<>y) 'Unexpected difference',x,y;
loop(i,
option sij(i:j);
x = pij(sij);
y = sum(sij,pij(sij));
);
abort$(x<>y) 'Unexpected difference',x,y;
$onEcho > x.gms
Set j / j1*j3/
Singleton Set sj / j2 /;
$offEcho
$call gams x.gms lo=%GAMS.lo% gdx x
$if errorlevel 1 $abort Error running x.gms
loop(i,
x = pij(si,sj);
y = sum((si,sj),pij(si,sj));
execute_load 'x.gdx', sj;
);
abort$(x<>y) 'Unexpected difference',x,y;
Singleton Set ii(i) / /;
x = 0;
loop(i,
x$sameas(i,ii)=x+1;
ii('i2') = yes;
);
y = sum(i$sameas(i,'i2'),1);
abort$(x<>y) 'Unexpected difference',x,y;
x = 0;
y = 0;
loop((i,j),
if(sameas(i,'i2'), sj('j1') = yes; );
if(sameas(j,'j2'), sj(j) = yes; );
x$sameas(j, sj) = x+1;
loop(sj,
if(sameas(j, sj), y = y+1);
);
);
abort$(x<>y) 'Unexpected difference',x,y;