$title Illustrate correct naming in MPSGE - new rules (MPSGE01,SEQ=78) $onText This model illustrates the NEW naming rules for labels and identifiers in MPSGE. The new rules are those imposed by the MPSGE engine that uses the external equation interface to communicate with the MCP solver - this was introduced in GAMS Distribution 20.1 on 31 October, 2001. To use these new rules, you must be running from GAMS Distribution 21.3 (due early January 2004) or newer - this was when the "oldnames" check made by GAMS/Base was taken out and the checks were moved to the MPSGE engines. Of course, just because something is allowed doesn't make it a good idea - this is not an illustration of good style. New rules for names in MPSGE models ----------------------------------- Labels must: not contain the following characters: set i / ' !.:"', "'" / or in English space, bang, dot, colon, double-quote, single-quote not be empty: set i / '' /; N.B. There is no MPSGE-specific limit on the label length. Model name: currently (Dec 2016) can only be 31 chars long Other identifiers (e.g. parameters, variables): no MPSGE-specific limits Last update Dec 2016 - Steve Dirkse $offText $eolCom // $version 137 $if errorfree $goTo GAMSBASE_OK $clearError display 'GAMS Rev 137 (CD 21.3) or higher required to test the new rules' $exit $label GAMSBASE_OK SETS i0 'long or spacy labels: max of 63 is accepted' / * 1 2 3 * 1234567890123456789012345678901 * 1 2 3 4 5 6 7 * 12345678901234567890123456789012345678901234567890123456789012345678901 veryLongLabelNameWithLengthOf31 big_33super____________________33 big_43super______________________________43 big_53super________________________________________53 big_63super__________________________________________________63 i-+-+-____ // -, +, or _ OK 'i4 ' // can end with spaces: GAMS/Base trims // trailing whitespace before MPSGE // gets a chance to see it / * this next block was created by taking all the legal UEL characters * as of GAMS CD 21.3 (GAMS Rev 137) and removing those known to cause * trouble for MPSGE. The chars legal in GAMS UELs but not in MPSGE * are tested in mpsge03 * mpsge09. i1 'unusual UEL chars' / '#OK#' '$OK$' '%OK%' '&OK&' '(OK(' ')OK)' '*OK*' '+OK+' ',OK,' '-OK-' '/OK/' '0OK9' ';OK;' 'OK>' '?OK?' '@OK@' 'aOKA' '[OK[' '\OK\' ']OK]' '^OK^' '_OK_' '`OK`' '{OK{' '|OK|' '}OK}' '~OK~' '#' / i2 'unusual UEL chars' / '$' '%' '&' '(' ')' '*' '+' ',' '-' '/' '0' ';' '<' '=' '>' '?' '@' 'A' '[' '\' ']' '^' '_' '`' '{' '|' '}' '~' / jj / j1 * j2 / hh / h1 * h2 / j / j1 / h / h1 / ; * the existence of nasty labels should only matter if they are part of * the MPSGE model SET notusedinmpsge / 'a = b a' /; * ----------------- test long symbol names and long/spacy UELs --------------- parameters * 1 2 3 4 5 6 7 * 1234567890123456789012345678901234567890123456789012345678901234567890 d03456789012345678901234567890123456789012345678901234567890123(i0,hh) 'Reference demands' e0(i0,hh) 'Reference endowments' ; d03456789012345678901234567890123456789012345678901234567890123(i0,hh) = uniform(0,1); e0(i0,hh) = uniform(0,1); $onText $model:exchange901234567890twenty78901 $commodities: price6789012345678901234567890123456789012345678901234567890123(i0,jj) * 1 2 3 4 5 6 7 * 1234567890123456789012345678901234567890123456789012345678901234567890 $consumers: ra3456789012345678901234567890123456789012345678901234567890123(hh) $demand:ra3456789012345678901234567890123456789012345678901234567890123(hh) s:1 d:price6789012345678901234567890123456789012345678901234567890123(i0,jj) q:d03456789012345678901234567890123456789012345678901234567890123(i0,hh) e:price6789012345678901234567890123456789012345678901234567890123(i0,jj) q:e0(i0,hh) $offText $sysInclude mpsgeset exchange901234567890twenty78901 option solvelink=0; $include EXCHANGE901234567890TWENTY78901.GEN solve exchange901234567890twenty78901 using mcp; abort$[exchange901234567890twenty78901.solvestat <> %solveStat.normalCompletion%] 'wrong solvestat (sl=0)'; abort$[exchange901234567890twenty78901.modelstat <> %modelStat.optimal%] 'wrong modelstat (sl=0)'; option solvelink=5; $include EXCHANGE901234567890TWENTY78901.GEN solve exchange901234567890twenty78901 using mcp; abort$[exchange901234567890twenty78901.solvestat <> %solveStat.normalCompletion%] 'wrong solvestat (sl=5)'; abort$[exchange901234567890twenty78901.modelstat <> %modelStat.optimal%] 'wrong modelstat (sl=5)'; * ----------------- test unusual UELs from i1 --------------- parameters d1(i1,h) 'Reference demands' e1(i1,h) 'Reference endowments' ; d1(i1,h) = uniform(0,1); e1(i1,h) = uniform(0,1); $onText $model:exchange1 $commodities: price1(i1,j) $consumers: ra1(h) $demand:ra1(h) s:1 d:price1(i1,j) q:d1(i1,h) e:price1(i1,j) q:e1(i1,h) $offText $sysInclude mpsgeset exchange1 option solvelink=0; $include EXCHANGE1.GEN solve exchange1 using mcp; abort$[exchange1.solvestat <> %solveStat.normalCompletion%] 'wrong solvestat (sl=0)'; abort$[exchange1.modelstat <> %modelStat.optimal%] 'wrong modelstat (sl=0)'; option solvelink=5; $include EXCHANGE1.GEN solve exchange1 using mcp; abort$[exchange1.solvestat <> %solveStat.normalCompletion%] 'wrong solvestat (sl=5)'; abort$[exchange1.modelstat <> %modelStat.optimal%] 'wrong modelstat (sl=5)'; * ----------------- test unusual UELs from i2 --------------- parameters d2(i2,h) 'Reference demands' e2(i2,h) 'Reference endowments' ; d2(i2,h) = uniform(0,1); e2(i2,h) = uniform(0,1); $onText $model:exchange2 $commodities: price2(i2,j) $consumers: ra1(h) $demand:ra1(h) s:1 d:price2(i2,j) q:d2(i2,h) e:price2(i2,j) q:e2(i2,h) $offText $sysInclude mpsgeset exchange2 option solvelink=0; $include EXCHANGE2.GEN solve exchange2 using mcp; abort$[exchange2.solvestat <> %solveStat.normalCompletion%] 'wrong solvestat (sl=0)'; abort$[exchange2.modelstat <> %modelStat.optimal%] 'wrong modelstat (sl=0)'; option solvelink=5; $include EXCHANGE2.GEN solve exchange2 using mcp; abort$[exchange2.solvestat <> %solveStat.normalCompletion%] 'wrong solvestat (sl=5)'; abort$[exchange2.modelstat <> %modelStat.optimal%] 'wrong modelstat (sl=5)';