$title Tests $ifThen from old release notes (IFTHEN4,SEQ=454) $onText A new variant on the $if statement has been introduced. It follows the usual structures and allows appropriate nesting. The syntax for the condition are the same as for the $if statement. The $ifThen and $elseIf have the same modifiers as the $if statement, namely I for case insensitive compare and E for constant expression evaluation. In the example below we will execute all blocks of such a statement. Contributor: Alex $offText $onDollar $maxGoTo 10 $set x a $label two $ifThen %x% == a $set x 'c' $log $ifThen with x=%x% $elseIf %x% == b $set x 'k' $log $elseIf 1 with x=%x% $elseIf %x% == c $set x 'b' $log $elseIf 2 with x=%x% $else $set x 'e' $log $else with x=%x% $endIf $if NOT %x% == e $goTo two $eval x 1 $label three display 'x=%x%'; $ifThen %x% == 1 $eval x %x%+1 $elseIf %x% == 2 $eval x %x%+1 $elseIf %x% == 3 $eval x %x%+1 $elseIf %x% == 4 $eval x %x%+1 $else $set x done $endIf $if NOT %x% == done $goTo three *This is a bit contrived but illustrates some of more subtle features. Anytime we use a looping construct via a $goTo statement we have to protect ourselves against the potential of an infinite loop. The number of times we jump back to a label is counted and when a limit is reached, GAMS will issue an error. It is important to note that the %string% references are substituted only once. *Lengthy and nested ithen/else structures can become difficult to debug. Tagging of the begin, the $ifThen and the end, the $endIf can be helpful. For example, the next line will fail because the tags do not match: $ifThen.one x == x $endIf.one *As with the $if statement, the statement on the line with the $ifThen style statements is optional. The following two statements give the same results: $echo $remark this is abc > abc.gms $echo $remark this is efg > efg.gms $echo $remark this is xyz > xyz.gms $set type 'low' $label lower $ifThenI %type% == low $include abc $elseIfI %type% == med $include efg $else $include xyz display 'xyz'; $endIf display 'first part lower'; $ifThenI %type% == low $include abc $elseIfI %type% == med $include efg $else $include xyz display 'xyz'; $endIf display 'second part lower'; $ifI %type%==low $set type 'med' $goTo lower $ifI %type%==med $set type 'xxx' $goTo lower * The statements following directly a $ifThen, $elseIf, or $else on the same line can be a sequence of other dollar control statements or contain proper GAMS syntax. The statements following directly a $endIf can only contain another dollar control statements. $ifThen.two c==c display 'true for tag two'; $ifThen.three a==a $log true for tag three display ' then clause for tag three'; $ifThen.four x==x display 'true for tag four'; $log true for tag four $else.four display ' else clause for tag four'; $endIf.four $log endif four $endIf.three $log endif three $endIf.two $log endif two $exit This will produce a GAMS program like 1 display 'true for tag two'; 3 display ' then clause for tag three'; 4 display 'true for tag four'; with the following log output --- Starting compilation true for tag three true for tag four endif four endif three endif two