Description
Keyword: break, continue Contributor: Lutz Westermann, May 2017
Small Model of Type : GAMS
Category : GAMS Test library
Main file : breakcont2.gms
$title 'Advanced test for break and continue statements' (BREAKCONT2,SEQ=731)
$onText
Keyword: break, continue
Contributor: Lutz Westermann, May 2017
$offText
set i /i1*i10/
j /j1*j10/
k /k1*k10/
l /l1*l10/
ij(i,j) /#i:#j /;
scalar cnt1, cnt2, cnt3, cnt4, cnt5, cnt6, cnt7, cntFor, cntWhile;
parameter dummy(i)
p(i,j) /#i:#j 2/;
$macro inc(x) x=x+1
cnt1=0;
loop(j,
dummy('i5')=1;
inc(cnt1);
);
abort$(cnt1<>10) 'Error 1';
cnt1=0; cnt2=0;
loop(j,
dummy('i5')=1;
inc(cnt1);
break;
inc(cnt2);
);
abort$(cnt1<>1) 'Error 2a';
abort$(cnt2<>0) 'Error 2b';
cnt1=0; cnt2=0;
loop(j,
dummy('i5')=1;
inc(cnt1);
continue;
inc(cnt2);
);
abort$(cnt1<>10) 'Error 3a';
abort$(cnt2<>0 ) 'Error 3b';
cnt1=0;
loop(i('i5'),
inc(cnt1);
);
abort$(cnt1<>1) 'Error 4';
cnt1=0; cnt2=0;
loop(i('i5'),
inc(cnt1);
break;
inc(cnt2);
);
abort$(cnt1<>1) 'Error 5a';
abort$(cnt2<>0) 'Error 5b';
cnt1=0; cnt2=0;
loop(i('i5'),
inc(cnt1);
continue;
inc(cnt2);
);
abort$(cnt1<>1) 'Error 6a';
abort$(cnt2<>0) 'Error 6b';
cnt1=0;
loop(ij,
inc(cnt1);
);
abort$(cnt1<>10) 'Error 7';
cnt1=0; cnt2=0;
loop(ij,
inc(cnt1);
break;
inc(cnt2);
);
abort$(cnt1<>1) 'Error 8a';
abort$(cnt2<>0) 'Error 8b';
cnt1=0; cnt2=0;
loop(ij,
inc(cnt1);
continue;
inc(cnt2);
);
abort$(cnt1<>10) 'Error 9a';
abort$(cnt2<>0 ) 'Error 9b';
cnt1=0;
loop(ij(i,j),
inc(cnt1);
);
abort$(cnt1<>10) 'Error 10';
cnt1=0; cnt2=0;
loop(ij(i,j),
inc(cnt1);
break;
inc(cnt2);
);
abort$(cnt1<>1) 'Error 11a';
abort$(cnt2<>0) 'Error 11b';
cnt1=0; cnt2=0;
loop(ij(i,j),
inc(cnt1);
continue;
inc(cnt2);
);
abort$(cnt1<>10) 'Error 12a';
abort$(cnt2<>0 ) 'Error 12b';
cnt1=0;
loop((i,j),
inc(cnt1);
);
abort$(cnt1<>100) 'Error 13';
cnt1=0; cnt2=0;
loop((i,j),
inc(cnt1);
break;
inc(cnt2);
);
abort$(cnt1<>1) 'Error 14a';
abort$(cnt2<>0) 'Error 14b';
cnt1=0; cnt2=0;
loop((i,j),
inc(cnt1);
continue;
inc(cnt2);
);
abort$(cnt1<>100) 'Error 15a';
abort$(cnt2<>0 ) 'Error 15b';
cnt1=0;
loop((i,j)$p(i,j),
inc(cnt1);
);
abort$(cnt1<>10) 'Error 16';
cnt1=0; cnt2=0;
loop((i,j)$p(i,j),
inc(cnt1);
break;
inc(cnt2);
);
abort$(cnt1<>1) 'Error 17a';
abort$(cnt2<>0) 'Error 17b';
cnt1=0; cnt2=0;
loop((i,j)$p(i,j),
inc(cnt1);
continue;
inc(cnt2);
);
abort$(cnt1<>10) 'Error 18a';
abort$(cnt2<>0 ) 'Error 18b';
ij(i,j)=yes;
p (i,j)=3;
cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0;
loop(i,
inc(cnt1);
cntWhile=0;
while(cntWhile<10,
inc(cntWhile);
inc(cnt2);
loop(k('k5'),
inc(cnt3);
loop(ij(i,j)$p(i,j),
inc(cnt4);
loop(l('l6'),
inc(cnt5);
for(cntFor=1 to 10,
inc(cnt6);
);
);
);
);
);
);
abort$(cnt1<>10 ) 'Error 19a';
abort$(cnt2<>100 ) 'Error 19b';
abort$(cnt3<>100 ) 'Error 19c';
abort$(cnt4<>1000 ) 'Error 19d';
abort$(cnt5<>1000 ) 'Error 19e';
abort$(cnt6<>10000) 'Error 19f';
cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0;
loop(i,
inc(cnt1);
cntWhile=0;
while(cntWhile<10,
inc(cntWhile);
inc(cnt2);
loop(k('k5'),
inc(cnt3);
loop(ij(i,j)$p(i,j),
inc(cnt4);
loop(l('l6'),
inc(cnt5);
for(cntFor=1 to 10,
inc(cnt6);
continue;
inc(cnt7);
);
);
);
);
);
);
abort$(cnt1<>10 ) 'Error 20a';
abort$(cnt2<>100 ) 'Error 20b';
abort$(cnt3<>100 ) 'Error 20c';
abort$(cnt4<>1000 ) 'Error 20d';
abort$(cnt5<>1000 ) 'Error 20e';
abort$(cnt6<>10000) 'Error 20f';
abort$(cnt7<>0 ) 'Error 20g';
cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0;
loop(i,
inc(cnt1);
cntWhile=0;
while(cntWhile<10,
inc(cntWhile);
inc(cnt2);
loop(k('k5'),
inc(cnt3);
loop(ij(i,j)$p(i,j),
inc(cnt4);
loop(l('l6'),
inc(cnt5);
for(cntFor=1 to 10,
inc(cnt6);
break;
inc(cnt7);
);
);
);
);
);
);
abort$(cnt1<>10 ) 'Error 21a';
abort$(cnt2<>100 ) 'Error 21b';
abort$(cnt3<>100 ) 'Error 21c';
abort$(cnt4<>1000) 'Error 21d';
abort$(cnt5<>1000) 'Error 21e';
abort$(cnt6<>1000) 'Error 21f';
abort$(cnt7<>0 ) 'Error 21g';
cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0;
loop(i,
inc(cnt1);
cntWhile=0;
while(cntWhile<10,
inc(cntWhile);
inc(cnt2);
loop(k('k5'),
inc(cnt3);
loop(ij(i,j)$p(i,j),
inc(cnt4);
loop(l('l6'),
inc(cnt5);
for(cntFor=1 to 10,
inc(cnt6);
break 2;
inc(cnt7);
);
);
);
);
);
);
abort$(cnt1<>10 ) 'Error 22a';
abort$(cnt2<>100 ) 'Error 22b';
abort$(cnt3<>100 ) 'Error 22c';
abort$(cnt4<>1000) 'Error 22d';
abort$(cnt5<>1000) 'Error 22e';
abort$(cnt6<>1000) 'Error 22f';
abort$(cnt7<>0 ) 'Error 22g';
cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0;
loop(i,
inc(cnt1);
cntWhile=0;
while(cntWhile<10,
inc(cntWhile);
inc(cnt2);
loop(k('k5'),
inc(cnt3);
loop(ij(i,j)$p(i,j),
inc(cnt4);
loop(l('l6'),
inc(cnt5);
for(cntFor=1 to 10,
inc(cnt6);
break 3;
inc(cnt7);
);
);
);
);
);
);
abort$(cnt1<>10 ) 'Error 23a';
abort$(cnt2<>100) 'Error 23b';
abort$(cnt3<>100) 'Error 23c';
abort$(cnt4<>100) 'Error 23d';
abort$(cnt5<>100) 'Error 23e';
abort$(cnt6<>100) 'Error 23f';
abort$(cnt7<>0 ) 'Error 23g';
cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0;
loop(i,
inc(cnt1);
cntWhile=0;
while(cntWhile<10,
inc(cntWhile);
inc(cnt2);
loop(k('k5'),
inc(cnt3);
loop(ij(i,j)$p(i,j),
inc(cnt4);
loop(l('l6'),
inc(cnt5);
for(cntFor=1 to 10,
inc(cnt6);
break 4;
inc(cnt7);
);
);
);
);
);
);
abort$(cnt1<>10 ) 'Error 24a';
abort$(cnt2<>100) 'Error 24b';
abort$(cnt3<>100) 'Error 24c';
abort$(cnt4<>100) 'Error 24d';
abort$(cnt5<>100) 'Error 24e';
abort$(cnt6<>100) 'Error 24f';
abort$(cnt7<>0 ) 'Error 24g';
cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0;
loop(i,
inc(cnt1);
cntWhile=0;
while(cntWhile<10,
inc(cntWhile);
inc(cnt2);
loop(k('k5'),
inc(cnt3);
loop(ij(i,j)$p(i,j),
inc(cnt4);
loop(l('l6'),
inc(cnt5);
for(cntFor=1 to 10,
inc(cnt6);
break 5;
inc(cnt7);
);
);
);
);
);
);
abort$(cnt1<>10) 'Error 25a';
abort$(cnt2<>10) 'Error 25b';
abort$(cnt3<>10) 'Error 25c';
abort$(cnt4<>10) 'Error 25d';
abort$(cnt5<>10) 'Error 25e';
abort$(cnt6<>10) 'Error 25f';
abort$(cnt7<>0 ) 'Error 25g';
cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0;
loop(i,
inc(cnt1);
cntWhile=0;
while(cntWhile<10,
inc(cntWhile);
inc(cnt2);
loop(k('k5'),
inc(cnt3);
loop(ij(i,j)$p(i,j),
inc(cnt4);
loop(l('l6'),
inc(cnt5);
for(cntFor=1 to 10,
inc(cnt6);
break 6;
inc(cnt7);
);
);
);
);
);
);
abort$(cnt1<>1) 'Error 26a';
abort$(cnt2<>1) 'Error 26b';
abort$(cnt3<>1) 'Error 26c';
abort$(cnt4<>1) 'Error 26d';
abort$(cnt5<>1) 'Error 26e';
abort$(cnt6<>1) 'Error 26f';
abort$(cnt7<>0) 'Error 26g';
ij(i,j)=ord(i)<=2 and ord(j)<=2;
p (i,j)=4$ij(i,j);
Equation e;
Variable v;
e.. v =e= 1;
model m /e/;
cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0;
loop(i$(ord(i)<=2),
inc(cnt1);
cntWhile=0;
while(cntWhile<2,
inc(cntWhile);
inc(cnt2);
loop(k('k5'),
inc(cnt3);
loop(ij(i,j)$p(i,j),
inc(cnt4);
loop(l('l6'),
inc(cnt5);
for(cntFor=1 to 2,
inc(cnt6);
solve m min v use lp;
);
);
);
);
);
);
abort$(cnt1<>2 ) 'Error 27a';
abort$(cnt2<>4 ) 'Error 27b';
abort$(cnt3<>4 ) 'Error 27c';
abort$(cnt4<>8 ) 'Error 27d';
abort$(cnt5<>8 ) 'Error 27e';
abort$(cnt6<>16) 'Error 27f';
cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0;
loop(i$(ord(i)<=2),
inc(cnt1);
cntWhile=0;
while(cntWhile<2,
inc(cntWhile);
inc(cnt2);
loop(k('k5'),
inc(cnt3);
loop(ij(i,j)$p(i,j),
inc(cnt4);
loop(l('l6'),
inc(cnt5);
for(cntFor=1 to 2,
inc(cnt6);
solve m min v use lp;
continue;
inc(cnt7);
);
);
);
);
);
);
abort$(cnt1<>2 ) 'Error 28a';
abort$(cnt2<>4 ) 'Error 28b';
abort$(cnt3<>4 ) 'Error 28c';
abort$(cnt4<>8 ) 'Error 28d';
abort$(cnt5<>8 ) 'Error 28e';
abort$(cnt6<>16) 'Error 28f';
abort$(cnt7<>0 ) 'Error 28g';
cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0;
loop(i$(ord(i)<=2),
inc(cnt1);
cntWhile=0;
while(cntWhile<2,
inc(cntWhile);
inc(cnt2);
loop(k('k5'),
inc(cnt3);
loop(ij(i,j)$p(i,j),
inc(cnt4);
loop(l('l6'),
inc(cnt5);
for(cntFor=1 to 2,
inc(cnt6);
solve m min v use lp;
break;
inc(cnt7);
);
);
);
);
);
);
abort$(cnt1<>2) 'Error 29a';
abort$(cnt2<>4) 'Error 29b';
abort$(cnt3<>4) 'Error 29c';
abort$(cnt4<>8) 'Error 29d';
abort$(cnt5<>8) 'Error 29e';
abort$(cnt6<>8) 'Error 29f';
abort$(cnt7<>0) 'Error 29g';
cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0;
loop(i$(ord(i)<=2),
inc(cnt1);
cntWhile=0;
while(cntWhile<2,
inc(cntWhile);
inc(cnt2);
loop(k('k5'),
inc(cnt3);
loop(ij(i,j)$p(i,j),
inc(cnt4);
loop(l('l6'),
inc(cnt5);
for(cntFor=1 to 2,
inc(cnt6);
solve m min v use lp;
break 2;
inc(cnt7);
);
);
);
);
);
);
abort$(cnt1<>2) 'Error 30a';
abort$(cnt2<>4) 'Error 30b';
abort$(cnt3<>4) 'Error 30c';
abort$(cnt4<>8) 'Error 30d';
abort$(cnt5<>8) 'Error 30e';
abort$(cnt6<>8) 'Error 30f';
abort$(cnt7<>0) 'Error 30g';
cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0;
loop(i$(ord(i)<=2),
inc(cnt1);
cntWhile=0;
while(cntWhile<2,
inc(cntWhile);
inc(cnt2);
loop(k('k5'),
inc(cnt3);
loop(ij(i,j)$p(i,j),
inc(cnt4);
loop(l('l6'),
inc(cnt5);
for(cntFor=1 to 2,
inc(cnt6);
solve m min v use lp;
break 3;
inc(cnt7);
);
);
);
);
);
);
abort$(cnt1<>2) 'Error 31a';
abort$(cnt2<>4) 'Error 31b';
abort$(cnt3<>4) 'Error 31c';
abort$(cnt4<>4) 'Error 31d';
abort$(cnt5<>4) 'Error 31e';
abort$(cnt6<>4) 'Error 31f';
abort$(cnt7<>0) 'Error 31g';
cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0;
loop(i$(ord(i)<=2),
inc(cnt1);
cntWhile=0;
while(cntWhile<2,
inc(cntWhile);
inc(cnt2);
loop(k('k5'),
inc(cnt3);
loop(ij(i,j)$p(i,j),
inc(cnt4);
loop(l('l6'),
inc(cnt5);
for(cntFor=1 to 2,
inc(cnt6);
solve m min v use lp;
break 4;
inc(cnt7);
);
);
);
);
);
);
abort$(cnt1<>2) 'Error 32a';
abort$(cnt2<>4) 'Error 32b';
abort$(cnt3<>4) 'Error 32c';
abort$(cnt4<>4) 'Error 32d';
abort$(cnt5<>4) 'Error 32e';
abort$(cnt6<>4) 'Error 32f';
abort$(cnt7<>0) 'Error 32g';
cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0;
loop(i$(ord(i)<=2),
inc(cnt1);
cntWhile=0;
while(cntWhile<2,
inc(cntWhile);
inc(cnt2);
loop(k('k5'),
inc(cnt3);
loop(ij(i,j)$p(i,j),
inc(cnt4);
loop(l('l6'),
inc(cnt5);
for(cntFor=1 to 2,
inc(cnt6);
solve m min v use lp;
break 5;
inc(cnt7);
);
);
);
);
);
);
abort$(cnt1<>2) 'Error 33a';
abort$(cnt2<>2) 'Error 33b';
abort$(cnt3<>2) 'Error 33c';
abort$(cnt4<>2) 'Error 33d';
abort$(cnt5<>2) 'Error 33e';
abort$(cnt6<>2) 'Error 33f';
abort$(cnt7<>0) 'Error 33g';
cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0;
loop(i$(ord(i)<=2),
inc(cnt1);
cntWhile=0;
while(cntWhile<2,
inc(cntWhile);
inc(cnt2);
loop(k('k5'),
inc(cnt3);
loop(ij(i,j)$p(i,j),
inc(cnt4);
loop(l('l6'),
inc(cnt5);
for(cntFor=1 to 2,
inc(cnt6);
solve m min v use lp;
break 6;
inc(cnt7);
);
);
);
);
);
);
abort$(cnt1<>1) 'Error 34a';
abort$(cnt2<>1) 'Error 34b';
abort$(cnt3<>1) 'Error 34c';
abort$(cnt4<>1) 'Error 34d';
abort$(cnt5<>1) 'Error 34e';
abort$(cnt6<>1) 'Error 34f';
abort$(cnt7<>0) 'Error 34g';
* There was a bug in 24.8.5 (fixed with 24.9.1, see #3228).
* It could be reproduced like this:
set iBig / ib1*ib300 /
jSub(j) / #j /
iBigj(iBig,j) / #iBig.#j /
jSubSub(j) / #j /;
cnt1 = 0;
loop ((iBig,jSub),
* The problem was triggered by two cntrJmp instructions pointing to the same
* cntrEnd instruction, so the stack was pushed twice but just popped once
loop (iBigj(iBig,jSubSub(jSub)),
cnt1 = cnt1+10;
);
cnt1 = cnt1+1;
);
abort$(cnt1<>33000) 'Error 35a';
set
iS / i1*i2 /
jS / j1*j2 /
s(iS)
ijS(iS,jS) / #iS.#jS /
;
* There was a bug fixed after 34.2.0, see #4438
* It could be reproduced like this:
cnt1=0; cnt2=0; cnt3=0;
loop(jS,
s(iS) = ord(iS)=1;
inc(cnt1);
* Note: We loop over one element here
loop(ijS(s,jS),
* Break should not make a difference
inc(cnt2);
break;
inc(cnt3);
);
);
abort$(cnt1<>2) 'Error 35a';
abort$(cnt2<>2) 'Error 35b';
abort$(cnt3<>0) 'Error 35c';