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;