ExecStatus ReLeFloat<View,CtrlView,rm>::post(Home home, View x, FloatVal c, CtrlView b) { if (b.one()) { if (rm != RM_PMI) { GECODE_ME_CHECK(x.lq(home,c.max())); if (x.assigned() && (x.max() >= c.min())) return ES_FAILED; (void) new (home) ReLeFloat<View,CtrlView,rm>(home,x,c,b); } } else if (b.zero()) { if (rm != RM_IMP) GECODE_ME_CHECK(x.gq(home,c.min())); } else { switch (rtest_le(x,c)) { case RT_TRUE: if (rm != RM_IMP) GECODE_ME_CHECK(b.one(home)); break; case RT_FALSE: if (rm != RM_PMI) GECODE_ME_CHECK(b.zero(home)); break; case RT_MAYBE: (void) new (home) ReLeFloat<View,CtrlView,rm>(home,x,c,b); break; default: GECODE_NEVER; } } 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; }
ExecStatus ReEq<View,CtrlView,rm>::post(Home home, View x0, View x1, CtrlView b){ if (b.one()) { if (rm == RM_PMI) return ES_OK; return Eq<View,View>::post(home,x0,x1); } if (b.zero()) { if (rm == RM_IMP) return ES_OK; return Nq<View,View>::post(home,x0,x1); } if (!same(x0,x1)) { (void) new (home) ReEq(home,x0,x1,b); } else if (rm != RM_IMP) { GECODE_ME_CHECK(b.one(home)); } return ES_OK; }
ExecStatus ReLq<View,CtrlView,rm>::post(Home home, View x0, View x1, CtrlView b) { if (b.one()) { if (rm == RM_PMI) return ES_OK; return Lq<View>::post(home,x0,x1); } if (b.zero()) { if (rm == RM_IMP) return ES_OK; return Le<View>::post(home,x1,x0); } if (!same(x0,x1)) { switch (rtest_lq(x0,x1)) { case RT_TRUE: if (rm != RM_IMP) GECODE_ME_CHECK(b.one_none(home)); break; case RT_FALSE: if (rm != RM_PMI) GECODE_ME_CHECK(b.zero_none(home)); break; case RT_MAYBE: if (!x0.assigned() || !x1.assigned()) (void) new (home) ReLq<View,CtrlView,rm>(home,x0,x1,b); else { if (rm != RM_IMP) GECODE_ME_CHECK(b.one_none(home)); } break; default: GECODE_NEVER; } } else if (rm != RM_IMP) { GECODE_ME_CHECK(b.one_none(home)); } return ES_OK; }