$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 varList1 / f : ( x | y | z ) / varList2 / ee0 : ( pp1 | pp2 ) / m / varList1 g, hx, hy, hz varList2 /; 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;