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;
 }
Example #2
0
 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;
   }
 }
Example #3
0
  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;
  }
Example #4
0
 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;
 }