/// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { int max = Gecode::Set::Limits::min - 1; for (int i=0; i<n; i++) { CountableSetRanges xir(x.lub, x[i]); IntSet xi(xir); if (xi.ranges() > 0) { int oldMax = max; max = xi.max(); if (xi.min() <= oldMax) return false; } } CountableSetRanges* isrs = new CountableSetRanges[n]; for (int i=n; i--; ) isrs[i].init(x.lub, x[i]); FakeSpace* fs = new FakeSpace; bool ret; { Region r(*fs); Iter::Ranges::NaryUnion u(r, isrs, n); CountableSetRanges xnr(x.lub, x[n]); ret = Iter::Ranges::equal(u, xnr); } delete[] isrs; delete fs; return ret; }
/// %Test whether \a x is solution virtual bool solution(const SetAssignment& x) const { int max = Gecode::Set::Limits::min - 1; for (int i=0; i<4; i++) { CountableSetRanges xir(x.lub, x[i]); IntSet xi(xir); if (xi.ranges() > 0) { int oldMax = max; max = xi.max(); if (xi.min() <= oldMax) return false; } } return true; }
int IntBase<VY>::size(Space& home) const { Region r(home); assert(x.size() > 0); ValSet::Ranges vsr(vs); ViewRanges<IntView> xr(x[x.size()-1]); Iter::Ranges::NaryUnion u(r,vsr,xr); for (int i=x.size()-1; i--; ) { ViewRanges<IntView> xir(x[i]); u |= xir; } unsigned int s = Iter::Ranges::size(u); // To avoid overflow if (static_cast<unsigned int>(x.size()+vs.size()) < s) return x.size() + vs.size(); else return static_cast<int>(s); }
ExecStatus Prop<View>::propagate(Space& home, const ModEventDelta& med) { // Add assigned views to value set if (View::me(med) == ME_INT_VAL) add(home,vs,x); // Eliminate views from x eliminate(home); if (x.size() == 0) { // y must have values in the value set ValSet::Ranges vsr(vs); GECODE_ME_CHECK(y.inter_r(home,vsr,false)); return home.ES_SUBSUMED(*this); } // Constrain y to union of x and value set Region r(home); assert(x.size() > 0); ValSet::Ranges vsr(vs); ViewRanges<View> xsr(x[x.size()-1]); Iter::Ranges::NaryUnion u(r,vsr,xsr); for (int i=x.size()-1; i--; ) { ViewRanges<View> xir(x[i]); u |= xir; } GECODE_ME_CHECK(y.inter_r(home,u,false)); // Check whether all values in y are already in the value set if (vs.subset(y)) return home.ES_SUBSUMED(*this); return ES_FIX; }
ExecStatus ReProp<View,rm>::propagate(Space& home, const ModEventDelta& med) { // Add assigned views to value set if (View::me(med) == ME_INT_VAL) add(home,vs,x); if (b.one()) { if (rm == RM_PMI) return home.ES_SUBSUMED(*this); ValSet vsc(vs); vs.flush(); GECODE_REWRITE(*this,Prop<View>::post(home,vsc,x,y)); } if (b.zero()) { if (rm != RM_IMP) { ValSet::Ranges vsr(vs); GECODE_ME_CHECK(y.minus_r(home,vsr,false)); for (int i=x.size(); i--; ) GECODE_ES_CHECK(Rel::Nq<View>::post(home,x[i],y)); } return home.ES_SUBSUMED(*this); } // Eliminate views from x eliminate(home); switch (vs.compare(y)) { case Iter::Ranges::CS_SUBSET: if (rm != RM_IMP) GECODE_ME_CHECK(b.one(home)); return home.ES_SUBSUMED(*this); case Iter::Ranges::CS_DISJOINT: if (x.size() == 0) { if (rm != RM_PMI) GECODE_ME_CHECK(b.zero(home)); return home.ES_SUBSUMED(*this); } break; case Iter::Ranges::CS_NONE: break; default: GECODE_NEVER; } // Check whether y is in union of x and value set if (x.size() > 0) { Region r(home); ValSet::Ranges vsr(vs); ViewRanges<View> xsr(x[x.size()-1]); Iter::Ranges::NaryUnion u(r,vsr,xsr); for (int i=x.size()-1; i--; ) { ViewRanges<View> xir(x[i]); u |= xir; } ViewRanges<View> yr(y); if (Iter::Ranges::disjoint(u,yr)) { if (rm != RM_PMI) GECODE_ME_CHECK(b.zero(home)); return home.ES_SUBSUMED(*this); } } return ES_FIX; }