$title Test equList matching in model statement (MCP13, SEQ=966) $ontext Test equList matching in model statement. In particular, test on valid inputs Contributor: Steven Dirkse, September 2024 $offtext scalar c / 0 /; sets u / a, b, c / i1(u) i2(u) i3(u) ; variable v(u); equations n1(u) n2(u) n3(u) e1(u) 'matched equations' e2(u) 'matched equations' e3(u) 'matched equations' h 'unmatched equation' ; n1(i1(u)).. v(u-1) + v(u) + c * v(u+1) =N= min(2,ord(u)); n2(i2(u)).. v(u-1) + v(u) + c * v(u+1) =N= min(2,ord(u)); n3(i3(u)).. v(u-1) + v(u) + c * v(u+1) =N= min(2,ord(u)); e1(i1(u)).. v(u-1) + v(u) + c * v(u+1) =E= min(2,ord(u)); e2(i2(u)).. v(u-1) + v(u) + c * v(u+1) =E= min(2,ord(u)); e3(i3(u)).. v(u-1) + v(u) + c * v(u+1) =E= min(2,ord(u)); h .. v('b') + v('c') =E= 2; $ifthen set OLDWAY model m1 / n1.v, n2.v, n3.v /; model m2 / n1.v /; model mf 'include unmatched h' / m1, h /; $else model m1 / ( n1 | n2 | n3 ) : v /; model m2 / ( n1 ) : v /; model mf 'include unmatched h' / m1, h /; $endif model mu 'completely unmatched' / e1, e2, e3 /; $macro CHECK_MOD(m) abort$[m.solvestat <> 1] 'bad solvestat', m.solvestat $ontext ------------------------------------------------------------------------ rows: n1_a, n2_b, n3_c cols: v_a, v_b, v_c result: good match, regardless of bounds on v ------------------------------------------------------------------------ $offtext i1(u) = sameas(u,'a'); i2(u) = sameas(u,'b'); i3(u) = sameas(u,'c'); solve m1 using mcp; CHECK_MOD(m1); v.fx('b') = 1; solve m1 using mcp; CHECK_MOD(m1); v.lo('b') = -INF; solve m1 using mcp; CHECK_MOD(m1); v.up('b') = 0.5; solve m1 using mcp; CHECK_MOD(m1); v.up('b') = INF; $ontext ------------------------------------------------------------------------ rows: n2_b, n3_c cols: v_a, v_b, v_c result: good match as long as v_a is fixed ------------------------------------------------------------------------ $offtext i1(u) = no; i2(u) = sameas(u,'b'); i3(u) = sameas(u,'c'); v.fx('a') = 1; solve m1 using mcp; CHECK_MOD(m1); v.fx('b') = 1; solve m1 using mcp; CHECK_MOD(m1); v.up('b') = INF; solve m1 using mcp; CHECK_MOD(m1); v.lo('b') = 0.5; solve m1 using mcp; CHECK_MOD(m1); v.lo('b') = -INF; v.lo('a') = -INF; v.up('a') = INF; $ontext ------------------------------------------------------------------------ rows: n1_a, n1_b, n1_c cols: v_a, v_b, v_c result: good match as long as v_a is fixed ------------------------------------------------------------------------ $offtext i1(u) = yes; i2(u) = no; i3(u) = no; solve m1 using mcp; CHECK_MOD(m1); solve m2 using mcp; CHECK_MOD(m2); $ontext ------------------------------------------------------------------------ rows: n1_a, n2_b, h cols: v_a, v_b, v_c result: good match, as long as v_c is free ------------------------------------------------------------------------ $offtext i1(u) = sameas(u,'a'); i2(u) = sameas(u,'b'); i3(u) = no; solve mf using mcp; CHECK_MOD(mf); $ontext ------------------------------------------------------------------------ rows: e1_b, e2_c e3_c cols: v_a, v_b, v_c result: good match, as long as v is free but the model is not good, probably not what the user wanted ------------------------------------------------------------------------ $offtext i1(u) = sameas(u,'b'); i2(u) = sameas(u,'c'); i3(u) = sameas(u,'c'); solve mu using mcp; CHECK_MOD(mu);