this repo has no description
1/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ 2/* 3 * Main authors: 4 * Christian Schulte <schulte@gecode.org> 5 * 6 * Copyright: 7 * Christian Schulte, 2002 8 * 9 * This file is part of Gecode, the generic constraint 10 * development environment: 11 * http://www.gecode.org 12 * 13 * Permission is hereby granted, free of charge, to any person obtaining 14 * a copy of this software and associated documentation files (the 15 * "Software"), to deal in the Software without restriction, including 16 * without limitation the rights to use, copy, modify, merge, publish, 17 * distribute, sublicense, and/or sell copies of the Software, and to 18 * permit persons to whom the Software is furnished to do so, subject to 19 * the following conditions: 20 * 21 * The above copyright notice and this permission notice shall be 22 * included in all copies or substantial portions of the Software. 23 * 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 28 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 29 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 30 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 31 * 32 */ 33 34#include <gecode/int/count.hh> 35#include <gecode/int/rel.hh> 36 37namespace Gecode { 38 39 void 40 count(Home home, const IntVarArgs& x, int n, 41 IntRelType irt, int m, IntPropLevel) { 42 using namespace Int; 43 Limits::check(n,"Int::count"); 44 Limits::check(m,"Int::count"); 45 46 GECODE_POST; 47 48 ViewArray<IntView> xv(home,x); 49 ConstIntView y(n); 50 51 switch (irt) { 52 case IRT_EQ: 53 GECODE_ES_FAIL((Count::EqInt<IntView,ConstIntView> 54 ::post(home,xv,y,m))); 55 break; 56 case IRT_NQ: 57 { 58 IntVar z(home,0,x.size()); 59 GECODE_ME_FAIL(IntView(z).nq(home,m)); 60 GECODE_ES_FAIL((Count::EqView<IntView,ConstIntView,IntView,true,false> 61 ::post(home,xv,y,z,0))); 62 } 63 break; 64 case IRT_LE: 65 m--; // FALL THROUGH 66 case IRT_LQ: 67 GECODE_ES_FAIL((Count::LqInt<IntView,ConstIntView> 68 ::post(home,xv,y,m))); 69 break; 70 case IRT_GR: 71 m++; // FALL THROUGH 72 case IRT_GQ: 73 GECODE_ES_FAIL((Count::GqInt<IntView,ConstIntView> 74 ::post(home,xv,y,m))); 75 break; 76 default: 77 throw UnknownRelation("Int::count"); 78 } 79 } 80 81 void 82 count(Home home, const IntVarArgs& x, IntVar y, 83 IntRelType irt, int m, IntPropLevel ipl) { 84 using namespace Int; 85 Limits::check(m,"Int::count"); 86 GECODE_POST; 87 ViewArray<IntView> xv(home,x); 88 89 switch (irt) { 90 case IRT_EQ: 91 { 92 ConstIntView z(m); 93 if ((vbd(ipl) == IPL_DOM) || (vbd(ipl) == IPL_DEF)) 94 GECODE_ES_FAIL((Count::EqView<IntView,IntView,ConstIntView,true,true> 95 ::post(home,xv,y,z,0))); 96 else 97 GECODE_ES_FAIL((Count::EqView<IntView,IntView,ConstIntView,true,false> 98 ::post(home,xv,y,z,0))); 99 } 100 break; 101 case IRT_NQ: 102 { 103 IntVar z(home,0,x.size()); 104 GECODE_ME_FAIL(IntView(z).nq(home,m)); 105 GECODE_ES_FAIL((Count::EqView<IntView,IntView,IntView,true,false> 106 ::post(home,xv,y,z,0))); 107 } 108 break; 109 case IRT_LE: 110 m--; // FALL THROUGH 111 case IRT_LQ: 112 GECODE_ES_FAIL((Count::LqInt<IntView,IntView> 113 ::post(home,xv,y,m))); 114 break; 115 case IRT_GR: 116 m++; // FALL THROUGH 117 case IRT_GQ: 118 { 119 ConstIntView z(m); 120 if ((vbd(ipl) == IPL_DOM) || (vbd(ipl) == IPL_DEF)) 121 GECODE_ES_FAIL((Count::GqView<IntView,IntView,ConstIntView,true,true> 122 ::post(home,xv,y,z,0))); 123 else 124 GECODE_ES_FAIL((Count::GqView<IntView,IntView,ConstIntView,true,false> 125 ::post(home,xv,y,z,0))); 126 } 127 break; 128 default: 129 throw UnknownRelation("Int::count"); 130 } 131 } 132 133 void 134 count(Home home, const IntVarArgs& x, const IntSet& y, 135 IntRelType irt, int m, IntPropLevel) { 136 using namespace Int; 137 138 if (y.size() == 1) { 139 count(home,x,y.min(),irt,m); 140 return; 141 } 142 143 Limits::check(y.min(),"Int::count"); 144 Limits::check(y.max(),"Int::count"); 145 Limits::check(m,"Int::count"); 146 147 GECODE_POST; 148 149 ViewArray<IntView> xv(home,x); 150 switch (irt) { 151 case IRT_EQ: 152 GECODE_ES_FAIL((Count::EqInt<IntView,IntSet>::post(home,xv,y,m))); 153 break; 154 case IRT_NQ: 155 { 156 IntVar z(home,0,x.size()); 157 GECODE_ME_FAIL(IntView(z).nq(home,m)); 158 GECODE_ES_FAIL((Count::EqView<IntView,IntSet,IntView,true,false> 159 ::post(home,xv,y,z,0))); 160 } 161 break; 162 case IRT_LE: 163 m--; // FALL THROUGH 164 case IRT_LQ: 165 GECODE_ES_FAIL((Count::LqInt<IntView,IntSet>::post(home,xv,y,m))); 166 break; 167 case IRT_GR: 168 m++; // FALL THROUGH 169 case IRT_GQ: 170 GECODE_ES_FAIL((Count::GqInt<IntView,IntSet>::post(home,xv,y,m))); 171 break; 172 default: 173 throw UnknownRelation("Int::count"); 174 } 175 } 176 177 void 178 count(Home home, const IntVarArgs& x, const IntArgs& y, 179 IntRelType irt, int m, IntPropLevel) { 180 using namespace Int; 181 if (x.size() != y.size()) 182 throw ArgumentSizeMismatch("Int::count"); 183 Limits::check(m,"Int::count"); 184 GECODE_POST; 185 186 ViewArray<OffsetView> xy(home,x.size()); 187 for (int i=0; i<x.size(); i++) 188 xy[i] = OffsetView(x[i],-y[i]); 189 190 ZeroIntView zero; 191 switch (irt) { 192 case IRT_EQ: 193 GECODE_ES_FAIL((Count::EqInt<OffsetView,ZeroIntView> 194 ::post(home,xy,zero,m))); 195 break; 196 case IRT_NQ: 197 { 198 IntVar z(home,0,x.size()); 199 GECODE_ME_FAIL(IntView(z).nq(home,m)); 200 GECODE_ES_FAIL((Count::EqView<OffsetView,ZeroIntView,IntView,true,false> 201 ::post(home,xy,zero,z,0))); 202 } 203 break; 204 case IRT_LE: 205 m--; // FALL THROUGH 206 case IRT_LQ: 207 GECODE_ES_FAIL((Count::LqInt<OffsetView,ZeroIntView> 208 ::post(home,xy,zero,m))); 209 break; 210 case IRT_GR: 211 m++; // FALL THROUGH 212 case IRT_GQ: 213 GECODE_ES_FAIL((Count::GqInt<OffsetView,ZeroIntView> 214 ::post(home,xy,zero,m))); 215 break; 216 default: 217 throw UnknownRelation("Int::count"); 218 } 219 } 220 221 void 222 count(Home home, const IntVarArgs& x, int n, 223 IntRelType irt, IntVar z, IntPropLevel) { 224 using namespace Int; 225 Limits::check(n,"Int::count"); 226 GECODE_POST; 227 ViewArray<IntView> xv(home,x); 228 ConstIntView yv(n); 229 switch (irt) { 230 case IRT_EQ: 231 GECODE_ES_FAIL((Count::EqView<IntView,ConstIntView,IntView,true,false> 232 ::post(home,xv,yv,z,0))); 233 break; 234 case IRT_NQ: 235 { 236 IntVar nz(home,0,x.size()); 237 GECODE_ES_FAIL((Rel::Nq<IntView,IntView>::post(home,z,nz))); 238 GECODE_ES_FAIL((Count::EqView<IntView,ConstIntView,IntView,true,false> 239 ::post(home,xv,yv,nz,0))); 240 } 241 break; 242 case IRT_LE: 243 GECODE_ES_FAIL((Count::LqView<IntView,ConstIntView,IntView,true> 244 ::post(home,xv,yv,z,-1))); 245 break; 246 case IRT_LQ: 247 GECODE_ES_FAIL((Count::LqView<IntView,ConstIntView,IntView,true> 248 ::post(home,xv,yv,z,0))); 249 break; 250 case IRT_GR: 251 GECODE_ES_FAIL((Count::GqView<IntView,ConstIntView,IntView,true,false> 252 ::post(home,xv,yv,z,1))); 253 break; 254 case IRT_GQ: 255 GECODE_ES_FAIL((Count::GqView<IntView,ConstIntView,IntView,true,false> 256 ::post(home,xv,yv,z,0))); 257 break; 258 default: 259 throw UnknownRelation("Int::count"); 260 } 261 } 262 263 void 264 count(Home home, const IntVarArgs& x, IntVar y, 265 IntRelType irt, IntVar z, IntPropLevel ipl) { 266 using namespace Int; 267 GECODE_POST; 268 ViewArray<IntView> xv(home,x); 269 switch (irt) { 270 case IRT_EQ: 271 if ((vbd(ipl) == IPL_DOM) || (vbd(ipl) == IPL_DEF)) 272 GECODE_ES_FAIL((Count::EqView<IntView,IntView,IntView,true,true> 273 ::post(home,xv,y,z,0))); 274 else 275 GECODE_ES_FAIL((Count::EqView<IntView,IntView,IntView,true,false> 276 ::post(home,xv,y,z,0))); 277 break; 278 case IRT_NQ: 279 { 280 IntVar nz(home,0,x.size()); 281 GECODE_ES_FAIL((Rel::Nq<IntView,IntView>::post(home,z,nz))); 282 GECODE_ES_FAIL((Count::EqView<IntView,IntView,IntView,true,false> 283 ::post(home,xv,y,nz,0))); 284 } 285 break; 286 case IRT_LE: 287 GECODE_ES_FAIL((Count::LqView<IntView,IntView,IntView,true> 288 ::post(home,xv,y,z,-1))); 289 break; 290 case IRT_LQ: 291 GECODE_ES_FAIL((Count::LqView<IntView,IntView,IntView,true> 292 ::post(home,xv,y,z,0))); 293 break; 294 case IRT_GR: 295 if ((vbd(ipl) == IPL_DOM) || (vbd(ipl) == IPL_DEF)) 296 GECODE_ES_FAIL((Count::GqView<IntView,IntView,IntView,true,true> 297 ::post(home,xv,y,z,1))); 298 else 299 GECODE_ES_FAIL((Count::GqView<IntView,IntView,IntView,true,false> 300 ::post(home,xv,y,z,1))); 301 break; 302 case IRT_GQ: 303 if ((vbd(ipl) == IPL_DOM) || (vbd(ipl) == IPL_DEF)) 304 GECODE_ES_FAIL((Count::GqView<IntView,IntView,IntView,true,true> 305 ::post(home,xv,y,z,0))); 306 else 307 GECODE_ES_FAIL((Count::GqView<IntView,IntView,IntView,true,false> 308 ::post(home,xv,y,z,0))); 309 break; 310 default: 311 throw UnknownRelation("Int::count"); 312 } 313 } 314 315 void 316 count(Home home, const IntVarArgs& x, const IntSet& y, 317 IntRelType irt, IntVar z, IntPropLevel) { 318 using namespace Int; 319 320 if (y.size() == 1) { 321 count(home,x,y.min(),irt,z); 322 return; 323 } 324 325 Limits::check(y.min(),"Int::count"); 326 Limits::check(y.max(),"Int::count"); 327 328 GECODE_POST; 329 ViewArray<IntView> xv(home,x); 330 switch (irt) { 331 case IRT_EQ: 332 GECODE_ES_FAIL((Count::EqView<IntView,IntSet,IntView,true,false> 333 ::post(home,xv,y,z,0))); 334 break; 335 case IRT_NQ: 336 { 337 IntVar nz(home,0,x.size()); 338 GECODE_ES_FAIL((Rel::Nq<IntView,IntView>::post(home,z,nz))); 339 GECODE_ES_FAIL((Count::EqView<IntView,IntSet,IntView,true,false> 340 ::post(home,xv,y,nz,0))); 341 } 342 break; 343 case IRT_LE: 344 GECODE_ES_FAIL((Count::LqView<IntView,IntSet,IntView,true> 345 ::post(home,xv,y,z,-1))); 346 break; 347 case IRT_LQ: 348 GECODE_ES_FAIL((Count::LqView<IntView,IntSet,IntView,true> 349 ::post(home,xv,y,z,0))); 350 break; 351 case IRT_GR: 352 GECODE_ES_FAIL((Count::GqView<IntView,IntSet,IntView,true,false> 353 ::post(home,xv,y,z,1))); 354 break; 355 case IRT_GQ: 356 GECODE_ES_FAIL((Count::GqView<IntView,IntSet,IntView,true,false> 357 ::post(home,xv,y,z,0))); 358 break; 359 default: 360 throw UnknownRelation("Int::count"); 361 } 362 } 363 364 void 365 count(Home home, const IntVarArgs& x, const IntArgs& y, 366 IntRelType irt, IntVar z, IntPropLevel) { 367 using namespace Int; 368 if (x.size() != y.size()) 369 throw ArgumentSizeMismatch("Int::count"); 370 GECODE_POST; 371 372 ViewArray<OffsetView> xy(home,x.size()); 373 for (int i=0; i<x.size(); i++) 374 xy[i] = OffsetView(x[i],-y[i]); 375 376 ZeroIntView u; 377 switch (irt) { 378 case IRT_EQ: 379 GECODE_ES_FAIL((Count::EqView<OffsetView,ZeroIntView,IntView,true,false> 380 ::post(home,xy,u,z,0))); 381 break; 382 case IRT_NQ: 383 { 384 IntVar nz(home,0,x.size()); 385 GECODE_ES_FAIL((Rel::Nq<IntView,IntView>::post(home,z,nz))); 386 GECODE_ES_FAIL((Count::EqView<OffsetView,ZeroIntView,IntView,true,false> 387 ::post(home,xy,u,nz,0))); 388 } 389 break; 390 case IRT_LE: 391 GECODE_ES_FAIL((Count::LqView<OffsetView,ZeroIntView,IntView,true> 392 ::post(home,xy,u,z,-1))); 393 break; 394 case IRT_LQ: 395 GECODE_ES_FAIL((Count::LqView<OffsetView,ZeroIntView,IntView,true> 396 ::post(home,xy,u,z,0))); 397 break; 398 case IRT_GR: 399 GECODE_ES_FAIL((Count::GqView<OffsetView,ZeroIntView,IntView,true,false> 400 ::post(home,xy,u,z,1))); 401 break; 402 case IRT_GQ: 403 GECODE_ES_FAIL((Count::GqView<OffsetView,ZeroIntView,IntView,true,false> 404 ::post(home,xy,u,z,0))); 405 break; 406 default: 407 throw UnknownRelation("Int::count"); 408 } 409 } 410 411} 412 413// STATISTICS: int-post