$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 siy) '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;