00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
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--;
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++;
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--;
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++;
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--;
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++;
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--;
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++;
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