Generated on Mon Aug 25 11:35:33 2008 for Gecode by doxygen 1.5.6

rel.cc

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: 2008-07-11 09:33:32 +0200 (Fri, 11 Jul 2008) $ by $Author: tack $
00011  *     $Revision: 7290 $
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 "gecode/int/rel.hh"
00039 #include "gecode/int/bool.hh"
00040 
00041 #include <algorithm>
00042 
00043 namespace Gecode {
00044 
00045   using namespace Int;
00046 
00047   void
00048   rel(Space* home, IntVar x0, IntRelType r, int n, 
00049       IntConLevel, PropKind) {
00050     Limits::check(n,"Int::rel");
00051     if (home->failed()) return;
00052     IntView x(x0);
00053     switch (r) {
00054     case IRT_EQ: GECODE_ME_FAIL(home,x.eq(home,n)); break;
00055     case IRT_NQ: GECODE_ME_FAIL(home,x.nq(home,n)); break;
00056     case IRT_LQ: GECODE_ME_FAIL(home,x.lq(home,n)); break;
00057     case IRT_LE: GECODE_ME_FAIL(home,x.le(home,n)); break;
00058     case IRT_GQ: GECODE_ME_FAIL(home,x.gq(home,n)); break;
00059     case IRT_GR: GECODE_ME_FAIL(home,x.gr(home,n)); break;
00060     default: throw UnknownRelation("Int::rel");
00061     }
00062   }
00063 
00064   void
00065   rel(Space* home, const IntVarArgs& x, IntRelType r, int n, 
00066       IntConLevel, PropKind) {
00067     Limits::check(n,"Int::rel");
00068     if (home->failed()) return;
00069     switch (r) {
00070     case IRT_EQ: 
00071       for (int i=x.size(); i--; ) {
00072         IntView xi(x[i]); GECODE_ME_FAIL(home,xi.eq(home,n));
00073       }
00074       break;
00075     case IRT_NQ:
00076       for (int i=x.size(); i--; ) {
00077         IntView xi(x[i]); GECODE_ME_FAIL(home,xi.nq(home,n));
00078       }
00079       break;
00080     case IRT_LQ:
00081       for (int i=x.size(); i--; ) {
00082         IntView xi(x[i]); GECODE_ME_FAIL(home,xi.lq(home,n));
00083       }
00084       break;
00085     case IRT_LE:
00086       for (int i=x.size(); i--; ) {
00087         IntView xi(x[i]); GECODE_ME_FAIL(home,xi.le(home,n));
00088       }
00089       break;
00090     case IRT_GQ:
00091       for (int i=x.size(); i--; ) {
00092         IntView xi(x[i]); GECODE_ME_FAIL(home,xi.gq(home,n));
00093       }
00094       break;
00095     case IRT_GR:
00096       for (int i=x.size(); i--; ) {
00097         IntView xi(x[i]); GECODE_ME_FAIL(home,xi.gr(home,n));
00098       }
00099       break;
00100     default:
00101       throw UnknownRelation("Int::rel");
00102     }
00103   }
00104 
00105   void
00106   rel(Space* home, IntVar x0, IntRelType r, IntVar x1, 
00107       IntConLevel icl, PropKind) {
00108     if (home->failed()) return;
00109     switch (r) {
00110     case IRT_EQ:
00111       if ((icl == ICL_DOM) || (icl == ICL_DEF)) {
00112         GECODE_ES_FAIL(home,(Rel::EqDom<IntView,IntView>::post(home,x0,x1)));
00113       } else {
00114         GECODE_ES_FAIL(home,(Rel::EqBnd<IntView,IntView>::post(home,x0,x1)));
00115       }
00116       break;
00117     case IRT_NQ:
00118       GECODE_ES_FAIL(home,Rel::Nq<IntView>::post(home,x0,x1)); break;
00119     case IRT_GQ:
00120       std::swap(x0,x1); // Fall through
00121     case IRT_LQ:
00122       GECODE_ES_FAIL(home,Rel::Lq<IntView>::post(home,x0,x1)); break;
00123     case IRT_GR:
00124       std::swap(x0,x1); // Fall through
00125     case IRT_LE:
00126       GECODE_ES_FAIL(home,Rel::Le<IntView>::post(home,x0,x1)); break;
00127     default:
00128       throw UnknownRelation("Int::rel");
00129     }
00130   }
00131 
00132   void
00133   rel(Space* home, const IntVarArgs& x, IntRelType r, IntVar y, 
00134       IntConLevel icl, PropKind) {
00135     if (home->failed()) return;
00136     switch (r) {
00137     case IRT_EQ:
00138       {
00139         ViewArray<IntView> xv(home,x.size()+1);
00140         xv[x.size()]=y;
00141         for (int i=x.size(); i--; )
00142           xv[i]=x[i];
00143         if ((icl == ICL_DOM) || (icl == ICL_DEF)) {
00144           GECODE_ES_FAIL(home,Rel::NaryEqDom<IntView>::post(home,xv));
00145         } else {
00146           GECODE_ES_FAIL(home,Rel::NaryEqBnd<IntView>::post(home,xv));
00147         }
00148       }
00149       break;
00150     case IRT_NQ:
00151       for (int i=x.size(); i--; ) {
00152         GECODE_ES_FAIL(home,Rel::Nq<IntView>::post(home,x[i],y)); 
00153       }
00154       break;
00155     case IRT_GQ:
00156       for (int i=x.size(); i--; ) {
00157         GECODE_ES_FAIL(home,Rel::Lq<IntView>::post(home,y,x[i])); 
00158       }
00159       break;
00160     case IRT_LQ:
00161       for (int i=x.size(); i--; ) {
00162         GECODE_ES_FAIL(home,Rel::Lq<IntView>::post(home,x[i],y)); 
00163       }
00164       break;
00165     case IRT_GR:
00166       for (int i=x.size(); i--; ) {
00167         GECODE_ES_FAIL(home,Rel::Le<IntView>::post(home,y,x[i])); 
00168       }
00169       break;
00170     case IRT_LE:
00171       for (int i=x.size(); i--; ) {
00172         GECODE_ES_FAIL(home,Rel::Le<IntView>::post(home,x[i],y)); 
00173       }
00174       break;
00175     default:
00176       throw UnknownRelation("Int::rel");
00177     }
00178   }
00179 
00180 
00181   void
00182   rel(Space* home, IntVar x0, IntRelType r, IntVar x1, BoolVar b,
00183       IntConLevel icl, PropKind) {
00184     if (home->failed()) return;
00185     switch (r) {
00186     case IRT_EQ:
00187       if ((icl == ICL_DOM) || (icl == ICL_DEF)) {
00188         GECODE_ES_FAIL(home,(Rel::ReEqDom<IntView,BoolView>
00189                              ::post(home,x0,x1,b)));
00190       } else {
00191         GECODE_ES_FAIL(home,(Rel::ReEqBnd<IntView,BoolView>
00192                              ::post(home,x0,x1,b)));
00193       }
00194       break;
00195     case IRT_NQ:
00196       {
00197         NegBoolView n(b);
00198         if (icl == ICL_BND) {
00199           GECODE_ES_FAIL(home,(Rel::ReEqBnd<IntView,NegBoolView>
00200                                ::post(home,x0,x1,n)));
00201         } else {
00202           GECODE_ES_FAIL(home,(Rel::ReEqDom<IntView,NegBoolView>
00203                                ::post(home,x0,x1,n)));
00204         }
00205       }
00206       break;
00207     case IRT_GQ:
00208       std::swap(x0,x1); // Fall through
00209     case IRT_LQ:
00210       GECODE_ES_FAIL(home,(Rel::ReLq<IntView,BoolView>::post(home,x0,x1,b)));
00211       break;
00212     case IRT_LE:
00213       std::swap(x0,x1); // Fall through
00214     case IRT_GR:
00215       {
00216         NegBoolView n(b);
00217         GECODE_ES_FAIL(home,(Rel::ReLq<IntView,NegBoolView>::post(home,x0,x1,n)));
00218       }
00219       break;
00220     default:
00221       throw UnknownRelation("Int::rel");
00222     }
00223   }
00224 
00225   void
00226   rel(Space* home, IntVar x, IntRelType r, int n, BoolVar b,
00227       IntConLevel icl, PropKind) {
00228     Limits::check(n,"Int::rel");
00229     if (home->failed()) return;
00230     switch (r) {
00231     case IRT_EQ:
00232       if ((icl == ICL_DOM) || (icl == ICL_DEF)) {
00233         GECODE_ES_FAIL(home,(Rel::ReEqDomInt<IntView,BoolView>
00234                              ::post(home,x,n,b)));
00235       } else {
00236         GECODE_ES_FAIL(home,(Rel::ReEqBndInt<IntView,BoolView>
00237                              ::post(home,x,n,b)));
00238       }
00239       break;
00240     case IRT_NQ:
00241       {
00242         NegBoolView nb(b);
00243         if (icl == ICL_BND) {
00244           GECODE_ES_FAIL(home,(Rel::ReEqBndInt<IntView,NegBoolView>
00245                                ::post(home,x,n,nb)));
00246         } else {
00247           GECODE_ES_FAIL(home,(Rel::ReEqDomInt<IntView,NegBoolView>
00248                                ::post(home,x,n,nb)));
00249         }
00250       }
00251       break;
00252     case IRT_LE:
00253       n--; // Fall through
00254     case IRT_LQ:
00255       GECODE_ES_FAIL(home,(Rel::ReLqInt<IntView,BoolView>
00256                            ::post(home,x,n,b)));
00257       break;
00258     case IRT_GQ:
00259       n--; // Fall through
00260     case IRT_GR:
00261       {
00262         NegBoolView nb(b);
00263         GECODE_ES_FAIL(home,(Rel::ReLqInt<IntView,NegBoolView>
00264                              ::post(home,x,n,nb)));
00265       }
00266       break;
00267     default:
00268       throw UnknownRelation("Int::rel");
00269     }
00270   }
00271 
00272   void
00273   rel(Space* home, const IntVarArgs& x, IntRelType r, 
00274       IntConLevel icl, PropKind) {
00275     if (home->failed() || (x.size() < 2)) return;
00276     switch (r) {
00277     case IRT_EQ:
00278       {
00279         ViewArray<IntView> xv(home,x);
00280         if ((icl == ICL_DOM) || (icl == ICL_DEF)) {
00281           GECODE_ES_FAIL(home,Rel::NaryEqDom<IntView>::post(home,xv));
00282         } else {
00283           GECODE_ES_FAIL(home,Rel::NaryEqBnd<IntView>::post(home,xv));
00284         }
00285       }
00286       break;
00287     case IRT_NQ:
00288       distinct(home,x,icl);
00289       break;
00290     case IRT_LE:
00291       for (int i=x.size()-1; i--; )
00292         GECODE_ES_FAIL(home,Rel::Le<IntView>::post(home,x[i],x[i+1]));
00293       break;
00294     case IRT_LQ:
00295       for (int i=x.size()-1; i--; )
00296         GECODE_ES_FAIL(home,Rel::Lq<IntView>::post(home,x[i],x[i+1]));
00297       break;
00298     case IRT_GR:
00299       for (int i=x.size()-1; i--; )
00300         GECODE_ES_FAIL(home,Rel::Le<IntView>::post(home,x[i+1],x[i]));
00301       break;
00302     case IRT_GQ:
00303       for (int i=x.size()-1; i--; )
00304         GECODE_ES_FAIL(home,Rel::Lq<IntView>::post(home,x[i+1],x[i]));
00305       break;
00306     default:
00307       throw UnknownRelation("Int::rel");
00308     }
00309   }
00310 
00311   void
00312   rel(Space* home, const IntVarArgs& x, IntRelType r, const IntVarArgs& y,
00313       IntConLevel icl, PropKind) {
00314     if (x.size() != y.size())
00315       throw ArgumentSizeMismatch("Int::rel");
00316     if (home->failed()) return;
00317 
00318     switch (r) {
00319     case IRT_GR: 
00320       {
00321         ViewArray<IntView> xv(home,x), yv(home,y);
00322         GECODE_ES_FAIL(home,Rel::Lex<IntView>::post(home,yv,xv,true));
00323       }
00324       break;
00325     case IRT_LE: 
00326       {
00327         ViewArray<IntView> xv(home,x), yv(home,y);
00328         GECODE_ES_FAIL(home,Rel::Lex<IntView>::post(home,xv,yv,true));
00329       }
00330       break;
00331     case IRT_GQ: 
00332       {
00333         ViewArray<IntView> xv(home,x), yv(home,y);
00334         GECODE_ES_FAIL(home,Rel::Lex<IntView>::post(home,yv,xv,false));
00335       }
00336       break;
00337     case IRT_LQ: 
00338       {
00339         ViewArray<IntView> xv(home,x), yv(home,y);
00340         GECODE_ES_FAIL(home,Rel::Lex<IntView>::post(home,xv,yv,false));
00341       }
00342       break;
00343     case IRT_EQ:
00344       if ((icl == ICL_DOM) || (icl == ICL_DEF))
00345         for (int i=x.size(); i--; ) {
00346           GECODE_ES_FAIL(home,(Rel::EqDom<IntView,IntView>
00347                                ::post(home,x[i],y[i])));
00348         }
00349       else
00350         for (int i=x.size(); i--; ) {
00351           GECODE_ES_FAIL(home,(Rel::EqBnd<IntView,IntView>
00352                                ::post(home,x[i],y[i])));
00353         }
00354       break;
00355     case IRT_NQ: 
00356       {
00357         ViewArray<BoolView> b(home,x.size());
00358         for (int i=x.size(); i--; ) {
00359           BoolVar bi(home,0,1); b[i]=bi;
00360           NegBoolView n(b[i]);
00361           GECODE_ES_FAIL(home,(Rel::ReEqDom<IntView,NegBoolView>
00362                                ::post(home,x[i],y[i],n)));
00363         }
00364         GECODE_ES_FAIL(home,Bool::NaryOrTrue<BoolView>::post(home,b));
00365       }
00366       break;
00367     default:
00368       throw UnknownRelation("Int::rel");
00369     }
00370   }
00371 
00372   namespace {
00373     using namespace Int;
00374     GECODE_REGISTER2(Rel::EqBnd<IntView,IntView>);
00375     GECODE_REGISTER2(Rel::EqBnd<IntView,ConstIntView>);
00376     GECODE_REGISTER2(Rel::EqBnd<BoolView,ConstIntView>);
00377     GECODE_REGISTER2(Rel::EqBnd<BoolView,BoolView>);
00378     GECODE_REGISTER2(Rel::EqBnd<MinusView,IntView>);
00379     GECODE_REGISTER2(Rel::EqBnd<MinusView,MinusView>);
00380 
00381     GECODE_REGISTER2(Rel::EqDom<IntView,IntView>);
00382     GECODE_REGISTER2(Rel::EqDom<IntView,ConstIntView>);
00383     GECODE_REGISTER2(Rel::EqDom<MinusView,IntView>);
00384 
00385     GECODE_REGISTER1(Rel::NaryEqBnd<IntView>);
00386     GECODE_REGISTER1(Rel::NaryEqDom<IntView>);
00387 
00388     GECODE_REGISTER2(Rel::ReEqDomInt<IntView,NegBoolView>);
00389     GECODE_REGISTER2(Rel::ReEqDomInt<IntView,BoolView>);
00390     GECODE_REGISTER2(Rel::ReEqDom<IntView,NegBoolView>);
00391     GECODE_REGISTER2(Rel::ReEqDom<IntView,BoolView>);
00392 
00393     GECODE_REGISTER2(Rel::ReEqBndInt<IntView,NegBoolView>);
00394     GECODE_REGISTER2(Rel::ReEqBndInt<IntView,BoolView>);
00395     GECODE_REGISTER2(Rel::ReEqBnd<IntView,NegBoolView>);
00396     GECODE_REGISTER2(Rel::ReEqBnd<IntView,BoolView>);
00397 
00398     GECODE_REGISTER1(Rel::Nq<BoolView>);
00399     GECODE_REGISTER1(Rel::Nq<IntView>);
00400     GECODE_REGISTER1(Rel::Nq<OffsetView>);
00401 
00402     GECODE_REGISTER1(Rel::Lq<BoolView>);
00403     GECODE_REGISTER1(Rel::Lq<IntView>);
00404     GECODE_REGISTER1(Rel::Lq<MinusView>);
00405     GECODE_REGISTER1(Rel::Le<BoolView>);
00406     GECODE_REGISTER1(Rel::Le<IntView>);
00407     GECODE_REGISTER2(Rel::ReLq<IntView, NegBoolView>);
00408     GECODE_REGISTER2(Rel::ReLq<IntView, BoolView>);
00409     GECODE_REGISTER2(Rel::ReLqInt<IntView, NegBoolView>);
00410     GECODE_REGISTER2(Rel::ReLqInt<IntView, BoolView>);
00411 
00412     GECODE_REGISTER1(Rel::Lex<BoolView>);
00413     GECODE_REGISTER1(Rel::Lex<IntView>);
00414 
00415   }
00416 
00417 }
00418 
00419 // STATISTICS: int-post
00420