mcp16.gms : 모델 문에서 varList 일치 테스트

설명

다중 equ:varList 일치를 사용하여 모델 명령문에서 varList 일치를 테스트합니다.
하나는 차원 3의 기호이고 다른 하나는 차원 20의 기호입니다.

기고자: Steven Dirkse, 2024년 10월

소형 모델 유형 :슬롯 머신


카테고리 : 슬롯 머신 테스트 라이브러리


메인 파일 : mcp16.gms

$title 모델 명령문에서 varList 일치 테스트(MCP16, SEQ=970)

$ontext
여러 equ:varList 일치를 사용하여 모델 문에서 varList 일치를 테스트합니다.
하나는 차원 3의 기호이고 다른 하나는 차원 20의 기호입니다.

기고자: Steven Dirkse, 2024년 10월
$offtext

세트
  a / a0, a1, a2, a3 /
  나는 / i1 * i4 /
  j / j1 * j3 /
  k / k1 * k3 /
  fijk(i,j,k) 'f에 대한 패턴'
  hxijk(i,j,k) 'hx에 대한 패턴'
  hyijk(i,j,k) 'hy에 대한 패턴'
  hzijk(i,j,k) 'hz에 대한 패턴'
  xijk(i,j,k) 'x에 대한 패턴'
  yijk(i,j,k) 'y에 대한 패턴'
  zijk(i,j,k) 'z에 대한 패턴'
  s '기호' / f, x, y, z /
  ss '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

별칭(a,%ALIST%);
세트
  a0(%ALIST%)
  a1(%ALIST%)
  a2(%ALIST%)
  tfx(%ALIST%)
  ;
약어
  ex 'var/equ가 존재합니다'
  fx 'var가 존재하며 수정되었습니다.'
  ;
테이블 pat(i,j,k,s) '일치하는 패턴'
                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 예
i3.j2.k2 예
i3.j2.k3 예
;

테이블 pat20(ac,ak,ss) '일치하는 패턴'
          v1 v2
a1.a2 예
a1.a3 FX
a2.a1 예
a2.a3 ex FX
a3.a1 FX
a3.a2 FX 예
a3.a3 FX FX
;

매개변수 allfix(s) / f ex, x fx, y fx, z fx /;

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

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

hxijk(i,j,k) = [ex = pat(i,j,k,'x')] 이고 fijk(i,j,k)는 아닙니다.
xijk(i,j,k) = [ex = pat(i,j,k,'x')] 또는 [fx = pat(i,j,k,'x')];

hyijk(i,j,k) = [ex = pat(i,j,k,'y')] 이고 fijk(i,j,k)는 아닙니다.
yijk(i,j,k) = [ex = pat(i,j,k,'y')] 또는 [fx = pat(i,j,k,'y')];

hzijk(i,j,k) = [ex = pat(i,j,k,'z')] 이고 fijk(i,j,k)는 아닙니다.
zijk(i,j,k) = [ex = pat(i,j,k,'z')] 또는 [fx = pat(i,j,k,'z')];

디스플레이 팻;
디스플레이 fijk;

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

방정식
  f(i,j,k)
  hx(i,j,k)
  hy(i,j,k)
  hz(i,j,k)
  지
  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;

지 ..
    합xijk, (x(xijk) - 1)
  + 합yijk, (y(yijk) - 1)
  + 합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')] 또는 [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')] 또는 [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%)) = 예;
a0(a2(%ALIST%)) = 예;

모델 varList1 / f : ( x | y | z ) /
      varList2 / ee0 : ( pp1 | pp2 ) /
      m / varList1
                 g, hx, hy, hz
                 varList2 /;

매개변수
  chk(i,j,k)
  c20(%ALIST%)
  ;
$macro CHECK_MOD(m) abort$[m.solvestat <> 1] '잘못된solvestat', m.solvestat
$macro XYZTEST chk(i,j,k) = 0;  chk(xijk) = round(1 - x.l(xijk),5);  중단$카드(chk) chk, x.l; \
                chk(i,j,k) = 0;  chk(yijk) = round(1 - y.l(yijk),5);  중단$카드(chk) chk, y.l; \
                chk(i,j,k) = 0;  chk(zijk) = round(1 - z.l(zijk),5);  중단$카드(chk) chk, z.l;
$macro PPTEST c20(%ALIST%) = 0;  c20(a1) = round(1 - pp1.l(a1),5);  중단$카드(c20) c20, pp1.l; \
               c20(%ALIST%) = 0;  c20(a2) = round(1 - pp2.l(a2),5);  중단$카드(c20) c20, pp2.l;

옵션 limrow=99, limcol=99;

슬롯 머신를 사용하여 m을 해결합니다.
CHECK_MOD(m); XYZ 테스트; PPT테스트;

m.holdfixed = 1;
슬롯 머신를 사용하여 m을 해결합니다.
CHECK_MOD(m); XYZ 테스트; PPTEST;