| 66 | /// Evaluate linear instructions |
| 67 | template<class Expr> |
| 68 | Expr |
| 69 | eval(const LinInstr* pc, Expr reg[]) { |
| 70 | while (true) { |
| 71 | switch (pc->o) { |
| 72 | case LO_ACE: reg[pc->y] = pc->c + reg[pc->x]; break; |
| 73 | case LO_AEC: reg[pc->y] = reg[pc->x] + pc->c; break; |
| 74 | case LO_AEE: reg[pc->z] = reg[pc->x] + reg[pc->y]; break; |
| 75 | case LO_SCE: reg[pc->y] = pc->c - reg[pc->x]; break; |
| 76 | case LO_SEC: reg[pc->y] = reg[pc->x] - pc->c; break; |
| 77 | case LO_SEE: reg[pc->z] = reg[pc->x] - reg[pc->y]; break; |
| 78 | case LO_SE: reg[pc->y] = -reg[pc->x]; break; |
| 79 | case LO_MCE: reg[pc->y] = pc->c * reg[pc->x]; break; |
| 80 | case LO_MEC: reg[pc->y] = reg[pc->x] * pc->c; break; |
| 81 | case LO_HLT: return reg[pc->x]; |
| 82 | default: GECODE_NEVER; |
| 83 | } |
| 84 | pc++; |
| 85 | } |
| 86 | GECODE_NEVER; |
| 87 | } |
| 88 | |
| 89 | /** |
| 90 | * \defgroup TaskTestFloatMiniModelLin Minimal modeling constraints (linear constraints) |