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

dom.cpp

Go to the documentation of this file.
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  *     Gabor Szokoli <szokoli@gecode.org>
00008  *
00009  *  Copyright:
00010  *     Guido Tack, 2004, 2005
00011  *
00012  *  Last modified:
00013  *     $Date: 2011-08-24 16:34:16 +0200 (Wed, 24 Aug 2011) $ by $Author: tack $
00014  *     $Revision: 12346 $
00015  *
00016  *  This file is part of Gecode, the generic constraint
00017  *  development environment:
00018  *     http://www.gecode.org
00019  *
00020  *  Permission is hereby granted, free of charge, to any person obtaining
00021  *  a copy of this software and associated documentation files (the
00022  *  "Software"), to deal in the Software without restriction, including
00023  *  without limitation the rights to use, copy, modify, merge, publish,
00024  *  distribute, sublicense, and/or sell copies of the Software, and to
00025  *  permit persons to whom the Software is furnished to do so, subject to
00026  *  the following conditions:
00027  *
00028  *  The above copyright notice and this permission notice shall be
00029  *  included in all copies or substantial portions of the Software.
00030  *
00031  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
00032  *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00033  *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00034  *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
00035  *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
00036  *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
00037  *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00038  *
00039  */
00040 
00041 #include <gecode/set.hh>
00042 #include <gecode/set/rel.hh>
00043 
00044 namespace Gecode {
00045 
00046   void
00047   dom(Home home, SetVar s, SetRelType r, int i) {
00048     Set::Limits::check(i, "Set::dom");
00049     IntSet d(i,i);
00050     dom(home, s, r, d);
00051   }
00052 
00053   void
00054   dom(Home home, SetVar s, SetRelType r, int i, int j) {
00055     Set::Limits::check(i, "Set::dom");
00056     Set::Limits::check(j, "Set::dom");
00057     IntSet d(i,j);
00058     dom(home, s, r, d);
00059   }
00060 
00061   void
00062   dom(Home home, SetVar s, SetRelType r, const IntSet& is) {
00063     Set::Limits::check(is, "Set::dom");
00064     if (home.failed()) return;
00065 
00066     Set::SetView _s(s);
00067 
00068     switch (r) {
00069     case SRT_EQ:
00070       {
00071         if (is.ranges() == 1) {
00072           GECODE_ME_FAIL(_s.include(home, is.min(), is.max()));
00073           GECODE_ME_FAIL(_s.intersect(home, is.min(), is.max()));
00074         } else {
00075           IntSetRanges rd1(is);
00076           GECODE_ME_FAIL(_s.includeI(home, rd1));
00077           IntSetRanges rd2(is);
00078           GECODE_ME_FAIL(_s.intersectI(home, rd2));
00079         }
00080       }
00081       break;
00082     case SRT_LQ:
00083       {
00084         Set::ConstSetView cv(home, is);
00085         GECODE_ES_FAIL(
00086           (Set::Rel::Lq<Set::SetView,Set::ConstSetView,false>
00087             ::post(home,s,cv)));
00088       }
00089       break;
00090     case SRT_LE:
00091       {
00092         Set::ConstSetView cv(home, is);
00093         GECODE_ES_FAIL(
00094           (Set::Rel::Lq<Set::SetView,Set::ConstSetView,true>
00095             ::post(home,s,cv)));
00096       }
00097       break;
00098     case SRT_GQ:
00099       {
00100         Set::ConstSetView cv(home, is);
00101         GECODE_ES_FAIL(
00102           (Set::Rel::Lq<Set::ConstSetView,Set::SetView,false>
00103             ::post(home,cv,s)));
00104       }
00105       break;
00106     case SRT_GR:
00107       {
00108         Set::ConstSetView cv(home, is);
00109         GECODE_ES_FAIL(
00110           (Set::Rel::Lq<Set::ConstSetView,Set::SetView,true>
00111             ::post(home,cv,s)));
00112       }
00113       break;
00114     case SRT_DISJ:
00115       {
00116         if (is.ranges() == 1) {
00117           GECODE_ME_FAIL(_s.exclude(home, is.min(), is.max()));
00118         } else {
00119           IntSetRanges rd(is);
00120           GECODE_ME_FAIL(_s.excludeI(home, rd));
00121         }
00122       }
00123       break;
00124     case SRT_NQ:
00125       {
00126         Set::ConstSetView cv(home, is);
00127         GECODE_ES_FAIL(
00128                        (Set::Rel::DistinctDoit<Set::SetView>::post(home, s,
00129                                                                    cv)));
00130       }
00131       break;
00132     case SRT_SUB:
00133       {
00134          if (is.ranges() == 1) {
00135            GECODE_ME_FAIL(_s.intersect(home, is.min(), is.max()));
00136          } else {
00137           IntSetRanges rd(is);
00138           GECODE_ME_FAIL(_s.intersectI(home, rd));
00139          }
00140       }
00141       break;
00142     case SRT_SUP:
00143       {
00144         if (is.ranges() == 1) {
00145           GECODE_ME_FAIL(_s.include(home, is.min(), is.max()));
00146         } else {
00147           IntSetRanges rd(is);
00148           GECODE_ME_FAIL(_s.includeI(home, rd));
00149         }
00150       }
00151       break;
00152     case SRT_CMPL:
00153       {
00154         if (is.ranges() == 1) {
00155           GECODE_ME_FAIL(_s.exclude(home, is.min(), is.max()));
00156           GECODE_ME_FAIL(
00157                          _s.include(home,
00158                                     Set::Limits::min,
00159                                     is.min()-1) );
00160           GECODE_ME_FAIL(
00161                          _s.include(home, is.max()+1,
00162                                     Set::Limits::max) );
00163         } else {
00164           IntSetRanges rd1(is);
00165           Set::RangesCompl<IntSetRanges > rdC1(rd1);
00166           GECODE_ME_FAIL(_s.includeI(home, rdC1));
00167           IntSetRanges rd2(is);
00168           Set::RangesCompl<IntSetRanges > rdC2(rd2);
00169           GECODE_ME_FAIL(_s.intersectI(home, rdC2));
00170         }
00171       }
00172       break;
00173     default:
00174       throw Set::UnknownRelation("Set::dom");
00175     }
00176   }
00177 
00178   void
00179   dom(Home home, SetVar s, SetRelType r, int i, BoolVar b) {
00180     Set::Limits::check(i, "Set::dom");
00181     IntSet d(i,i);
00182     dom(home, s, r, d, b);
00183   }
00184 
00185   void
00186   dom(Home home, SetVar s, SetRelType r, int i, int j, BoolVar b) {
00187     Set::Limits::check(i, "Set::dom");
00188     Set::Limits::check(j, "Set::dom");
00189     IntSet d(i,j);
00190     dom(home, s, r, d, b);
00191   }
00192 
00193   void
00194   dom(Home home, SetVar s, SetRelType r, const IntSet& is, BoolVar b) {
00195     Set::Limits::check(is, "Set::dom");
00196     if (home.failed()) return;
00197     switch (r) {
00198     case SRT_EQ:
00199       {
00200         Set::ConstSetView cv(home, is);
00201         GECODE_ES_FAIL(
00202                        (Set::Rel::ReEq<Set::SetView,
00203                         Set::ConstSetView>::post(home, s, cv, b)));
00204       }
00205       break;
00206     case SRT_LQ:
00207       {
00208         Set::ConstSetView cv(home, is);
00209         GECODE_ES_FAIL(
00210           (Set::Rel::ReLq<Set::SetView,Set::ConstSetView,false>
00211             ::post(home,s,cv,b)));
00212       }
00213       break;
00214     case SRT_LE:
00215       {
00216         Set::ConstSetView cv(home, is);
00217         GECODE_ES_FAIL(
00218           (Set::Rel::ReLq<Set::SetView,Set::ConstSetView,true>
00219             ::post(home,s,cv,b)));
00220       }
00221       break;
00222     case SRT_GQ:
00223       {
00224         Set::ConstSetView cv(home, is);
00225         GECODE_ES_FAIL(
00226           (Set::Rel::ReLq<Set::ConstSetView,Set::SetView,false>
00227             ::post(home,cv,s,b)));
00228       }
00229       break;
00230     case SRT_GR:
00231       {
00232         Set::ConstSetView cv(home, is);
00233         GECODE_ES_FAIL(
00234           (Set::Rel::ReLq<Set::ConstSetView,Set::SetView,true>
00235             ::post(home,cv,s,b)));
00236       }
00237       break;
00238     case SRT_NQ:
00239       {
00240         BoolVar notb(home,0,1);
00241         rel(home, b, IRT_NQ, notb);
00242         Set::ConstSetView cv(home, is);
00243         GECODE_ES_FAIL(
00244                        (Set::Rel::ReEq<Set::SetView,
00245                         Set::ConstSetView>::post(home, s, cv, notb)));
00246       }
00247       break;
00248     case SRT_SUB:
00249       {
00250         Set::ConstSetView cv(home, is);
00251         GECODE_ES_FAIL(
00252                        (Set::Rel::ReSubset<Set::SetView,Set::ConstSetView>
00253                         ::post(home, s, cv, b)));
00254       }
00255       break;
00256     case SRT_SUP:
00257       {
00258         Set::ConstSetView cv(home, is);
00259         GECODE_ES_FAIL(
00260                        (Set::Rel::ReSubset<Set::ConstSetView,Set::SetView>
00261                         ::post(home, cv, s, b)));
00262       }
00263       break;
00264     case SRT_DISJ:
00265       {
00266         // x||y <=> b is equivalent to
00267         // ( y <= complement(x) and x<=complement(y) ) <=> b
00268 
00269         // compute complement of is
00270         IntSetRanges dr1(is);
00271         Set::RangesCompl<IntSetRanges > dc1(dr1);
00272         IntSet dcompl(dc1);
00273         Set::ConstSetView cvcompl(home, dcompl);
00274         GECODE_ES_FAIL(
00275                        (Set::Rel::ReSubset<Set::SetView,Set::ConstSetView>
00276                         ::post(home, s, cvcompl, b)));
00277       }
00278       break;
00279     case SRT_CMPL:
00280       {
00281         Set::SetView sv(s);
00282 
00283         IntSetRanges dr1(is);
00284         Set::RangesCompl<IntSetRanges> dc1(dr1);
00285         IntSet dcompl(dc1);
00286         Set::ConstSetView cvcompl(home, dcompl);
00287 
00288         GECODE_ES_FAIL(
00289                        (Set::Rel::ReEq<Set::SetView,Set::ConstSetView>
00290                         ::post(home, sv, cvcompl, b)));
00291       }
00292       break;
00293     default:
00294       throw Set::UnknownRelation("Set::dom");
00295     }
00296   }
00297 
00298 }
00299 
00300 // STATISTICS: set-post