Example #1
0
// domain is 0..|cards|- 1
void count(Home home, const IntVarArgs& x, const IntSetArgs& c,
           IntConLevel icl) {
    IntArgs values(c.size());
    for (int i = c.size(); i--; )
        values[i] = i;
    count(home, x, c, values, icl);
}
Example #2
0
 void
 element(Home home, const IntSetArgs& a,
         IntVar x, int w, IntVar y, int h, SetVar z) {
   if (a.size() == 0)
     throw Set::TooFewArguments("Set::element");
   if (a.size() != w*h)
     throw Set::ArgumentSizeMismatch("Set::element");
   GECODE_POST;
   element(home, a, pair(home,x,w,y,h), z);
 }
Example #3
0
 forceinline
 ElementUnionConst<SView,RView>::
 ElementUnionConst(Home home, SView y0,
                   const IntSetArgs& iv0,
                   RView y1)
   : Propagator(home), x0(y0), n_iv(iv0.size()), x1(y1) {
   home.notice(*this,AP_DISPOSE);
   x0.subscribe(home,*this, PC_SET_ANY);
   x1.subscribe(home,*this, PC_SET_ANY);
   iv=static_cast<Space&>(home).alloc<IntSet>(n_iv);
   for (unsigned int i=iv0.size(); i--;)
     iv[i]=iv0[i];
 }
Example #4
0
  void
  element(Home home, const IntSetArgs& x, IntVar y, SetVar z) {
    if (x.size() == 0)
      throw Set::TooFewArguments("Set::element");
    for (int i=x.size(); i--;)
      Set::Limits::check(x[i], "Set::element");
    GECODE_POST;
    SetView zv(z);

    Int::IntView yv(y);
    SingletonView single(yv);
    GECODE_ES_FAIL((Element::ElementUnionConst<SetView,
                         SingletonView>::post(home, z, x, single)));
  }
Example #5
0
  void
  element(Home home, SetOpType op, const IntSetArgs& x, SetVar y, SetVar z,
    const IntSet& universe) {
    GECODE_POST;

    switch (op) {
    case SOT_DUNION:
      {
        Set::Element::ElementDisjoint<ConstSetView,SetView>::IdxViewArray
          iv(home, x.size());
        for (int i=x.size(); i--;) {
          iv[i].idx = i; iv[i].view = ConstSetView(home, x[i]);
        }
        GECODE_ES_FAIL((Element::ElementDisjoint<ConstSetView,SetView>::
                        post(home,iv,y)));
      }
      // fall through
    case SOT_UNION:
      {
        GECODE_ES_FAIL(
                       (Element::ElementUnionConst<SetView,SetView>::
                        post(home,z,x,y)));
      }
      break;
    case SOT_INTER:
      {
        Set::Element::ElementIntersection<ConstSetView,
          SetView,SetView>::IdxViewArray iv(home, x.size());
        for (int i=x.size(); i--;) {
          iv[i].idx = i; iv[i].view = ConstSetView(home, x[i]);
        }
        GECODE_ES_FAIL(
          (Element::ElementIntersection<ConstSetView,SetView,SetView>::
            post(home,iv,y,z,universe)));
      }
      break;
    case SOT_MINUS:
      throw IllegalOperation("Set::element");
      break;
    default:
      throw UnknownOperation("Set::element");
    }

  }
Example #6
0
  ExecStatus
  ElementUnionConst<SView,RView>::
  post(Home home, SView x0, const IntSetArgs& xs,
       RView x1) {
    int n = xs.size();

    // s2 \subseteq {1,...,n}
    Iter::Ranges::Singleton s(0, n-1);
    GECODE_ME_CHECK(x1.intersectI(home,s));
    (void) new (home)
      ElementUnionConst<SView,RView>(home,x0,xs,x1);
    return ES_OK;
  }