Generated on Tue Apr 18 10:21:57 2017 for Gecode by doxygen 1.6.3

int-post.cpp

Go to the documentation of this file.
00001 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
00002 /*
00003  *  Main authors:
00004  *     Christian Schulte <schulte@gecode.org>
00005  *
00006  *  Copyright:
00007  *     Christian Schulte, 2002
00008  *
00009  *  Last modified:
00010  *     $Date: 2017-03-14 11:10:06 +0100 (Tue, 14 Mar 2017) $ by $Author: schulte $
00011  *     $Revision: 15576 $
00012  *
00013  *  This file is part of Gecode, the generic constraint
00014  *  development environment:
00015  *     http://www.gecode.org
00016  *
00017  *  Permission is hereby granted, free of charge, to any person obtaining
00018  *  a copy of this software and associated documentation files (the
00019  *  "Software"), to deal in the Software without restriction, including
00020  *  without limitation the rights to use, copy, modify, merge, publish,
00021  *  distribute, sublicense, and/or sell copies of the Software, and to
00022  *  permit persons to whom the Software is furnished to do so, subject to
00023  *  the following conditions:
00024  *
00025  *  The above copyright notice and this permission notice shall be
00026  *  included in all copies or substantial portions of the Software.
00027  *
00028  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
00029  *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00030  *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00031  *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
00032  *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
00033  *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
00034  *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00035  *
00036  */
00037 
00038 #include <algorithm>
00039 
00040 #include <gecode/int/rel.hh>
00041 #include <gecode/int/linear.hh>
00042 #include <gecode/int/div.hh>
00043 
00044 namespace Gecode { namespace Int { namespace Linear {
00045 
00047   forceinline void
00048   eliminate(Term<IntView>* t, int &n, long long int& d) {
00049     for (int i=n; i--; )
00050       if (t[i].x.assigned()) {
00051         long long int ax = t[i].a * static_cast<long long int>(t[i].x.val());
00052         if (Limits::overflow_sub(d,ax))
00053           throw OutOfLimits("Int::linear");
00054         d=d-ax; t[i]=t[--n];
00055       }
00056   }
00057 
00059   forceinline void
00060   rewrite(IntRelType &irt, long long int &d,
00061           Term<IntView>* &t_p, int &n_p,
00062           Term<IntView>* &t_n, int &n_n) {
00063     switch (irt) {
00064     case IRT_EQ: case IRT_NQ: case IRT_LQ:
00065       break;
00066     case IRT_LE:
00067       d--; irt = IRT_LQ;
00068       break;
00069     case IRT_GR:
00070       d++;
00071       /* fall through */
00072     case IRT_GQ:
00073       irt = IRT_LQ;
00074       std::swap(n_p,n_n); std::swap(t_p,t_n); d = -d;
00075       break;
00076     default:
00077       throw UnknownRelation("Int::linear");
00078     }
00079   }
00080 
00082   forceinline bool
00083   precision(Term<IntView>* t_p, int n_p,
00084             Term<IntView>* t_n, int n_n,
00085             long long int d) {
00086     long long int sl = 0;
00087     long long int su = 0;
00088 
00089     for (int i = n_p; i--; ) {
00090       long long int axmin =
00091         t_p[i].a * static_cast<long long int>(t_p[i].x.min());
00092       if (Limits::overflow_add(sl,axmin))
00093         throw OutOfLimits("Int::linear");
00094       sl = sl + axmin;
00095       long long int axmax =
00096         t_p[i].a * static_cast<long long int>(t_p[i].x.max());
00097       if (Limits::overflow_add(sl,axmax))
00098         throw OutOfLimits("Int::linear");
00099       su = su + axmax;
00100     }
00101     for (int i = n_n; i--; ) {
00102       long long int axmax =
00103         t_n[i].a * static_cast<long long int>(t_n[i].x.max());
00104       if (Limits::overflow_sub(sl,axmax))
00105         throw OutOfLimits("Int::linear");
00106       sl = sl - axmax;
00107       long long int axmin =
00108         t_n[i].a * static_cast<long long int>(t_n[i].x.min());
00109       if (Limits::overflow_sub(su,axmin))
00110         throw OutOfLimits("Int::linear");
00111       su = su - axmin;
00112     }
00113 
00114     bool is_ip = (sl >= Limits::min) && (su <= Limits::max);
00115 
00116     if (Limits::overflow_sub(sl,d))
00117       throw OutOfLimits("Int::linear");
00118     sl = sl - d;
00119     if (Limits::overflow_sub(su,d))
00120       throw OutOfLimits("Int::linear");
00121     su = su - d;
00122 
00123     is_ip = is_ip && (sl >= Limits::min) && (su <= Limits::max);
00124 
00125     for (int i = n_p; i--; ) {
00126       long long int axmin =
00127         t_p[i].a * static_cast<long long int>(t_p[i].x.min());
00128       if (Limits::overflow_sub(sl,axmin))
00129         throw OutOfLimits("Int::linear");
00130       if (sl - axmin < Limits::min)
00131         is_ip = false;
00132       long long int axmax =
00133         t_p[i].a * static_cast<long long int>(t_p[i].x.max());
00134       if (Limits::overflow_sub(su,axmax))
00135         throw OutOfLimits("Int::linear");
00136       if (su - axmax > Limits::max)
00137         is_ip = false;
00138     }
00139     for (int i = n_n; i--; ) {
00140       long long int axmin =
00141         t_n[i].a * static_cast<long long int>(t_n[i].x.min());
00142       if (Limits::overflow_add(sl,axmin))
00143         throw OutOfLimits("Int::linear");
00144       if (sl + axmin < Limits::min)
00145         is_ip = false;
00146       long long int axmax =
00147         t_n[i].a * static_cast<long long int>(t_n[i].x.max());
00148       if (Limits::overflow_add(su,axmax))
00149         throw OutOfLimits("Int::linear");
00150       if (su + axmax > Limits::max)
00151         is_ip = false;
00152     }
00153     return is_ip;
00154   }
00155 
00160   template<class Val, class View>
00161   forceinline void
00162   post_nary(Home home,
00163             ViewArray<View>& x, ViewArray<View>& y, IntRelType irt, Val c) {
00164     switch (irt) {
00165     case IRT_EQ:
00166       GECODE_ES_FAIL((Eq<Val,View,View >::post(home,x,y,c)));
00167       break;
00168     case IRT_NQ:
00169       GECODE_ES_FAIL((Nq<Val,View,View >::post(home,x,y,c)));
00170       break;
00171     case IRT_LQ:
00172       GECODE_ES_FAIL((Lq<Val,View,View >::post(home,x,y,c)));
00173       break;
00174     default: GECODE_NEVER;
00175     }
00176   }
00177 
00178 
00180 #define GECODE_INT_PL_BIN(CLASS)                                             \
00181   switch (n_p) {                                                             \
00182   case 2:                                                                    \
00183     GECODE_ES_FAIL((CLASS<int,IntView,IntView>::post                         \
00184                          (home,t_p[0].x,t_p[1].x,c)));                       \
00185     break;                                                                   \
00186   case 1:                                                                    \
00187     GECODE_ES_FAIL((CLASS<int,IntView,MinusView>::post                       \
00188                          (home,t_p[0].x,MinusView(t_n[0].x),c)));            \
00189     break;                                                                   \
00190   case 0:                                                                    \
00191     GECODE_ES_FAIL((CLASS<int,MinusView,MinusView>::post                     \
00192                          (home,MinusView(t_n[0].x),MinusView(t_n[1].x),c))); \
00193     break;                                                                   \
00194   default: GECODE_NEVER;                                                     \
00195   }
00196 
00198 #define GECODE_INT_PL_TER(CLASS)                                        \
00199   switch (n_p) {                                                        \
00200   case 3:                                                               \
00201     GECODE_ES_FAIL((CLASS<int,IntView,IntView,IntView>::post            \
00202                          (home,t_p[0].x,t_p[1].x,t_p[2].x,c)));         \
00203     break;                                                              \
00204   case 2:                                                               \
00205     GECODE_ES_FAIL((CLASS<int,IntView,IntView,MinusView>::post          \
00206                          (home,t_p[0].x,t_p[1].x,                       \
00207                           MinusView(t_n[0].x),c)));                     \
00208     break;                                                              \
00209   case 1:                                                               \
00210     GECODE_ES_FAIL((CLASS<int,IntView,MinusView,MinusView>::post        \
00211                          (home,t_p[0].x,                                \
00212                           MinusView(t_n[0].x),MinusView(t_n[1].x),c))); \
00213     break;                                                              \
00214   case 0:                                                               \
00215     GECODE_ES_FAIL((CLASS<int,MinusView,MinusView,MinusView>::post      \
00216                          (home,MinusView(t_n[0].x),                     \
00217                           MinusView(t_n[1].x),MinusView(t_n[2].x),c))); \
00218     break;                                                              \
00219   default: GECODE_NEVER;                                                \
00220   }
00221 
00222   void
00223   post(Home home, Term<IntView>* t, int n, IntRelType irt, int c,
00224        IntPropLevel ipl) {
00225 
00226     Limits::check(c,"Int::linear");
00227 
00228     long long int d = c;
00229 
00230     eliminate(t,n,d);
00231 
00232     Term<IntView> *t_p, *t_n;
00233     int n_p, n_n, gcd=1;
00234     bool is_unit = normalize<IntView>(t,n,t_p,n_p,t_n,n_n,gcd);
00235 
00236     rewrite(irt,d,t_p,n_p,t_n,n_n);
00237 
00238     // Divide by gcd
00239     if (gcd > 1) {
00240       switch (irt) {
00241       case IRT_EQ:
00242         if ((d % gcd) != 0) {
00243           home.fail();
00244           return;
00245         }
00246         d /= gcd;
00247         break;
00248       case IRT_NQ:
00249         if ((d % gcd) != 0)
00250           return;
00251         d /= gcd;
00252         break;
00253       case IRT_LQ:
00254         d = floor_div_xp(d,static_cast<long long int>(gcd));
00255         break;
00256       default: GECODE_NEVER;
00257       }
00258     }
00259 
00260     if (n == 0) {
00261       switch (irt) {
00262       case IRT_EQ: if (d != 0) home.fail(); break;
00263       case IRT_NQ: if (d == 0) home.fail(); break;
00264       case IRT_LQ: if (d < 0)  home.fail(); break;
00265       default: GECODE_NEVER;
00266       }
00267       return;
00268     }
00269 
00270     if (n == 1) {
00271       if (n_p == 1) {
00272         LLongScaleView y(t_p[0].a,t_p[0].x);
00273         switch (irt) {
00274         case IRT_EQ: GECODE_ME_FAIL(y.eq(home,d)); break;
00275         case IRT_NQ: GECODE_ME_FAIL(y.nq(home,d)); break;
00276         case IRT_LQ: GECODE_ME_FAIL(y.lq(home,d)); break;
00277         default: GECODE_NEVER;
00278         }
00279       } else {
00280         LLongScaleView y(t_n[0].a,t_n[0].x);
00281         switch (irt) {
00282         case IRT_EQ: GECODE_ME_FAIL(y.eq(home,-d)); break;
00283         case IRT_NQ: GECODE_ME_FAIL(y.nq(home,-d)); break;
00284         case IRT_LQ: GECODE_ME_FAIL(y.gq(home,-d)); break;
00285         default: GECODE_NEVER;
00286         }
00287       }
00288       return;
00289     }
00290 
00291     bool is_ip = precision(t_p,n_p,t_n,n_n,d);
00292 
00293     if (is_unit && is_ip &&
00294         (vbd(ipl) != IPL_DOM) && (vbd(ipl) != IPL_DEF)) {
00295       // Unit coefficients with integer precision
00296       c = static_cast<int>(d);
00297       if (n == 2) {
00298         switch (irt) {
00299         case IRT_EQ: GECODE_INT_PL_BIN(EqBin); break;
00300         case IRT_NQ: GECODE_INT_PL_BIN(NqBin); break;
00301         case IRT_LQ: GECODE_INT_PL_BIN(LqBin); break;
00302         default: GECODE_NEVER;
00303         }
00304       } else if (n == 3) {
00305         switch (irt) {
00306         case IRT_EQ: GECODE_INT_PL_TER(EqTer); break;
00307         case IRT_NQ: GECODE_INT_PL_TER(NqTer); break;
00308         case IRT_LQ: GECODE_INT_PL_TER(LqTer); break;
00309         default: GECODE_NEVER;
00310         }
00311       } else {
00312         ViewArray<IntView> x(home,n_p);
00313         for (int i = n_p; i--; )
00314           x[i] = t_p[i].x;
00315         ViewArray<IntView> y(home,n_n);
00316         for (int i = n_n; i--; )
00317           y[i] = t_n[i].x;
00318         post_nary<int,IntView>(home,x,y,irt,c);
00319       }
00320     } else if (is_ip) {
00321       if ((n==2) && is_unit &&
00322           ((vbd(ipl) == IPL_DOM) || (vbd(ipl) == IPL_DEF)) &&
00323           (irt == IRT_EQ)) {
00324         // Binary domain-consistent equality
00325         c = static_cast<int>(d);
00326         if (c == 0) {
00327           switch (n_p) {
00328           case 2: {
00329             IntView x(t_p[0].x);
00330             MinusView y(t_p[1].x);
00331             GECODE_ES_FAIL(
00332               (Rel::EqDom<IntView,MinusView>::post(home,x,y)));
00333             break;
00334           }
00335           case 1: {
00336             IntView x(t_p[0].x);
00337             IntView y(t_n[0].x);
00338             GECODE_ES_FAIL(
00339               (Rel::EqDom<IntView,IntView>::post(home,x,y)));
00340             break;
00341           }
00342           case 0: {
00343             IntView x(t_n[0].x);
00344             MinusView y(t_n[1].x);
00345             GECODE_ES_FAIL(
00346               (Rel::EqDom<IntView,MinusView>::post(home,x,y)));
00347             break;
00348           }
00349           default:
00350             GECODE_NEVER;
00351           }
00352         } else {
00353           switch (n_p) {
00354           case 2: {
00355             MinusView x(t_p[0].x);
00356             OffsetView y(t_p[1].x, -c);
00357             GECODE_ES_FAIL(
00358               (Rel::EqDom<MinusView,OffsetView>::post(home,x,y)));
00359             break;
00360           }
00361           case 1: {
00362             IntView x(t_p[0].x);
00363             OffsetView y(t_n[0].x, c);
00364             GECODE_ES_FAIL(
00365               (Rel::EqDom<IntView,OffsetView>::post(home,x,y)));
00366             break;
00367           }
00368           case 0: {
00369             MinusView x(t_n[0].x);
00370             OffsetView y(t_n[1].x, c);
00371             GECODE_ES_FAIL(
00372               (Rel::EqDom<MinusView,OffsetView>::post(home,x,y)));
00373             break;
00374           }
00375           default:
00376             GECODE_NEVER;
00377           }
00378         }
00379       } else {
00380         // Arbitrary coefficients with integer precision
00381         c = static_cast<int>(d);
00382         ViewArray<IntScaleView> x(home,n_p);
00383         for (int i = n_p; i--; )
00384           x[i] = IntScaleView(t_p[i].a,t_p[i].x);
00385         ViewArray<IntScaleView> y(home,n_n);
00386         for (int i = n_n; i--; )
00387           y[i] = IntScaleView(t_n[i].a,t_n[i].x);
00388         if ((vbd(ipl) == IPL_DOM) && (irt == IRT_EQ)) {
00389           GECODE_ES_FAIL((DomEq<int,IntScaleView>::post(home,x,y,c)));
00390         } else {
00391           post_nary<int,IntScaleView>(home,x,y,irt,c);
00392         }
00393       }
00394     } else {
00395       // Arbitrary coefficients with long long precision
00396       ViewArray<LLongScaleView> x(home,n_p);
00397       for (int i = n_p; i--; )
00398         x[i] = LLongScaleView(t_p[i].a,t_p[i].x);
00399       ViewArray<LLongScaleView> y(home,n_n);
00400       for (int i = n_n; i--; )
00401         y[i] = LLongScaleView(t_n[i].a,t_n[i].x);
00402       if ((vbd(ipl) == IPL_DOM) && (irt == IRT_EQ)) {
00403         GECODE_ES_FAIL((DomEq<long long int,LLongScaleView>
00404                         ::post(home,x,y,d)));
00405       } else {
00406         post_nary<long long int,LLongScaleView>(home,x,y,irt,d);
00407       }
00408     }
00409   }
00410 
00411 #undef GECODE_INT_PL_BIN
00412 #undef GECODE_INT_PL_TER
00413 
00414 
00419   template<class Val, class View>
00420   forceinline void
00421   post_nary(Home home,
00422             ViewArray<View>& x, ViewArray<View>& y,
00423             IntRelType irt, Val c, Reify r) {
00424     switch (irt) {
00425     case IRT_EQ:
00426       switch (r.mode()) {
00427       case RM_EQV:
00428         GECODE_ES_FAIL((ReEq<Val,View,View,BoolView,RM_EQV>::
00429                         post(home,x,y,c,r.var())));
00430         break;
00431       case RM_IMP:
00432         GECODE_ES_FAIL((ReEq<Val,View,View,BoolView,RM_IMP>::
00433                         post(home,x,y,c,r.var())));
00434         break;
00435       case RM_PMI:
00436         GECODE_ES_FAIL((ReEq<Val,View,View,BoolView,RM_PMI>::
00437                         post(home,x,y,c,r.var())));
00438         break;
00439       default: GECODE_NEVER;
00440       }
00441       break;
00442     case IRT_NQ:
00443       {
00444         NegBoolView n(r.var());
00445         switch (r.mode()) {
00446         case RM_EQV:
00447           GECODE_ES_FAIL((ReEq<Val,View,View,NegBoolView,RM_EQV>::
00448                           post(home,x,y,c,n)));
00449           break;
00450         case RM_IMP:
00451           GECODE_ES_FAIL((ReEq<Val,View,View,NegBoolView,RM_PMI>::
00452                           post(home,x,y,c,n)));
00453           break;
00454         case RM_PMI:
00455           GECODE_ES_FAIL((ReEq<Val,View,View,NegBoolView,RM_IMP>::
00456                           post(home,x,y,c,n)));
00457           break;
00458         default: GECODE_NEVER;
00459         }
00460       }
00461       break;
00462     case IRT_LQ:
00463         switch (r.mode()) {
00464         case RM_EQV:
00465           GECODE_ES_FAIL((ReLq<Val,View,View,RM_EQV>::
00466                           post(home,x,y,c,r.var())));
00467           break;
00468         case RM_IMP:
00469           GECODE_ES_FAIL((ReLq<Val,View,View,RM_IMP>::
00470                           post(home,x,y,c,r.var())));
00471           break;
00472         case RM_PMI:
00473           GECODE_ES_FAIL((ReLq<Val,View,View,RM_PMI>::
00474                           post(home,x,y,c,r.var())));
00475           break;
00476         default: GECODE_NEVER;
00477         }
00478       break;
00479     default: GECODE_NEVER;
00480     }
00481   }
00482 
00483   template<class CtrlView>
00484   forceinline void
00485   posteqint(Home home, IntView& x, int c, CtrlView b, ReifyMode rm,
00486             IntPropLevel ipl) {
00487     if ((vbd(ipl) == IPL_DOM) || (vbd(ipl) == IPL_DEF)) {
00488       switch (rm) {
00489       case RM_EQV:
00490         GECODE_ES_FAIL((Rel::ReEqDomInt<IntView,CtrlView,RM_EQV>::
00491                         post(home,x,c,b)));
00492         break;
00493       case RM_IMP:
00494         GECODE_ES_FAIL((Rel::ReEqDomInt<IntView,CtrlView,RM_IMP>::
00495                         post(home,x,c,b)));
00496         break;
00497       case RM_PMI:
00498         GECODE_ES_FAIL((Rel::ReEqDomInt<IntView,CtrlView,RM_PMI>::
00499                         post(home,x,c,b)));
00500         break;
00501       default: GECODE_NEVER;
00502       }
00503     } else {
00504       switch (rm) {
00505       case RM_EQV:
00506         GECODE_ES_FAIL((Rel::ReEqBndInt<IntView,CtrlView,RM_EQV>::
00507                         post(home,x,c,b)));
00508         break;
00509       case RM_IMP:
00510         GECODE_ES_FAIL((Rel::ReEqBndInt<IntView,CtrlView,RM_IMP>::
00511                         post(home,x,c,b)));
00512         break;
00513       case RM_PMI:
00514         GECODE_ES_FAIL((Rel::ReEqBndInt<IntView,CtrlView,RM_PMI>::
00515                         post(home,x,c,b)));
00516         break;
00517       default: GECODE_NEVER;
00518       }
00519     }
00520   }
00521 
00522   void
00523   post(Home home,
00524        Term<IntView>* t, int n, IntRelType irt, int c, Reify r,
00525        IntPropLevel ipl) {
00526     Limits::check(c,"Int::linear");
00527     long long int d = c;
00528 
00529     eliminate(t,n,d);
00530 
00531     Term<IntView> *t_p, *t_n;
00532     int n_p, n_n, gcd=1;
00533     bool is_unit = normalize<IntView>(t,n,t_p,n_p,t_n,n_n,gcd);
00534 
00535     rewrite(irt,d,t_p,n_p,t_n,n_n);
00536 
00537     // Divide by gcd
00538     if (gcd > 1) {
00539       switch (irt) {
00540       case IRT_EQ:
00541         if ((d % gcd) != 0) {
00542           if (r.mode() != RM_PMI)
00543             GECODE_ME_FAIL(BoolView(r.var()).zero(home));
00544           return;
00545         }
00546         d /= gcd;
00547         break;
00548       case IRT_NQ:
00549         if ((d % gcd) != 0) {
00550           if (r.mode() != RM_IMP)
00551             GECODE_ME_FAIL(BoolView(r.var()).one(home));
00552           return;
00553         }
00554         d /= gcd;
00555         break;
00556       case IRT_LQ:
00557         d = floor_div_xp(d,static_cast<long long int>(gcd));
00558         break;
00559       default: GECODE_NEVER;
00560       }
00561     }
00562 
00563     if (n == 0) {
00564       bool fail = false;
00565       switch (irt) {
00566       case IRT_EQ: fail = (d != 0); break;
00567       case IRT_NQ: fail = (d == 0); break;
00568       case IRT_LQ: fail = (0 > d); break;
00569       default: GECODE_NEVER;
00570       }
00571       if (fail) {
00572         if (r.mode() != RM_PMI)
00573           GECODE_ME_FAIL(BoolView(r.var()).zero(home));
00574       } else {
00575         if (r.mode() != RM_IMP)
00576           GECODE_ME_FAIL(BoolView(r.var()).one(home));
00577       }
00578       return;
00579     }
00580 
00581     bool is_ip = precision(t_p,n_p,t_n,n_n,d);
00582 
00583     if (is_unit && is_ip) {
00584       c = static_cast<int>(d);
00585       if (n == 1) {
00586         switch (irt) {
00587         case IRT_EQ:
00588           if (n_p == 1) {
00589             posteqint<BoolView>(home,t_p[0].x,c,r.var(),r.mode(),ipl);
00590           } else {
00591             posteqint<BoolView>(home,t_p[0].x,-c,r.var(),r.mode(),ipl);
00592           }
00593           break;
00594         case IRT_NQ:
00595           {
00596             NegBoolView nb(r.var());
00597             ReifyMode rm = r.mode();
00598             switch (rm) {
00599             case RM_IMP: rm = RM_PMI; break;
00600             case RM_PMI: rm = RM_IMP; break;
00601             default: ;
00602             }
00603             if (n_p == 1) {
00604               posteqint<NegBoolView>(home,t_p[0].x,c,nb,rm,ipl);
00605             } else {
00606               posteqint<NegBoolView>(home,t_p[0].x,-c,nb,rm,ipl);
00607             }
00608           }
00609           break;
00610         case IRT_LQ:
00611           if (n_p == 1) {
00612             switch (r.mode()) {
00613             case RM_EQV:
00614               GECODE_ES_FAIL((Rel::ReLqInt<IntView,BoolView,RM_EQV>::
00615                               post(home,t_p[0].x,c,r.var())));
00616               break;
00617             case RM_IMP:
00618               GECODE_ES_FAIL((Rel::ReLqInt<IntView,BoolView,RM_IMP>::
00619                               post(home,t_p[0].x,c,r.var())));
00620               break;
00621             case RM_PMI:
00622               GECODE_ES_FAIL((Rel::ReLqInt<IntView,BoolView,RM_PMI>::
00623                               post(home,t_p[0].x,c,r.var())));
00624               break;
00625             default: GECODE_NEVER;
00626             }
00627           } else {
00628             NegBoolView nb(r.var());
00629             switch (r.mode()) {
00630             case RM_EQV:
00631               GECODE_ES_FAIL((Rel::ReLqInt<IntView,NegBoolView,RM_EQV>::
00632                               post(home,t_n[0].x,-c-1,nb)));
00633               break;
00634             case RM_IMP:
00635               GECODE_ES_FAIL((Rel::ReLqInt<IntView,NegBoolView,RM_PMI>::
00636                               post(home,t_n[0].x,-c-1,nb)));
00637               break;
00638             case RM_PMI:
00639               GECODE_ES_FAIL((Rel::ReLqInt<IntView,NegBoolView,RM_IMP>::
00640                               post(home,t_n[0].x,-c-1,nb)));
00641               break;
00642             default: GECODE_NEVER;
00643             }
00644           }
00645           break;
00646         default: GECODE_NEVER;
00647         }
00648       } else if (n == 2) {
00649         switch (irt) {
00650         case IRT_EQ:
00651           switch (n_p) {
00652           case 2:
00653             switch (r.mode()) {
00654             case RM_EQV:
00655               GECODE_ES_FAIL((ReEqBin<int,IntView,IntView,BoolView,RM_EQV>::
00656                               post(home,t_p[0].x,t_p[1].x,c,r.var())));
00657               break;
00658             case RM_IMP:
00659               GECODE_ES_FAIL((ReEqBin<int,IntView,IntView,BoolView,RM_IMP>::
00660                               post(home,t_p[0].x,t_p[1].x,c,r.var())));
00661               break;
00662             case RM_PMI:
00663               GECODE_ES_FAIL((ReEqBin<int,IntView,IntView,BoolView,RM_PMI>::
00664                               post(home,t_p[0].x,t_p[1].x,c,r.var())));
00665               break;
00666             default: GECODE_NEVER;
00667             }
00668             break;
00669           case 1:
00670             switch (r.mode()) {
00671             case RM_EQV:
00672               GECODE_ES_FAIL((ReEqBin<int,IntView,MinusView,BoolView,RM_EQV>::
00673                               post(home,t_p[0].x,MinusView(t_n[0].x),c,
00674                                    r.var())));
00675               break;
00676             case RM_IMP:
00677               GECODE_ES_FAIL((ReEqBin<int,IntView,MinusView,BoolView,RM_IMP>::
00678                               post(home,t_p[0].x,MinusView(t_n[0].x),c,
00679                                    r.var())));
00680               break;
00681             case RM_PMI:
00682               GECODE_ES_FAIL((ReEqBin<int,IntView,MinusView,BoolView,RM_PMI>::
00683                               post(home,t_p[0].x,MinusView(t_n[0].x),c,
00684                                    r.var())));
00685               break;
00686             default: GECODE_NEVER;
00687             }
00688             break;
00689           case 0:
00690             switch (r.mode()) {
00691             case RM_EQV:
00692               GECODE_ES_FAIL((ReEqBin<int,IntView,IntView,BoolView,RM_EQV>::
00693                               post(home,t_n[0].x,t_n[1].x,-c,r.var())));
00694               break;
00695             case RM_IMP:
00696               GECODE_ES_FAIL((ReEqBin<int,IntView,IntView,BoolView,RM_IMP>::
00697                               post(home,t_n[0].x,t_n[1].x,-c,r.var())));
00698               break;
00699             case RM_PMI:
00700               GECODE_ES_FAIL((ReEqBin<int,IntView,IntView,BoolView,RM_PMI>::
00701                               post(home,t_n[0].x,t_n[1].x,-c,r.var())));
00702               break;
00703             default: GECODE_NEVER;
00704             }
00705             break;
00706           default: GECODE_NEVER;
00707           }
00708           break;
00709         case IRT_NQ:
00710           {
00711             NegBoolView nb(r.var());
00712             switch (n_p) {
00713             case 2:
00714               switch (r.mode()) {
00715               case RM_EQV:
00716                 GECODE_ES_FAIL((ReEqBin<int,IntView,IntView,NegBoolView,RM_EQV>::
00717                                 post(home,t_p[0].x,t_p[1].x,c,nb)));
00718                 break;
00719               case RM_IMP:
00720                 GECODE_ES_FAIL((ReEqBin<int,IntView,IntView,NegBoolView,RM_PMI>::
00721                                 post(home,t_p[0].x,t_p[1].x,c,nb)));
00722                 break;
00723               case RM_PMI:
00724                 GECODE_ES_FAIL((ReEqBin<int,IntView,IntView,NegBoolView,RM_IMP>::
00725                                 post(home,t_p[0].x,t_p[1].x,c,nb)));
00726                 break;
00727               default: GECODE_NEVER;
00728               }
00729               break;
00730             case 1:
00731               switch (r.mode()) {
00732               case RM_EQV:
00733                 GECODE_ES_FAIL((ReEqBin<int,IntView,MinusView,NegBoolView,RM_EQV>::
00734                                 post(home,t_p[0].x,MinusView(t_n[0].x),c,nb)));
00735                 break;
00736               case RM_IMP:
00737                 GECODE_ES_FAIL((ReEqBin<int,IntView,MinusView,NegBoolView,RM_PMI>::
00738                                 post(home,t_p[0].x,MinusView(t_n[0].x),c,nb)));
00739                 break;
00740               case RM_PMI:
00741                 GECODE_ES_FAIL((ReEqBin<int,IntView,MinusView,NegBoolView,RM_IMP>::
00742                                 post(home,t_p[0].x,MinusView(t_n[0].x),c,nb)));
00743                 break;
00744               default: GECODE_NEVER;
00745               }
00746               break;
00747             case 0:
00748               switch (r.mode()) {
00749               case RM_EQV:
00750                 GECODE_ES_FAIL((ReEqBin<int,IntView,IntView,NegBoolView,RM_EQV>::
00751                                 post(home,t_p[0].x,t_p[1].x,-c,nb)));
00752                 break;
00753               case RM_IMP:
00754                 GECODE_ES_FAIL((ReEqBin<int,IntView,IntView,NegBoolView,RM_PMI>::
00755                                 post(home,t_p[0].x,t_p[1].x,-c,nb)));
00756                 break;
00757               case RM_PMI:
00758                 GECODE_ES_FAIL((ReEqBin<int,IntView,IntView,NegBoolView,RM_IMP>::
00759                                 post(home,t_p[0].x,t_p[1].x,-c,nb)));
00760                 break;
00761               default: GECODE_NEVER;
00762               }
00763               break;
00764             default: GECODE_NEVER;
00765             }
00766           }
00767           break;
00768         case IRT_LQ:
00769           switch (n_p) {
00770           case 2:
00771             switch (r.mode()) {
00772             case RM_EQV:
00773               GECODE_ES_FAIL((ReLqBin<int,IntView,IntView,RM_EQV>::
00774                               post(home,t_p[0].x,t_p[1].x,c,r.var())));
00775               break;
00776             case RM_IMP:
00777               GECODE_ES_FAIL((ReLqBin<int,IntView,IntView,RM_IMP>::
00778                               post(home,t_p[0].x,t_p[1].x,c,r.var())));
00779               break;
00780             case RM_PMI:
00781               GECODE_ES_FAIL((ReLqBin<int,IntView,IntView,RM_PMI>::
00782                               post(home,t_p[0].x,t_p[1].x,c,r.var())));
00783               break;
00784             default: GECODE_NEVER;
00785             }
00786             break;
00787           case 1:
00788             switch (r.mode()) {
00789             case RM_EQV:
00790               GECODE_ES_FAIL((ReLqBin<int,IntView,MinusView,RM_EQV>::
00791                               post(home,t_p[0].x,MinusView(t_n[0].x),c,
00792                                    r.var())));
00793               break;
00794             case RM_IMP:
00795               GECODE_ES_FAIL((ReLqBin<int,IntView,MinusView,RM_IMP>::
00796                               post(home,t_p[0].x,MinusView(t_n[0].x),c,
00797                                    r.var())));
00798               break;
00799             case RM_PMI:
00800               GECODE_ES_FAIL((ReLqBin<int,IntView,MinusView,RM_PMI>::
00801                               post(home,t_p[0].x,MinusView(t_n[0].x),c,
00802                                    r.var())));
00803               break;
00804             default: GECODE_NEVER;
00805             }
00806             break;
00807           case 0:
00808             switch (r.mode()) {
00809             case RM_EQV:
00810               GECODE_ES_FAIL((ReLqBin<int,MinusView,MinusView,RM_EQV>::
00811                               post(home,MinusView(t_n[0].x),
00812                                    MinusView(t_n[1].x),c,r.var())));
00813               break;
00814             case RM_IMP:
00815               GECODE_ES_FAIL((ReLqBin<int,MinusView,MinusView,RM_IMP>::
00816                               post(home,MinusView(t_n[0].x),
00817                                    MinusView(t_n[1].x),c,r.var())));
00818               break;
00819             case RM_PMI:
00820               GECODE_ES_FAIL((ReLqBin<int,MinusView,MinusView,RM_PMI>::
00821                               post(home,MinusView(t_n[0].x),
00822                                    MinusView(t_n[1].x),c,r.var())));
00823               break;
00824             default: GECODE_NEVER;
00825             }
00826             break;
00827           default: GECODE_NEVER;
00828           }
00829           break;
00830         default: GECODE_NEVER;
00831         }
00832       } else {
00833         ViewArray<IntView> x(home,n_p);
00834         for (int i = n_p; i--; )
00835           x[i] = t_p[i].x;
00836         ViewArray<IntView> y(home,n_n);
00837         for (int i = n_n; i--; )
00838           y[i] = t_n[i].x;
00839         post_nary<int,IntView>(home,x,y,irt,c,r);
00840       }
00841     } else if (is_ip) {
00842       // Arbitrary coefficients with integer precision
00843       c = static_cast<int>(d);
00844       ViewArray<IntScaleView> x(home,n_p);
00845       for (int i = n_p; i--; )
00846         x[i] = IntScaleView(t_p[i].a,t_p[i].x);
00847       ViewArray<IntScaleView> y(home,n_n);
00848       for (int i = n_n; i--; )
00849         y[i] = IntScaleView(t_n[i].a,t_n[i].x);
00850       post_nary<int,IntScaleView>(home,x,y,irt,c,r);
00851     } else {
00852       // Arbitrary coefficients with long long precision
00853       ViewArray<LLongScaleView> x(home,n_p);
00854       for (int i = n_p; i--; )
00855         x[i] = LLongScaleView(t_p[i].a,t_p[i].x);
00856       ViewArray<LLongScaleView> y(home,n_n);
00857       for (int i = n_n; i--; )
00858         y[i] = LLongScaleView(t_n[i].a,t_n[i].x);
00859       post_nary<long long int,LLongScaleView>(home,x,y,irt,d,r);
00860     }
00861   }
00862 
00863 }}}
00864 
00865 // STATISTICS: int-post