breakcont2.gms : Advanced test for break and continue statements

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';