\$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