Generated on Thu Mar 22 10:39:35 2012 for Gecode by doxygen 1.6.3

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