ExecStatus edgefinding(Space& home, int c, TaskArray<Task>& t) { TaskViewArray<typename TaskTraits<Task>::TaskViewFwd> f(t); GECODE_ES_CHECK(edgefinding(home,c,f)); TaskViewArray<typename TaskTraits<Task>::TaskViewBwd> b(t); GECODE_ES_CHECK(edgefinding(home,c,b)); return ES_OK; }
ExecStatus ManProp<ManTask,Cap>::propagate(Space& home, const ModEventDelta& med) { // Only bounds changes? if (Int::IntView::me(med) != Int::ME_INT_DOM) GECODE_ES_CHECK(overload(home,c.max(),t)); GECODE_ES_CHECK(edgefinding(home,c.max(),t)); bool subsumed; ExecStatus es = basic(home,subsumed,c,t); GECODE_ES_CHECK(es); if (subsumed) return home.ES_SUBSUMED(*this); if (Cap::varderived() && c.assigned() && c.val()==1) { // Check that tasks do not overload resource for (int i=t.size(); i--; ) if (t[i].c() > 1) return ES_FAILED; // Rewrite to unary resource constraint TaskArray<typename TaskTraits<ManTask>::UnaryTask> ut(home,t.size()); for (int i=t.size(); i--;) ut[i]=t[i]; GECODE_REWRITE(*this, (Unary::ManProp<typename TaskTraits<ManTask>::UnaryTask> ::post(home(*this),ut))); } else { return es; } }
ExecStatus ManProp<ManTask,Cap,PL>::propagate(Space& home, const ModEventDelta& med) { // Only bounds changes? if (IntView::me(med) != ME_INT_DOM) GECODE_ES_CHECK(overload(home,c.max(),t)); if (PL::advanced) GECODE_ES_CHECK(edgefinding(home,c.max(),t)); if (PL::basic) GECODE_ES_CHECK(timetabling(home,*this,c,t)); if (Cap::varderived() && c.assigned() && (c.val() == 1)) { // Check that tasks do not overload resource for (int i=t.size(); i--; ) if (t[i].c() > 1) return ES_FAILED; // Rewrite to unary resource constraint TaskArray<typename TaskTraits<ManTask>::UnaryTask> ut(home,t.size()); for (int i=t.size(); i--;) ut[i]=t[i]; GECODE_REWRITE(*this, (Unary::ManProp<typename TaskTraits<ManTask>::UnaryTask,PL> ::post(home(*this),ut))); } if (!PL::basic && c.assigned()) GECODE_ES_CHECK(subsumed(home,*this,c.val(),t)); return ES_NOFIX; }
ExecStatus ManProp<ManTask>::propagate(Space& home, const ModEventDelta&) { GECODE_ES_CHECK(overload(home,t)); GECODE_ES_CHECK(detectable(home,t)); GECODE_ES_CHECK(notfirstnotlast(home,t)); GECODE_ES_CHECK(edgefinding(home,t)); GECODE_ES_CHECK(subsumed(home,*this,t)); return ES_NOFIX; }