gecode » set » view

00001 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ 00002 /* 00003 * Main authors: 00004 * Guido Tack <tack@gecode.org> 00005 * 00006 * Contributing authors: 00007 * Christian Schulte <schulte@gecode.org> 00008 * 00009 * Copyright: 00010 * Guido Tack, 2004 00011 * Christian Schulte, 2004 00012 * 00013 * Last modified: 00014 * $Date: 2009-09-08 21:10:29 +0200 (Tue, 08 Sep 2009) $ by $Author: schulte $ 00015 * $Revision: 9692 $ 00016 * 00017 * This file is part of Gecode, the generic constraint 00018 * development environment: 00019 * http://www.gecode.org 00020 * 00021 * Permission is hereby granted, free of charge, to any person obtaining 00022 * a copy of this software and associated documentation files (the 00023 * "Software"), to deal in the Software without restriction, including 00024 * without limitation the rights to use, copy, modify, merge, publish, 00025 * distribute, sublicense, and/or sell copies of the Software, and to 00026 * permit persons to whom the Software is furnished to do so, subject to 00027 * the following conditions: 00028 * 00029 * The above copyright notice and this permission notice shall be 00030 * included in all copies or substantial portions of the Software. 00031 * 00032 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 00033 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 00034 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 00035 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 00036 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 00037 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 00038 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 00039 * 00040 */ 00041 00042 #include <sstream> 00043 00044 namespace Gecode { 00045 00046 namespace Set { 00047 00048 template<class View> 00049 forceinline 00050 ComplementView<View>::ComplementView(void) {} 00051 00052 template<class View> 00053 forceinline 00054 ComplementView<View>::ComplementView(View& s0) 00055 : DerivedViewBase<View>(s0) {} 00056 00057 template<class View> 00058 forceinline ModEvent 00059 ComplementView<View>::me_negateset(ModEvent me) { 00060 switch(me) { 00061 case ME_SET_LUB : return ME_SET_GLB; 00062 case ME_SET_GLB : return ME_SET_LUB; 00063 case ME_SET_CLUB : return ME_SET_CGLB; 00064 case ME_SET_CGLB : return ME_SET_CLUB; 00065 default: return me; 00066 } 00067 } 00068 00069 template<class View> 00070 forceinline PropCond 00071 ComplementView<View>::pc_negateset(PropCond pc) { 00072 switch(pc) { 00073 case PC_SET_CLUB : return PC_SET_CGLB; 00074 case PC_SET_CGLB : return PC_SET_CLUB; 00075 default: return pc; 00076 } 00077 } 00078 00079 template<class View> 00080 forceinline bool 00081 ComplementView<View>::assigned(void) const { return view.assigned(); } 00082 00083 template<class View> 00084 forceinline unsigned int 00085 ComplementView<View>::glbSize(void) const { 00086 return Limits::card - view.lubSize(); 00087 } 00088 00089 template<class View> 00090 forceinline unsigned int 00091 ComplementView<View>::lubSize(void) const { 00092 return Limits::card - view.glbSize(); 00093 } 00094 00095 template<class View> 00096 forceinline unsigned int 00097 ComplementView<View>::unknownSize(void) const { 00098 return lubSize() - glbSize(); 00099 } 00100 00101 template<class View> 00102 forceinline bool 00103 ComplementView<View>::contains(int n) const { return view.notContains(n); } 00104 00105 template<class View> 00106 forceinline bool 00107 ComplementView<View>::notContains(int n) const { return view.contains(n); } 00108 00109 template<class View> 00110 forceinline unsigned int 00111 ComplementView<View>::cardMin() const { 00112 return Limits::card - view.cardMax(); 00113 } 00114 00115 template<class View> 00116 forceinline unsigned int 00117 ComplementView<View>::cardMax() const { 00118 return Limits::card - view.cardMin(); 00119 } 00120 00121 template<class View> 00122 forceinline int 00123 ComplementView<View>::lubMin() const { 00124 GlbRanges<View> lb(view); 00125 RangesCompl<GlbRanges<View> > lbc(lb); 00126 if (lbc()) { 00127 return lbc.min(); 00128 } else { 00129 return BndSet::MIN_OF_EMPTY; 00130 } 00131 } 00132 00133 template<class View> 00134 forceinline int 00135 ComplementView<View>::lubMax() const { 00136 GlbRanges<View> lb(view); 00137 RangesCompl<GlbRanges<View> > lbc(lb); 00138 if (lbc()) { 00139 while(lbc()) ++lbc; 00140 return lbc.max(); 00141 } else { 00142 return BndSet::MAX_OF_EMPTY; 00143 } 00144 } 00145 00146 template<class View> 00147 forceinline int 00148 ComplementView<View>::glbMin() const { 00149 LubRanges<View> ub(view); 00150 RangesCompl<LubRanges<View> > ubc(ub); 00151 if (ubc()) { 00152 return ubc.min(); 00153 } else { 00154 return BndSet::MIN_OF_EMPTY; 00155 } 00156 } 00157 00158 template<class View> 00159 forceinline int 00160 ComplementView<View>::glbMax() const { 00161 LubRanges<View> ub(view); 00162 RangesCompl<LubRanges<View> > ubc(ub); 00163 if (ubc()) { 00164 while(ubc()) ++ubc; 00165 return ubc.max(); 00166 } else { 00167 return BndSet::MAX_OF_EMPTY; 00168 } 00169 } 00170 00171 template<class View> 00172 forceinline ModEvent 00173 ComplementView<View>::cardMin(Space& home, unsigned int c) { 00174 if (c < Limits::card) 00175 return me_negateset(view.cardMax(home, Limits::card - c)); 00176 return ME_SET_NONE; 00177 } 00178 00179 template<class View> 00180 forceinline ModEvent 00181 ComplementView<View>::cardMax(Space& home, unsigned int c) { 00182 if (c < Limits::card) 00183 return me_negateset(view.cardMin(home, Limits::card - c)); 00184 return ME_SET_NONE; 00185 } 00186 00187 template<class View> 00188 forceinline ModEvent 00189 ComplementView<View>::include(Space& home, int c) { 00190 return me_negateset((view.exclude(home, c))); 00191 } 00192 00193 template<class View> 00194 forceinline ModEvent 00195 ComplementView<View>::exclude(Space& home, int c) { 00196 return me_negateset((view.include(home, c))); 00197 } 00198 00199 template<class View> 00200 forceinline ModEvent 00201 ComplementView<View>::intersect(Space& home, int c) { 00202 Iter::Ranges::Singleton si(c,c); 00203 RangesCompl<Iter::Ranges::Singleton> csi(si); 00204 return me_negateset((view.includeI(home, csi))); 00205 } 00206 00207 template<class View> 00208 forceinline ModEvent 00209 ComplementView<View>::intersect(Space& home, int i, int j) { 00210 Iter::Ranges::Singleton si(i,j); 00211 RangesCompl<Iter::Ranges::Singleton> csi(si); 00212 return me_negateset((view.includeI(home, csi))); 00213 } 00214 00215 template<class View> 00216 forceinline ModEvent 00217 ComplementView<View>::include(Space& home, int j, int k) { 00218 return me_negateset(view.exclude(home,j,k)); 00219 } 00220 00221 template<class View> 00222 forceinline ModEvent 00223 ComplementView<View>::exclude(Space& home, int j, int k) { 00224 return me_negateset(view.include(home,j,k)); 00225 } 00226 00227 template<class View> 00228 template<class I> ModEvent 00229 ComplementView<View>::excludeI(Space& home,I& iter) { 00230 return me_negateset(view.includeI(home,iter)); 00231 } 00232 00233 template<class View> 00234 template<class I> ModEvent 00235 ComplementView<View>::includeI(Space& home,I& iter) { 00236 return me_negateset(view.excludeI(home,iter)); 00237 } 00238 00239 template<class View> 00240 template<class I> ModEvent 00241 ComplementView<View>::intersectI(Space& home,I& iter) { 00242 RangesCompl<I> c(iter); 00243 return me_negateset(view.includeI(home,c)); 00244 } 00245 00246 template<class View> 00247 forceinline void 00248 ComplementView<View>::subscribe(Space& home, Propagator& p, PropCond pc, 00249 bool process) { 00250 view.subscribe(home,p, pc_negateset(pc),process); 00251 } 00252 00253 template<class View> 00254 forceinline void 00255 ComplementView<View>::cancel(Space& home, Propagator& p, PropCond pc) { 00256 view.cancel(home,p, pc_negateset(pc)); 00257 } 00258 00259 template<class View> 00260 forceinline void 00261 ComplementView<View>::subscribe(Space& home, Advisor& a) { 00262 view.subscribe(home,a); 00263 } 00264 00265 template<class View> 00266 forceinline void 00267 ComplementView<View>::cancel(Space& home, Advisor& a) { 00268 view.cancel(home,a); 00269 } 00270 00271 template<class View> 00272 forceinline void 00273 ComplementView<View>::schedule(Space& home, Propagator& p, ModEvent me) { 00274 return View::schedule(home,p,me_negateset(me)); 00275 } 00276 template<class View> 00277 forceinline ModEvent 00278 ComplementView<View>::me(const ModEventDelta& med) { 00279 return me_negateset(View::me(med)); 00280 } 00281 00282 template<class View> 00283 forceinline ModEventDelta 00284 ComplementView<View>::med(ModEvent me) { 00285 return me_negateset(View::med(me)); 00286 } 00287 00288 template<class View> 00289 forceinline void 00290 ComplementView<View>::update(Space& home, bool share, 00291 ComplementView& y) { 00292 view.update(home,share,y.view); 00293 } 00294 00295 00296 /* 00297 * Delta information for advisors 00298 * 00299 */ 00300 00301 template<class View> 00302 forceinline ModEvent 00303 ComplementView<View>::modevent(const Delta& d) { 00304 return me_negateset(View::modevent(d)); 00305 } 00306 00307 template<class View> 00308 forceinline int 00309 ComplementView<View>::glbMin(const Delta& d) const { 00310 return view.lubMin(d); 00311 } 00312 00313 template<class View> 00314 forceinline int 00315 ComplementView<View>::glbMax(const Delta& d) const { 00316 return view.lubMax(d); 00317 } 00318 00319 template<class View> 00320 forceinline bool 00321 ComplementView<View>::glbAny(const Delta& d) const { 00322 return view.lubAny(d); 00323 } 00324 00325 template<class View> 00326 forceinline int 00327 ComplementView<View>::lubMin(const Delta& d) const { 00328 return view.glbMin(d); 00329 } 00330 00331 template<class View> 00332 forceinline int 00333 ComplementView<View>::lubMax(const Delta& d) const { 00334 return view.glbMax(d); 00335 } 00336 00337 template<class View> 00338 forceinline bool 00339 ComplementView<View>::lubAny(const Delta& d) const { 00340 return view.glbAny(d); 00341 } 00342 00343 00348 template<class View> 00349 class LubRanges<ComplementView<View> > { 00350 private: 00351 GlbRanges<View> lb; 00352 RangesCompl<GlbRanges<View> > lbc; 00353 public: 00355 00356 00357 LubRanges(void) {} 00359 LubRanges(const ComplementView<View>& x); 00361 void init(const ComplementView<View>& x); 00362 00364 00365 00366 bool operator ()(void) const; 00368 void operator ++(void); 00370 00372 00373 00374 int min(void) const; 00376 int max(void) const; 00378 unsigned int width(void) const; 00380 }; 00381 00382 template<class View> 00383 forceinline 00384 LubRanges<ComplementView<View> >::LubRanges(const ComplementView<View>& s) 00385 : lb(s.base()), lbc(lb) {} 00386 00387 template<class View> 00388 forceinline void 00389 LubRanges<ComplementView<View> >::init(const ComplementView<View>& s) { 00390 lb.init(s.base()); 00391 lbc.init(lb); 00392 } 00393 00394 template<class View> 00395 forceinline bool 00396 LubRanges<ComplementView<View> >::operator ()(void) const { return lbc(); } 00397 00398 template<class View> 00399 forceinline void 00400 LubRanges<ComplementView<View> >::operator ++(void) { return ++lbc; } 00401 00402 template<class View> 00403 forceinline int 00404 LubRanges<ComplementView<View> >::min(void) const { return lbc.min(); } 00405 00406 template<class View> 00407 forceinline int 00408 LubRanges<ComplementView<View> >::max(void) const { return lbc.max(); } 00409 00410 template<class View> 00411 forceinline unsigned int 00412 LubRanges<ComplementView<View> >::width(void) const { return lbc.width(); } 00413 00422 template<class View> 00423 class LubRanges<ComplementView<ComplementView<View> > > : 00424 public LubRanges<View> { 00425 public: 00427 00428 00429 LubRanges(void) {} 00431 LubRanges(const ComplementView<ComplementView<View> >& x); 00433 void init(const ComplementView<ComplementView<View> >& x); 00435 }; 00436 00437 template<class View> 00438 forceinline 00439 LubRanges<ComplementView<ComplementView<View> > >:: 00440 LubRanges(const ComplementView<ComplementView<View> >& x) : 00441 LubRanges<View>(x) {} 00442 00443 template<class View> 00444 forceinline void 00445 LubRanges<ComplementView<ComplementView<View> > >:: 00446 init(const ComplementView<ComplementView<View> >& x) { 00447 LubRanges<View>::init(x); 00448 } 00449 00454 template<class View> 00455 class GlbRanges<ComplementView<View> > { 00456 private: 00457 LubRanges<View> ub; 00458 RangesCompl<LubRanges<View> > ubc; 00459 public: 00461 00462 00463 GlbRanges(void) {} 00465 GlbRanges(const ComplementView<View> & x); 00467 void init(const ComplementView<View> & x); 00468 00470 00471 00472 bool operator ()(void) const; 00474 void operator ++(void); 00476 00478 00479 00480 int min(void) const; 00482 int max(void) const; 00484 unsigned int width(void) const; 00486 }; 00487 00488 template<class View> 00489 forceinline 00490 GlbRanges<ComplementView<View> >::GlbRanges(const ComplementView<View> & s) 00491 : ub(s.base()), ubc(ub) {} 00492 00493 template<class View> 00494 forceinline void 00495 GlbRanges<ComplementView<View> >::init(const ComplementView<View> & s) { 00496 ub.init(s.base()); 00497 ubc.init(ub); 00498 } 00499 00500 template<class View> 00501 forceinline bool 00502 GlbRanges<ComplementView<View> >::operator ()(void) const { return ubc(); } 00503 00504 template<class View> 00505 forceinline void 00506 GlbRanges<ComplementView<View> >::operator ++(void) { return ++ubc; } 00507 00508 template<class View> 00509 forceinline int 00510 GlbRanges<ComplementView<View> >::min(void) const { return ubc.min(); } 00511 00512 template<class View> 00513 forceinline int 00514 GlbRanges<ComplementView<View> >::max(void) const { return ubc.max(); } 00515 00516 template<class View> 00517 forceinline unsigned int 00518 GlbRanges<ComplementView<View> >::width(void) const { return ubc.width(); } 00519 00528 template<class View> 00529 class GlbRanges<ComplementView<ComplementView<View> > > : 00530 public GlbRanges<View> { 00531 public: 00533 00534 00535 GlbRanges(void) {} 00537 GlbRanges(const ComplementView<ComplementView<View> >& x); 00539 void init(const ComplementView<ComplementView<View> >& x); 00541 }; 00542 00543 template<class View> 00544 forceinline 00545 GlbRanges<ComplementView<ComplementView<View> > >:: 00546 GlbRanges(const ComplementView<ComplementView<View> >& x) : 00547 GlbRanges<View>(x) {} 00548 00549 template<class View> 00550 forceinline void 00551 GlbRanges<ComplementView<ComplementView<View> > >:: 00552 init(const ComplementView<ComplementView<View> >& x) { 00553 GlbRanges<View>::init(x); 00554 } 00555 00556 template<class Char, class Traits, class View> 00557 std::basic_ostream<Char,Traits>& 00558 operator <<(std::basic_ostream<Char,Traits>& os, 00559 const ComplementView<View>& x) { 00560 std::basic_ostringstream<Char,Traits> s; 00561 s.copyfmt(os); s.width(0); 00562 s << "(" << x.base() << ")^C"; 00563 return os << s.str(); 00564 } 00565 00566 } 00567 00568 00569 /* 00570 * Testing 00571 * 00572 */ 00573 template<class View> 00574 forceinline bool 00575 same(const Set::ComplementView<View>& x, 00576 const Set::ComplementView<View>& y) { 00577 return same(x.base(),y.base()); 00578 } 00579 template<class View> 00580 forceinline bool 00581 before(const Set::ComplementView<View>& x, 00582 const Set::ComplementView<View>& y) { 00583 return before(x.base(),y.base()); 00584 } 00585 template<class View> 00586 forceinline bool 00587 same(const Set::ComplementView<Set::ComplementView<View> >& x, 00588 const Set::ComplementView<Set::ComplementView<View> >& y) { 00589 return same(x,y); 00590 } 00591 template<class View> 00592 forceinline bool 00593 before(const Set::ComplementView<Set::ComplementView<View> >& x, 00594 const Set::ComplementView<Set::ComplementView<View> >& y) { 00595 return before(x,y); 00596 } 00597 00598 } 00599 00600 // STATISTICS: set-var