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