ExecStatus EqInt<VY>::propagate(Space& home, const ModEventDelta& med) { // Add assigned views to value set if (IntView::me(med) == ME_INT_VAL) add(home); GECODE_ME_CHECK(y.gq(home, vs.size())); GECODE_ME_CHECK(y.lq(home, x.size() + vs.size())); if (x.size() == 0) return home.ES_SUBSUMED(*this); // All values must be in the value set if (y.max() == vs.size()) return all_in_valset(home); // Compute positions of disjoint views and eliminate subsumed views Region r(home); int* dis; int n_dis; disjoint(home,r,dis,n_dis); // The number might have changed due to elimination of subsumed views GECODE_ME_CHECK(y.lq(home, x.size() + vs.size())); if (x.size() == 0) { assert(y.val() == vs.size()); return home.ES_SUBSUMED(*this); } GECODE_ES_CHECK(prune_upper(home,g)); // No lower bound pruning possible if (n_dis == 0) return ES_NOFIX; // Only if the propagator is at fixpoint here, continue with // propagating the lower bound if (IntView::me(Propagator::modeventdelta()) != ME_INT_NONE) return ES_NOFIX; // Do lower bound-based pruning GECODE_ES_CHECK(prune_lower(home,dis,n_dis)); return ES_NOFIX; }
ExecStatus LqInt<VY>::propagate(Space& home, const ModEventDelta& med) { // Add assigned views to value set if (IntView::me(med) == ME_INT_VAL) add(home); GECODE_ME_CHECK(y.gq(home, vs.size())); if (x.size() == 0) return home.ES_SUBSUMED(*this); // All values must be in the value set if (y.max() == vs.size()) return all_in_valset(home); if (x.size() + vs.size() <= y.min()) return home.ES_SUBSUMED(*this); // Compute positions of disjoint views Region r(home); int* dis; int n_dis; disjoint(home,r,dis,n_dis); // Some views might have been eliminated as they are subsumed if (x.size() == 0) return home.ES_SUBSUMED(*this); // No lower bound pruning possible if (n_dis == 0) return ES_NOFIX; // Do lower bound-based pruning GECODE_ES_CHECK(prune_lower(home,dis,n_dis)); return ES_NOFIX; }