ExecStatus Nq<View>::post(Home home, View x0, View x1){ if (x0.assigned()) { GECODE_ME_CHECK(x1.nq(home,x0.val())); } else if (x1.assigned()) { GECODE_ME_CHECK(x0.nq(home,x1.val())); } else if (same(x0,x1)) { return ES_FAILED; } else { (void) new (home) Nq<View>(home,x0,x1); } return ES_OK; }
ExecStatus NqFloat<View>::post(Home home, View x, FloatVal c){ if (x.assigned()) { if (overlap(x.val(),c)) return ES_FAILED; } else { (void) new (home) NqFloat<View>(home,x,c); } return ES_OK; }
ExecStatus Mult<View>::post(Home home, View x0, View x1, View x2) { if (same(x0,x1)) return Sqr<View>::post(home,x0,x2); if (same(x0,x2)) return MultZeroOne<View>::post(home,x0,x1); if (same(x1,x2)) return MultZeroOne<View>::post(home,x1,x0); if (pos(x0)) { if (pos(x1) || pos(x2)) goto post_ppp; if (neg(x1) || neg(x2)) goto post_pnn; } else if (neg(x0)) { if (neg(x1) || pos(x2)) goto post_nnp; if (pos(x1) || neg(x2)) goto post_npn; } else if (pos(x1)) { if (pos(x2)) goto post_ppp; if (neg(x2)) goto post_npn; } else if (neg(x1)) { if (pos(x2)) goto post_nnp; if (neg(x2)) goto post_pnn; } { GECODE_ME_CHECK(x2.eq(home,x0.val()*x1.val())); (void) new (home) Mult<View>(home,x0,x1,x2); } return ES_OK; post_ppp: return MultPlus<FloatView,FloatView,FloatView>::post(home,x0,x1,x2); post_nnp: return MultPlus<MinusView,MinusView,FloatView>::post(home, MinusView(x0),MinusView(x1),x2); post_pnn: std::swap(x0,x1); post_npn: return MultPlus<MinusView,FloatView,MinusView>::post(home, MinusView(x0),x1,MinusView(x2)); }
ExecStatus Watch<View>::post(Home home, View x0, View x1, unsigned int _x0Size) { if (x0.size() != _x0Size) { return ES_FAILED; } else if (x1.assigned()) { GECODE_ME_CHECK(x0.eq(home,x1.val())); } else { assert(!same(x0,x1)); GECODE_ME_CHECK(x0.lq(home,x1.max())); GECODE_ME_CHECK(x1.lq(home,x0.max())); GECODE_ME_CHECK(x0.gq(home,x1.min())); GECODE_ME_CHECK(x1.gq(home,x0.min())); assert(x0.size() == x1.size()); (void) new (home) Watch<View>(home,x0,x1,_x0Size); } return ES_OK; }
ExecStatus ReEqFloat<View,CtrlView,rm>::post(Home home, View x, FloatVal c, CtrlView b) { if (b.one()) { if (rm != RM_PMI) GECODE_ME_CHECK(x.eq(home,c)); } else if (x.assigned()) { if (overlap(x.val(),c)) { if (rm != RM_IMP) GECODE_ME_CHECK(b.one(home)); } else { if (rm != RM_PMI) GECODE_ME_CHECK(b.zero(home)); } } else { (void) new (home) ReEqFloat(home,x,c,b); } return ES_OK; }
forceinline bool assigned(View x, int v) { return x.assigned() && (x.val() == v); }