$title Test equList matching in model statement (MCP15, SEQ=968) $onText Test equList matching in model statement. In particular, test on invalid 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) 'matched =N= rows' n2(u) 'matched =N= rows' n3(u) 'matched =N= rows' 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 m3 / e1.v, e2.v e3.v /; model mf 'include unmatched h' / m1, h /; $else model m1 / ( n1 | n2 | n3 ) : v /; model m2 / ( n1 ) : v /; model m3 / ( e1 | e2 | e3 ) : v /; model mf 'include unmatched h' / m1, h /; $endif $macro CHECK_ERR abort$(0=execerror) 'expected exec errors from preceding solve' $macro CHECK_MOD(m) abort$[m.modelstat <> %modelstat.NoSolutionReturned%] 'bad modelstat', m.modelstat; \ abort$[m.solvestat <> %solvestat.SolveProcessingSkipped%] 'bad solvestat', m.solvestat $macro CLEAR_ERR execerror = 0 * if we do not clear the error subsequent solves will be skipped $macro DOSTUFF(m) CHECK_ERR; CHECK_MOD(m); CLEAR_ERR * setting maxexecerror > 0 allows us to continue in the face of errors maxexecerror = 1; $ontext ------------------------------------------------------------------------ rows: n1_a, n2_b, n3_c n1_b cols: v_a, v_b, v_c result: bad match, regardless of bounds on v ------------------------------------------------------------------------ $offtext i1(u) = sameas(u,'a') or sameas(u,'b'); i2(u) = sameas(u,'b'); i3(u) = sameas(u,'c'); solve m1 using mcp; DOSTUFF(m1); * v.fx('b') = 1; solve m1 using mcp; DOSTUFF(m1); v.lo('b') = -INF; v.up('b') = INF; $ontext ------------------------------------------------------------------------ rows: n2_b, n3_c cols: v_a, v_b, v_c result: bad match if v_a is not fixed ------------------------------------------------------------------------ $offtext i1(u) = no; i2(u) = sameas(u,'b'); i3(u) = sameas(u,'c'); solve m1 using mcp; DOSTUFF(m1); v.lo('a') = 1; solve m1 using mcp; DOSTUFF(m1); v.up('a') = 2; solve m1 using mcp; DOSTUFF(m1); v.lo('a') = -INF; v.up('a') = INF; $ontext ------------------------------------------------------------------------ rows: e1_b, e2_c e3_c cols: v_a, v_b, v_c result: bad match, regardless of bounds on v ------------------------------------------------------------------------ $offtext i1(u) = sameas(u,'b'); i2(u) = sameas(u,'c'); i3(u) = sameas(u,'c'); solve m3 using mcp; DOSTUFF(m3);