Generated on Fri Mar 20 15:56:00 2015 for Gecode by doxygen 1.6.3

rel.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: 2013-02-27 17:15:18 +0100 (Wed, 27 Feb 2013) $ by $Author: schulte $
00014  *     $Revision: 13426 $
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/rel.hh>
00042 #include <gecode/set/rel-op.hh>
00043 #include <gecode/set/int.hh>
00044 
00045 namespace Gecode {
00046   using namespace Set;
00047   using namespace Set::Rel;
00048   using namespace Set::RelOp;
00049 
00050   template<class View0, class View1>
00051   void
00052   rel_post(Home home, View0 x0, SetRelType r, View1 x1) {
00053     if (home.failed()) return;
00054     switch (r) {
00055     case SRT_EQ:
00056       GECODE_ES_FAIL((Eq<View0,View1>::post(home,x0,x1)));
00057       break;
00058     case SRT_NQ:
00059       GECODE_ES_FAIL((Distinct<View0,View1>::post(home,x0,x1)));
00060       break;
00061     case SRT_SUB:
00062       GECODE_ES_FAIL((Subset<View0,View1>::post(home, x0,x1)));
00063       break;
00064     case SRT_SUP:
00065       GECODE_ES_FAIL((Subset<View1,View0>::post(home, x1,x0)));
00066       break;
00067     case SRT_DISJ:
00068       {
00069         EmptyView emptyset;
00070         GECODE_ES_FAIL((SuperOfInter<View0,View1,EmptyView>
00071                         ::post(home, x0, x1, emptyset)));
00072       }
00073       break;
00074     case SRT_CMPL:
00075       {
00076         ComplementView<View0> cx0(x0);
00077         GECODE_ES_FAIL((Eq<ComplementView<View0>, View1>
00078                         ::post(home, cx0, x1)));
00079       }
00080       break;
00081     case SRT_LQ:
00082       GECODE_ES_FAIL((Lq<View0,View1,false>::post(home,x0,x1)));
00083       break;
00084     case SRT_LE:
00085       GECODE_ES_FAIL((Lq<View0,View1,true>::post(home,x0,x1)));
00086       break;
00087     case SRT_GQ:
00088       GECODE_ES_FAIL((Lq<View1,View0,false>::post(home,x1,x0)));
00089       break;
00090     case SRT_GR:
00091       GECODE_ES_FAIL((Lq<View1,View0,true>::post(home,x1,x0)));
00092       break;
00093     default:
00094       throw UnknownRelation("Set::rel");
00095     }
00096   }
00097 
00098   template<class View0, class View1, ReifyMode rm>
00099   void
00100   rel_re(Home home, View0 x, SetRelType r, View1 y, BoolVar b) {
00101     if (home.failed()) return;
00102     switch (r) {
00103     case SRT_EQ:
00104       GECODE_ES_FAIL((ReEq<View0,View1,Gecode::Int::BoolView,rm>
00105                       ::post(home, x,y,b)));
00106       break;
00107     case SRT_NQ:
00108       {
00109         Gecode::Int::NegBoolView notb(b);
00110         switch (rm) {
00111         case RM_EQV:
00112           GECODE_ES_FAIL((ReEq<View0,View1,Gecode::Int::NegBoolView,RM_EQV>
00113                          ::post(home,x,y,notb)));
00114           break;
00115         case RM_IMP:
00116           GECODE_ES_FAIL((ReEq<View0,View1,Gecode::Int::NegBoolView,RM_PMI>
00117                          ::post(home,x,y,notb)));
00118           break;
00119         case RM_PMI:
00120           GECODE_ES_FAIL((ReEq<View0,View1,Gecode::Int::NegBoolView,RM_IMP>
00121                          ::post(home,x,y,notb)));
00122           break;
00123         default: throw Gecode::Int::UnknownReifyMode("Set::rel");
00124         }
00125       }
00126       break;
00127     case SRT_SUB:
00128       GECODE_ES_FAIL((ReSubset<View0,View1,rm>::post(home, x,y,b)));
00129       break;
00130     case SRT_SUP:
00131       GECODE_ES_FAIL((ReSubset<View1,View0,rm>::post(home, y,x,b)));
00132       break;
00133     case SRT_DISJ:
00134       {
00135         // x||y <=> b is equivalent to
00136         // ( y <= complement(x) ) <=> b
00137 
00138         ComplementView<View0> xc(x);
00139         GECODE_ES_FAIL((ReSubset<View1,ComplementView<View0>,rm>
00140                         ::post(home, y, xc, b)));
00141       }
00142       break;
00143     case SRT_CMPL:
00144       {
00145         ComplementView<View0> xc(x);
00146         GECODE_ES_FAIL((ReEq<ComplementView<View0>,View1,
00147                         Gecode::Int::BoolView,rm>
00148                         ::post(home, xc, y, b)));
00149       }
00150       break;
00151     case SRT_LQ:
00152       GECODE_ES_FAIL((ReLq<View0,View1,rm,false>::post(home,x,y,b)));
00153       break;
00154     case SRT_LE:
00155       GECODE_ES_FAIL((ReLq<View0,View1,rm,true>::post(home,x,y,b)));
00156       break;
00157     case SRT_GQ:
00158       GECODE_ES_FAIL((ReLq<View1,View0,rm,false>::post(home,y,x,b)));
00159       break;
00160     case SRT_GR:
00161       GECODE_ES_FAIL((ReLq<View1,View0,rm,true>::post(home,y,x,b)));
00162       break;
00163     default:
00164       throw UnknownRelation("Set::rel");
00165     }
00166   }
00167 
00168   void
00169   rel(Home home, SetVar x, SetRelType r, SetVar y) {
00170     rel_post<SetView,SetView>(home,x,r,y);
00171   }
00172 
00173   void
00174   rel(Home home, SetVar s, SetRelType r, IntVar x) {
00175     Gecode::Int::IntView xv(x);
00176     SingletonView xsingle(xv);
00177     rel_post<SetView,SingletonView>(home,s,r,xv);
00178   }
00179 
00180   void
00181   rel(Home home, IntVar x, SetRelType r, SetVar s) {
00182     switch (r) {
00183     case SRT_SUB:
00184       rel(home, s, SRT_SUP, x);
00185       break;
00186     case SRT_SUP:
00187       rel(home, s, SRT_SUB, x);
00188       break;
00189     default:
00190       rel(home, s, r, x);
00191     }
00192   }
00193 
00194   void
00195   rel(Home home, SetVar x, SetRelType rt, SetVar y, Reify r) {
00196     switch (r.mode()) {
00197     case RM_EQV:
00198       rel_re<SetView,SetView,RM_EQV>(home,x,rt,y,r.var());
00199       break;
00200     case RM_IMP:
00201       rel_re<SetView,SetView,RM_IMP>(home,x,rt,y,r.var());
00202       break;
00203     case RM_PMI:
00204       rel_re<SetView,SetView,RM_PMI>(home,x,rt,y,r.var());
00205       break;
00206     default: throw Gecode::Int::UnknownReifyMode("Set::rel");
00207     }
00208   }
00209 
00210   void
00211   rel(Home home, SetVar s, SetRelType rt, IntVar x, Reify r) {
00212     Gecode::Int::IntView xv(x);
00213     SingletonView xsingle(xv);
00214     switch (r.mode()) {
00215     case RM_EQV:
00216       rel_re<SetView,SingletonView,RM_EQV>(home,s,rt,xsingle,r.var());
00217       break;
00218     case RM_IMP:
00219       rel_re<SetView,SingletonView,RM_IMP>(home,s,rt,xsingle,r.var());
00220       break;
00221     case RM_PMI:
00222       rel_re<SetView,SingletonView,RM_PMI>(home,s,rt,xsingle,r.var());
00223       break;
00224     default: throw Gecode::Int::UnknownReifyMode("Set::rel");
00225     }
00226   }
00227 
00228   void
00229   rel(Home home, IntVar x, SetRelType rt, SetVar s, Reify r) {
00230     switch (rt) {
00231     case SRT_SUB:
00232       rel(home, s, SRT_SUP, x, r);
00233       break;
00234     case SRT_SUP:
00235       rel(home, s, SRT_SUB, x, r);
00236       break;
00237     default:
00238       rel(home, s, rt, x, r);
00239     }
00240   }
00241 
00242 }
00243 
00244 // STATISTICS: set-post