forceinline RelTest MultZeroOne<View,pc>::equal(View x, int n) { if (pc == PC_INT_DOM) { return rtest_eq_dom(x,n); } else { return rtest_eq_bnd(x,n); } }
ExecStatus IteBnd<View>::propagate(Space& home, const ModEventDelta&) { if (b.one()) GECODE_REWRITE(*this,(Rel::EqBnd<View,View>::post(home(*this),x2,x0))); if (b.zero()) GECODE_REWRITE(*this,(Rel::EqBnd<View,View>::post(home(*this),x2,x1))); GECODE_ME_CHECK(x2.lq(home,std::max(x0.max(),x1.max()))); GECODE_ME_CHECK(x2.gq(home,std::min(x0.min(),x1.min()))); RelTest eq20 = rtest_eq_bnd(x2,x0); RelTest eq21 = rtest_eq_bnd(x2,x1); if ((eq20 == RT_FALSE) && (eq21 == RT_FALSE)) return ES_FAILED; if (eq20 == RT_FALSE) { GECODE_ME_CHECK(b.zero_none(home)); if (eq21 == RT_TRUE) return home.ES_SUBSUMED(*this); else GECODE_REWRITE(*this,(Rel::EqBnd<View,View>::post(home(*this),x2,x1))); } if (eq21 == RT_FALSE) { GECODE_ME_CHECK(b.one_none(home)); if (eq20 == RT_TRUE) return home.ES_SUBSUMED(*this); else GECODE_REWRITE(*this,(Rel::EqBnd<View,View>::post(home(*this),x2,x0))); } if ((eq20 == RT_TRUE) && (eq21 == RT_TRUE)) return home.ES_SUBSUMED(*this); return ES_FIX; }
ExecStatus IteDom<View>::propagate(Space& home, const ModEventDelta& med) { if (b.one()) GECODE_REWRITE(*this,(Rel::EqDom<View,View>::post(home(*this),x2,x0))); if (b.zero()) GECODE_REWRITE(*this,(Rel::EqDom<View,View>::post(home(*this),x2,x1))); GECODE_ME_CHECK(x2.lq(home,std::max(x0.max(),x1.max()))); GECODE_ME_CHECK(x2.gq(home,std::min(x0.min(),x1.min()))); if (View::me(med) != ME_INT_DOM) { RelTest eq20 = rtest_eq_bnd(x2,x0); RelTest eq21 = rtest_eq_bnd(x2,x1); if ((eq20 == RT_FALSE) && (eq21 == RT_FALSE)) return ES_FAILED; if (eq20 == RT_FALSE) { GECODE_ME_CHECK(b.zero_none(home)); if (eq21 == RT_TRUE) return home.ES_SUBSUMED(*this); else GECODE_REWRITE(*this, (Rel::EqDom<View,View>::post(home(*this),x2,x1))); } if (eq21 == RT_FALSE) { GECODE_ME_CHECK(b.one_none(home)); if (eq20 == RT_TRUE) return home.ES_SUBSUMED(*this); else GECODE_REWRITE(*this, (Rel::EqDom<View,View>::post(home(*this),x2,x0))); } if ((eq20 == RT_TRUE) && (eq21 == RT_TRUE)) return home.ES_SUBSUMED(*this); return home.ES_FIX_PARTIAL(*this,View::med(ME_INT_DOM)); } RelTest eq20 = rtest_eq_dom(x2,x0); RelTest eq21 = rtest_eq_dom(x2,x1); if ((eq20 == RT_FALSE) && (eq21 == RT_FALSE)) return ES_FAILED; if (eq20 == RT_FALSE) { GECODE_ME_CHECK(b.zero_none(home)); if (eq21 == RT_TRUE) return home.ES_SUBSUMED(*this); else GECODE_REWRITE(*this, (Rel::EqDom<View,View>::post(home(*this),x2,x1))); } if (eq21 == RT_FALSE) { GECODE_ME_CHECK(b.one_none(home)); if (eq20 == RT_TRUE) return home.ES_SUBSUMED(*this); else GECODE_REWRITE(*this, (Rel::EqDom<View,View>::post(home(*this),x2,x0))); } assert((eq20 != RT_TRUE) || (eq21 != RT_TRUE)); ViewRanges<View> r0(x0), r1(x1); Iter::Ranges::Union<ViewRanges<View>,ViewRanges<View> > u(r0,r1); if (!same(x0,x2) && !same(x1,x2)) GECODE_ME_CHECK(x2.inter_r(home,u,false)); else GECODE_ME_CHECK(x2.inter_r(home,u,true)); return ES_FIX; }
forceinline RelTest rtest_eq_dom(View x, int n) { RelTest rt = rtest_eq_bnd(x,n); if (rt != RT_MAYBE) return rt; return x.range() ? RT_MAYBE : rtest_eq_dom_check(x,n); }
forceinline RelTest rtest_eq_dom(View x, View y) { RelTest rt = rtest_eq_bnd(x,y); if (rt != RT_MAYBE) return rt; return (x.range() && y.range()) ? RT_MAYBE : rtest_eq_dom_check(x,y); }