mpsge01.gms : Illustrate correct naming in MPSGE - new rules

Description

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


Small Model of Type : MPSGE


Category : GAMS Test library


Main file : mpsge01.gms

$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>'
    '?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)';