Beispiel #1
0
 ExecStatus
 Nq<View>::post(Home home, View x0, View x1){
   if (x0.assigned()) {
     GECODE_ME_CHECK(x1.nq(home,x0.val()));
   } else if (x1.assigned()) {
     GECODE_ME_CHECK(x0.nq(home,x1.val()));
   } else if (same(x0,x1)) {
     return ES_FAILED;
   } else {
     (void) new (home) Nq<View>(home,x0,x1);
   }
   return ES_OK;
 }
Beispiel #2
0
 ExecStatus
 NqFloat<View>::post(Home home, View x, FloatVal c){
   if (x.assigned()) {
     if (overlap(x.val(),c))
       return ES_FAILED;
   } else {
     (void) new (home) NqFloat<View>(home,x,c);
   }
   return ES_OK;
 }
Beispiel #3
0
  ExecStatus
  Mult<View>::post(Home home, View x0, View x1, View x2) {
    if (same(x0,x1))
      return Sqr<View>::post(home,x0,x2);
    if (same(x0,x2))
      return MultZeroOne<View>::post(home,x0,x1);
    if (same(x1,x2))
      return MultZeroOne<View>::post(home,x1,x0);
    if (pos(x0)) {
      if (pos(x1) || pos(x2)) goto post_ppp;
      if (neg(x1) || neg(x2)) goto post_pnn;
    } else if (neg(x0)) {
      if (neg(x1) || pos(x2)) goto post_nnp;
      if (pos(x1) || neg(x2)) goto post_npn;
    } else if (pos(x1)) {
      if (pos(x2)) goto post_ppp;
      if (neg(x2)) goto post_npn;
    } else if (neg(x1)) {
      if (pos(x2)) goto post_nnp;
      if (neg(x2)) goto post_pnn;
    }
    {
      GECODE_ME_CHECK(x2.eq(home,x0.val()*x1.val()));
      (void) new (home) Mult<View>(home,x0,x1,x2);
    }
    return ES_OK;

  post_ppp:
    return MultPlus<FloatView,FloatView,FloatView>::post(home,x0,x1,x2);
  post_nnp:
    return MultPlus<MinusView,MinusView,FloatView>::post(home,
      MinusView(x0),MinusView(x1),x2);
  post_pnn:
    std::swap(x0,x1);
  post_npn:
    return MultPlus<MinusView,FloatView,MinusView>::post(home,
      MinusView(x0),x1,MinusView(x2));
  }
Beispiel #4
0
 ExecStatus
 Watch<View>::post(Home home, View x0, View x1, unsigned int _x0Size) {
   if (x0.size() != _x0Size) {
     return ES_FAILED;
   } else if (x1.assigned()) {
     GECODE_ME_CHECK(x0.eq(home,x1.val()));
   } else {
     assert(!same(x0,x1));
     GECODE_ME_CHECK(x0.lq(home,x1.max()));
     GECODE_ME_CHECK(x1.lq(home,x0.max()));
     GECODE_ME_CHECK(x0.gq(home,x1.min()));
     GECODE_ME_CHECK(x1.gq(home,x0.min()));
     assert(x0.size() == x1.size());
     (void) new (home) Watch<View>(home,x0,x1,_x0Size);
   }
   return ES_OK;
 }
Beispiel #5
0
 ExecStatus
 ReEqFloat<View,CtrlView,rm>::post(Home home, View x, FloatVal c, CtrlView b) {
   if (b.one()) {
     if (rm != RM_PMI)
       GECODE_ME_CHECK(x.eq(home,c));
   } else if (x.assigned()) {
     if (overlap(x.val(),c)) {
       if (rm != RM_IMP)
         GECODE_ME_CHECK(b.one(home));
     } else {
       if (rm != RM_PMI)
         GECODE_ME_CHECK(b.zero(home));
     }
   } else {
     (void) new (home) ReEqFloat(home,x,c,b);
   }
   return ES_OK;
 }
Beispiel #6
0
 forceinline bool
 assigned(View x, int v) {
   return x.assigned() && (x.val() == v);
 }