Generated on Wed Nov 1 15:04:38 2006 for Gecode by doxygen 1.4.5

rel.cc

Go to the documentation of this file.
00001 /*
00002  *  Main authors:
00003  *     Christian Schulte <schulte@gecode.org>
00004  *     Gabor Szokoli <szokoli@gecode.org>
00005  *
00006  *  Copyright:
00007  *     Christian Schulte, 2002
00008  *     Gabor Szokoli, 2003
00009  *
00010  *  Last modified:
00011  *     $Date: 2006-08-31 17:36:38 +0200 (Thu, 31 Aug 2006) $ by $Author: schulte $
00012  *     $Revision: 3579 $
00013  *
00014  *  This file is part of Gecode, the generic constraint
00015  *  development environment:
00016  *     http://www.gecode.org
00017  *
00018  *  See the file "LICENSE" for information on usage and
00019  *  redistribution of this file, and for a
00020  *     DISCLAIMER OF ALL WARRANTIES.
00021  *
00022  */
00023 
00024 #include "gecode/int/rel.hh"
00025 
00026 #include <algorithm>
00027 
00028 namespace Gecode {
00029 
00030   using namespace Int;
00031 
00032   void
00033   rel(Space* home, IntVar x0, IntRelType r, int n, IntConLevel) {
00034     if (home->failed()) return;
00035     IntView x(x0);
00036     switch (r) {
00037     case IRT_EQ:
00038       GECODE_ME_FAIL(home,x.eq(home,n)); break;
00039     case IRT_NQ:
00040       GECODE_ME_FAIL(home,x.nq(home,n)); break;
00041     case IRT_LQ:
00042       GECODE_ME_FAIL(home,x.lq(home,n)); break;
00043     case IRT_LE:
00044       GECODE_ME_FAIL(home,x.le(home,n)); break;
00045     case IRT_GQ:
00046       GECODE_ME_FAIL(home,x.gq(home,n)); break;
00047     case IRT_GR:
00048       GECODE_ME_FAIL(home,x.gr(home,n)); break;
00049     default:
00050       throw UnknownRelation("Int::rel");
00051     }
00052   }
00053 
00054   void
00055   rel(Space* home, IntVar x0, IntRelType r, IntVar x1, IntConLevel icl) {
00056     if (home->failed()) return;
00057     switch (r) {
00058     case IRT_EQ:
00059       if (icl == ICL_BND) {
00060         GECODE_ES_FAIL(home,(Rel::EqBnd<IntView,IntView>::post(home,x0,x1)));
00061       } else {
00062         GECODE_ES_FAIL(home,(Rel::EqDom<IntView,IntView>::post(home,x0,x1)));
00063       }
00064       break;
00065     case IRT_NQ:
00066       GECODE_ES_FAIL(home,Rel::Nq<IntView>::post(home,x0,x1)); break;
00067     case IRT_GQ:
00068       std::swap(x0,x1); // Fall through
00069     case IRT_LQ:
00070       GECODE_ES_FAIL(home,Rel::Lq<IntView>::post(home,x0,x1)); break;
00071     case IRT_GR:
00072       std::swap(x0,x1); // Fall through
00073     case IRT_LE:
00074       GECODE_ES_FAIL(home,Rel::Le<IntView>::post(home,x0,x1)); break;
00075     default:
00076       throw UnknownRelation("Int::rel");
00077     }
00078   }
00079 
00080 
00081   void
00082   rel(Space* home, IntVar x0, IntRelType r, IntVar x1, BoolVar b,
00083       IntConLevel icl) {
00084     if (home->failed()) return;
00085     switch (r) {
00086     case IRT_EQ:
00087       if (icl == ICL_BND) {
00088         GECODE_ES_FAIL(home,(Rel::ReEqBnd<IntView,BoolView>
00089                              ::post(home,x0,x1,b)));
00090       } else {
00091         GECODE_ES_FAIL(home,(Rel::ReEqDom<IntView,BoolView>
00092                              ::post(home,x0,x1,b)));
00093       }
00094       break;
00095     case IRT_NQ:
00096       {
00097         NegBoolView n(b);
00098         if (icl == ICL_BND) {
00099           GECODE_ES_FAIL(home,(Rel::ReEqBnd<IntView,NegBoolView>
00100                                ::post(home,x0,x1,n)));
00101         } else {
00102           GECODE_ES_FAIL(home,(Rel::ReEqDom<IntView,NegBoolView>
00103                                ::post(home,x0,x1,n)));
00104         }
00105       }
00106       break;
00107     case IRT_GQ:
00108       std::swap(x0,x1); // Fall through
00109     case IRT_LQ:
00110       GECODE_ES_FAIL(home,(Rel::ReLq<IntView,BoolView>::post(home,x0,x1,b)));
00111       break;
00112     case IRT_LE:
00113       std::swap(x0,x1); // Fall through
00114     case IRT_GR:
00115       {
00116         NegBoolView n(b);
00117         GECODE_ES_FAIL(home,(Rel::ReLq<IntView,NegBoolView>::post(home,x0,x1,n)));
00118       }
00119       break;
00120     default:
00121       throw UnknownRelation("Int::rel");
00122     }
00123   }
00124 
00125   void
00126   rel(Space* home, IntVar x, IntRelType r, int n, BoolVar b,
00127       IntConLevel icl) {
00128     if (home->failed()) return;
00129     switch (r) {
00130     case IRT_EQ:
00131       if (icl == ICL_BND) {
00132         GECODE_ES_FAIL(home,(Rel::ReEqBndInt<IntView,BoolView>
00133                              ::post(home,x,n,b)));
00134       } else {
00135         GECODE_ES_FAIL(home,(Rel::ReEqDomInt<IntView,BoolView>
00136                              ::post(home,x,n,b)));
00137       }
00138       break;
00139     case IRT_NQ:
00140       {
00141         NegBoolView nb(b);
00142         if (icl == ICL_BND) {
00143           GECODE_ES_FAIL(home,(Rel::ReEqBndInt<IntView,NegBoolView>
00144                                ::post(home,x,n,nb)));
00145         } else {
00146           GECODE_ES_FAIL(home,(Rel::ReEqDomInt<IntView,NegBoolView>
00147                                ::post(home,x,n,nb)));
00148         }
00149       }
00150       break;
00151     case IRT_LE:
00152       n--; // Fall through
00153     case IRT_LQ:
00154       GECODE_ES_FAIL(home,(Rel::ReLqInt<IntView,BoolView>
00155                            ::post(home,x,n,b)));
00156       break;
00157     case IRT_GQ:
00158       n--; // Fall through
00159     case IRT_GR:
00160       {
00161         NegBoolView nb(b);
00162         GECODE_ES_FAIL(home,(Rel::ReLqInt<IntView,NegBoolView>
00163                              ::post(home,x,n,nb)));
00164       }
00165       break;
00166     default:
00167       throw UnknownRelation("Int::rel");
00168     }
00169   }
00170 
00171   void
00172   eq(Space* home, IntVar x0, IntVar x1, IntConLevel icl) {
00173     if (home->failed()) return;
00174     if (icl == ICL_BND) {
00175       GECODE_ES_FAIL(home,(Rel::EqBnd<IntView,IntView>::post(home,x0,x1)));
00176     } else {
00177       GECODE_ES_FAIL(home,(Rel::EqDom<IntView,IntView>::post(home,x0,x1)));
00178     }
00179   }
00180 
00181   void
00182   eq(Space* home, IntVar x0, int n, IntConLevel) {
00183     if (home->failed()) return;
00184     IntView x(x0);
00185     GECODE_ME_FAIL(home,x.eq(home,n));
00186   }
00187 
00188   void
00189   eq(Space* home, IntVar x0, IntVar x1, BoolVar b, IntConLevel icl) {
00190     if (home->failed()) return;
00191     if (icl == ICL_BND) {
00192       GECODE_ES_FAIL(home,(Rel::ReEqBnd<IntView,BoolView>::post(home,x0,x1,b)));
00193     } else {
00194       GECODE_ES_FAIL(home,(Rel::ReEqDom<IntView,BoolView>::post(home,x0,x1,b)));
00195     }
00196   }
00197 
00198   void
00199   eq(Space* home, IntVar x, int n, BoolVar b, IntConLevel icl) {
00200     if (home->failed()) return;
00201     if (icl == ICL_BND) {
00202       GECODE_ES_FAIL(home,(Rel::ReEqBndInt<IntView,BoolView>::post(home,x,n,b)));
00203     } else {
00204       GECODE_ES_FAIL(home,(Rel::ReEqDomInt<IntView,BoolView>::post(home,x,n,b)));
00205     }
00206   }
00207 
00208   void
00209   eq(Space* home, const IntVarArgs& x, IntConLevel icl) {
00210     if (home->failed()) return;
00211     ViewArray<IntView> xv(home,x);
00212     if (icl == ICL_BND) {
00213       GECODE_ES_FAIL(home,Rel::NaryEqBnd<IntView>::post(home,xv));
00214     } else {
00215       GECODE_ES_FAIL(home,Rel::NaryEqDom<IntView>::post(home,xv));
00216     }
00217   }
00218 
00219 
00220   void
00221   rel(Space* home, const IntVarArgs& x, IntRelType r, const IntVarArgs& y,
00222       IntConLevel icl) {
00223     if (x.size() != y.size())
00224       throw ArgumentSizeMismatch("Int::rel");
00225     if (home->failed()) return;
00226 
00227     switch (r) {
00228     case IRT_GR: 
00229       {
00230         ViewArray<ViewTuple<IntView,2> > xy(home,x.size());
00231         for (int i = x.size(); i--; ) {
00232           xy[i][0]=y[i]; xy[i][1]=x[i];
00233         }
00234         GECODE_ES_FAIL(home,Rel::Lex<IntView>::post(home,xy,true));
00235       }
00236       break;
00237     case IRT_LE: 
00238       {
00239         ViewArray<ViewTuple<IntView,2> > xy(home,x.size());
00240         for (int i = x.size(); i--; ) {
00241           xy[i][0]=x[i]; xy[i][1]=y[i];
00242         }
00243         GECODE_ES_FAIL(home,Rel::Lex<IntView>::post(home,xy,true));
00244       }
00245       break;
00246     case IRT_GQ: 
00247       {
00248         ViewArray<ViewTuple<IntView,2> > xy(home,x.size());
00249         for (int i = x.size(); i--; ) {
00250           xy[i][0]=y[i]; xy[i][1]=x[i];
00251         }
00252         GECODE_ES_FAIL(home,Rel::Lex<IntView>::post(home,xy,false));
00253       }
00254       break;
00255     case IRT_LQ: 
00256       {
00257         ViewArray<ViewTuple<IntView,2> > xy(home,x.size());
00258         for (int i = x.size(); i--; ) {
00259           xy[i][0]=x[i]; xy[i][1]=y[i];
00260         }
00261         GECODE_ES_FAIL(home,Rel::Lex<IntView>::post(home,xy,false));
00262       }
00263       break;
00264     case IRT_EQ:
00265       if (icl == ICL_BND)
00266         for (int i=x.size(); i--; ) {
00267           GECODE_ES_FAIL(home,(Rel::EqBnd<IntView,IntView>
00268                                ::post(home,x[i],y[i])));
00269         }
00270       else
00271         for (int i=x.size(); i--; ) {
00272           GECODE_ES_FAIL(home,(Rel::EqDom<IntView,IntView>
00273                                ::post(home,x[i],y[i])));
00274         }
00275       break;
00276     case IRT_NQ: 
00277       {
00278         ViewArray<ViewTuple<IntView,2> > xy(home,x.size());
00279         for (int i = x.size(); i--; ) {
00280           xy[i][0]=x[i]; xy[i][1]=y[i];
00281         }
00282         GECODE_ES_FAIL(home,Rel::NaryNq<IntView>::post(home,xy));
00283       }
00284       break;
00285     default:
00286       throw UnknownRelation("Int::rel");
00287     }
00288   }
00289 
00290 }
00291 
00292 // STATISTICS: int-post
00293