mcp16.gms : Test varList matching in model statement

Description

Test varList matching in model statement with multiple equ:varList matchings,
one with symbols of dimension 3 and another with symbols of dimension 20.

Contributor: Steven Dirkse, October 2024


Small Model of Type : MCP


Category : GAMS Test library


Main file : mcp16.gms

$title Test varList matching in model statement (MCP16, SEQ=970)

$ontext
Test varList matching in model statement with multiple equ:varList matchings,
one with symbols of dimension 3 and another with symbols of dimension 20.

Contributor: Steven Dirkse, October 2024
$offtext


Set
  a / a0, a1, a2, a3 /
  i / i1 * i4 /
  j / j1 * j3 /
  k / k1 * k3 /
  fijk(i,j,k)  'pattern for f'
  hxijk(i,j,k) 'pattern for hx'
  hyijk(i,j,k) 'pattern for hy'
  hzijk(i,j,k) 'pattern for hz'
  xijk(i,j,k)  'pattern for x'
  yijk(i,j,k)  'pattern for y'
  zijk(i,j,k)  'pattern for z'
  s            'symbols'            / f, x, y, z /
  ss           'symbols for 20-dim' / v1, v2 /
  ;
  
$set ALIST aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an,ao,ap,aq,ar,as,at

Alias (a,%ALIST%);
Set
  a0(%ALIST%)
  a1(%ALIST%)
  a2(%ALIST%)
  tfx(%ALIST%)
  ;
Acronym
  ex 'var/equ exists'
  fx 'var exists and is fixed'
  ;
Table pat(i,j,k,s) 'matching pattern'
                f   x   y   z
i1.j1.k1        ex  fx  ex  fx
i1.j1.k2        ex  ex  fx  fx
i1.j1.k3        ex  fx  fx  ex
i1.j2.k1        ex  ex
i1.j2.k2        ex      ex
i1.j2.k3        ex          ex

i2.j1.k1        ex  fx  fx  fx
i2.j1.k2        ex      fx  fx
i2.j1.k3        ex  fx      fx
i2.j2.k1        ex  ex  fx
i2.j2.k2        ex  fx  ex
i2.j2.k3        ex      ex  fx
i2.j3.k1        ex      fx  ex
i2.j3.k2        ex  ex      fx
i2.j3.k3        ex  fx      ex

i3.j1.k1            fx  fx  fx
i3.j1.k2            ex  ex  ex
i3.j2.k1            ex
i3.j2.k2                ex
i3.j2.k3                    ex
;

Table pat20(ac,ak,ss) 'matching pattern'
          v1  v2
a1.a2         ex
a1.a3         fx
a2.a1     ex
a2.a3     ex  fx
a3.a1     fx
a3.a2     fx  ex
a3.a3     fx  fx
;

Parameter allfix(s)  / f ex, x fx, y fx, z fx /;

pat('i4',j,k,s) = allfix(s);

fijk(i,j,k) = [ex = pat(i,j,k,'f')];

hxijk(i,j,k) = [ex = pat(i,j,k,'x')] and not fijk(i,j,k);
xijk(i,j,k) = [ex = pat(i,j,k,'x')] or [fx = pat(i,j,k,'x')];

hyijk(i,j,k) = [ex = pat(i,j,k,'y')] and not fijk(i,j,k);
yijk(i,j,k) = [ex = pat(i,j,k,'y')] or [fx = pat(i,j,k,'y')];

hzijk(i,j,k) = [ex = pat(i,j,k,'z')] and not fijk(i,j,k);
zijk(i,j,k) = [ex = pat(i,j,k,'z')] or [fx = pat(i,j,k,'z')];

display pat;
display fijk;


Variable
  x(i,j,k)
  y(i,j,k)
  z(i,j,k)
  v
  pp1(%ALIST%)
  pp2(%ALIST%)
  ;

Equation
  f(i,j,k)
  hx(i,j,k)
  hy(i,j,k)
  hz(i,j,k)
  g
  ee0(%ALIST%);
  ;
f(fijk(i,j,k)) ..
    (x(i,j,k) - 1)$xijk(i,j,k)
  + (y(i,j,k) - 1)$yijk(i,j,k)
  + (z(i,j,k) - 1)$zijk(i,j,k)
  + (v - 1)   =E= 0;

hx(hxijk(i,j,k)) ..  x(i,j,k) =E= 1;

hy(hyijk(i,j,k)) ..  y(i,j,k) =E= 1;

hz(hzijk(i,j,k)) ..  z(i,j,k) =E= 1;

g ..
    sum{xijk, (x(xijk) - 1)}
  + sum{yijk, (y(yijk) - 1)}
  + sum{zijk, (z(zijk) - 1)}
  + 2 * v   =E= 2;

ee0(a0(%ALIST%)) ..
    (pp1(%ALIST%) - 1)$a1(%ALIST%)
  + (pp2(%ALIST%) - 1)$a2(%ALIST%)
  =E= 0;

x.fx(i,j,k)$[fx = pat(i,j,k,'x')] = 1;
y.fx(i,j,k)$[fx = pat(i,j,k,'y')] = 1;
z.fx(i,j,k)$[fx = pat(i,j,k,'z')] = 1;

a1('a0','a0',ac,'a0','a0','a0','a0','a0','a0','a0',ak,'a0','a0','a0','a0','a0','a0','a0','a0','a0') =
   [ex = pat20(ac,ak,'v1')] or [fx = pat20(ac,ak,'v1')];
tfx('a0','a0',ac,'a0','a0','a0','a0','a0','a0','a0',ak,'a0','a0','a0','a0','a0','a0','a0','a0','a0') =
   [fx = pat20(ac,ak,'v1')];
pp1.fx(tfx) = 1;
a2('a0','a0',ac,'a0','a0','a0','a0','a0','a0','a0',ak,'a0','a0','a0','a0','a0','a0','a0','a0','a0') =
   [ex = pat20(ac,ak,'v2')] or [fx = pat20(ac,ak,'v2')];
tfx('a0','a0',ac,'a0','a0','a0','a0','a0','a0','a0',ak,'a0','a0','a0','a0','a0','a0','a0','a0','a0') =
   [fx = pat20(ac,ak,'v2')];
pp2.fx(tfx) = 1;
a0(a1(%ALIST%)) = yes;
a0(a2(%ALIST%)) = yes;

Model m / f : ( x | y | z )
           g, hx, hy, hz
          ee0 : ( pp1 | pp2 )
        /;

parameter
  chk(i,j,k)
  c20(%ALIST%)
  ;
$macro CHECK_MOD(m) abort$[m.solvestat <> 1] 'bad solvestat', m.solvestat
$macro XYZTEST  chk(i,j,k) = 0;  chk(xijk) = round(1 - x.l(xijk),5);  abort$card(chk) chk, x.l; \
                chk(i,j,k) = 0;  chk(yijk) = round(1 - y.l(yijk),5);  abort$card(chk) chk, y.l; \
                chk(i,j,k) = 0;  chk(zijk) = round(1 - z.l(zijk),5);  abort$card(chk) chk, z.l;
$macro PPTEST  c20(%ALIST%) = 0;  c20(a1) = round(1 - pp1.l(a1),5);  abort$card(c20) c20, pp1.l; \
               c20(%ALIST%) = 0;  c20(a2) = round(1 - pp2.l(a2),5);  abort$card(c20) c20, pp2.l;

option limrow=99, limcol=99;

solve m using mcp;
CHECK_MOD(m); XYZTEST; PPTEST;

m.holdfixed = 1;
solve m using mcp;
CHECK_MOD(m); XYZTEST; PPTEST;