Generated on Wed Nov 1 15:04:45 2006 for Gecode by doxygen 1.4.5

rel-op-const.cc

Go to the documentation of this file.
00001 /*
00002  *  Main authors:
00003  *     Guido Tack <tack@gecode.org>
00004  *
00005  *  Contributing authors:
00006  *     Gabor Szokoli <szokoli@gecode.org>
00007  *
00008  *  Copyright:
00009  *     Guido Tack, 2004, 2005
00010  *
00011  *  Last modified:
00012  *     $Date: 2006-04-11 15:58:37 +0200 (Tue, 11 Apr 2006) $ by $Author: tack $
00013  *     $Revision: 3188 $
00014  *
00015  *  This file is part of Gecode, the generic constraint
00016  *  development environment:
00017  *     http://www.gecode.org
00018  *
00019  *  See the file "LICENSE" for information on usage and
00020  *  redistribution of this file, and for a
00021  *     DISCLAIMER OF ALL WARRANTIES.
00022  *
00023  */
00024 
00025 #include "gecode/set.hh"
00026 #include "gecode/iter.hh"
00027 #include "gecode/set/rel.hh"
00028 #include "gecode/set/rel-op.hh"
00029 
00030 namespace Gecode {
00031   using namespace Gecode::Set;
00032   using namespace Gecode::Set::Rel;
00033   using namespace Gecode::Set::RelOp;
00034 
00035   void
00036   rel(Space* home, const IntSet& x, SetOpType op, SetVar y, SetRelType r,
00037       SetVar z) {
00038     ConstantView xv(home, x);
00039     rel_op_post<ConstantView,SetView,SetView>(home, xv, op, y, r, z);
00040   }  
00041 
00042   void
00043   rel(Space* home, SetVar x, SetOpType op, const IntSet& y, SetRelType r,
00044       SetVar z) {
00045     ConstantView yv(home, y);
00046 
00047     if (op==SOT_MINUS) {
00048       switch(r) {
00049       case SRT_EQ:
00050         {
00051           ComplementView<ConstantView> cy(yv);
00052           GECODE_ES_FAIL(home,
00053                          (Intersection<ComplementView<ConstantView>,
00054                           SetView,SetView>
00055                           ::post(home,cy,x,z)));
00056         }
00057         break;
00058       case SRT_NQ:
00059         {
00060           SetVar tmp(home);
00061           GECODE_ES_FAIL(home,
00062                          (Distinct<SetView,SetView>
00063                           ::post(home,z,tmp)));
00064           ComplementView<ConstantView> cy(yv);
00065           GECODE_ES_FAIL(home,
00066                          (Intersection<ComplementView<ConstantView>,
00067                           SetView,SetView>
00068                           ::post(home,cy,x,tmp)));
00069         }
00070         break;
00071       case SRT_SUB:
00072         {
00073           ComplementView<ConstantView> cy(yv);
00074           GECODE_ES_FAIL(home,
00075                          (SuperOfInter<SetView,
00076                           ComplementView<ConstantView>,SetView>
00077                           ::post(home,x,cy,z)));
00078 
00079         }
00080         break;
00081       case SRT_SUP:
00082         {
00083           SetVar tmp(home);
00084           GECODE_ES_FAIL(home,
00085                          (SubSet<SetView,SetView>::post(home,z,tmp)));
00086           
00087           SetView xv(x);
00088           ComplementView<SetView> cx(xv);
00089           GECODE_ES_FAIL(home,
00090                          (Intersection<ConstantView,
00091                           ComplementView<SetView>,SetView>
00092                           ::post(home,yv,cx,tmp)));
00093         }
00094         break;
00095       case SRT_DISJ:
00096         {
00097           SetVar tmp(home);
00098           EmptyView emptyset;
00099           GECODE_ES_FAIL(home,(SuperOfInter<SetView,SetView,EmptyView>
00100                                ::post(home, z, tmp, emptyset)));
00101 
00102           ComplementView<ConstantView> cy(yv);
00103           GECODE_ES_FAIL(home,
00104                          (Intersection<ComplementView<ConstantView>,
00105                           SetView,SetView>
00106                           ::post(home,cy,x,tmp)));
00107         }
00108         break;
00109       case SRT_CMPL:
00110         {
00111           SetView xv(x);
00112           ComplementView<SetView> cx(xv);
00113           GECODE_ES_FAIL(home,
00114                          (Union<ConstantView,
00115                           ComplementView<SetView>,
00116                           SetView>::post(home, yv, cx, z)));
00117         }
00118         break;
00119       }
00120     } else {
00121       rel_op_post<ConstantView,SetView,SetView>(home, yv, op, x, r, z);
00122     }
00123   }  
00124 
00125   void
00126   rel(Space* home, SetVar x, SetOpType op, SetVar y, SetRelType r,
00127       const IntSet& z) {
00128     ConstantView zv(home, z);
00129     rel_op_post<SetView,SetView,ConstantView>(home, x, op, y, r, zv);
00130   }  
00131 
00132   void
00133   rel(Space* home, const IntSet& x, SetOpType op, const IntSet& y,
00134       SetRelType r, SetVar z) {
00135     ConstantView xv(home, x);
00136     ConstantView yv(home, y);
00137     rel_op_post<ConstantView,ConstantView,SetView>(home, xv, op, yv, r, z);
00138   }  
00139 
00140   void
00141   rel(Space* home, const IntSet& x, SetOpType op, SetVar y, SetRelType r,
00142       const IntSet& z) {
00143     ConstantView xv(home, x);
00144     ConstantView zv(home, z);
00145     rel_op_post<ConstantView,SetView,ConstantView>(home, xv, op, y, r, zv);
00146   }  
00147 
00148   void
00149   rel(Space* home, SetVar x, SetOpType op, const IntSet& y, SetRelType r,
00150       const IntSet& z) {
00151     ConstantView yv(home, y);
00152     ConstantView zv(home, z);
00153 
00154     if (op==SOT_MINUS) {
00155       switch(r) {
00156       case SRT_EQ:
00157         {
00158           ComplementView<ConstantView> cy(yv);
00159           GECODE_ES_FAIL(home,
00160                          (Intersection<ComplementView<ConstantView>,
00161                           SetView,ConstantView>
00162                           ::post(home,cy,x,zv)));
00163         }
00164         break;
00165       case SRT_NQ:
00166         {
00167           SetVar tmp(home);
00168           GECODE_ES_FAIL(home,
00169                          (Distinct<ConstantView,SetView>
00170                           ::post(home,zv,tmp)));
00171           ComplementView<ConstantView> cy(yv);
00172           GECODE_ES_FAIL(home,
00173                          (Intersection<ComplementView<ConstantView>,
00174                           SetView,SetView>
00175                           ::post(home,cy,x,tmp)));
00176         }
00177         break;
00178       case SRT_SUB:
00179         {
00180           ComplementView<ConstantView> cy(yv);
00181           GECODE_ES_FAIL(home,
00182                          (SuperOfInter<SetView,
00183                           ComplementView<ConstantView>,ConstantView>
00184                           ::post(home,x,cy,zv)));
00185 
00186         }
00187         break;
00188       case SRT_SUP:
00189         {
00190           // z <= tmp
00191           SetVar tmp(home,z,Limits::Set::int_min, Limits::Set::int_max);
00192           SetView xv(x);
00193           ComplementView<SetView> cx(xv);
00194           
00195           GECODE_ES_FAIL(home,
00196                          (Intersection<ConstantView,
00197                           ComplementView<SetView>,SetView>
00198                           ::post(home,yv,cx,tmp)));
00199         }
00200         break;
00201       case SRT_DISJ:
00202         {
00203           SetVar tmp(home);
00204           SetView tmpv(tmp);
00205           IntSetRanges zi(z);
00206           GECODE_ME_FAIL(home, tmpv.excludeI(home, zi));
00207           
00208           ComplementView<ConstantView> cy(yv);
00209           GECODE_ES_FAIL(home,
00210                          (Intersection<ComplementView<ConstantView>,
00211                           SetView,SetView>
00212                           ::post(home,cy,x,tmp)));
00213         }
00214         break;
00215       case SRT_CMPL:
00216         {
00217           SetView xv(x);
00218           ComplementView<SetView> cx(xv);
00219           GECODE_ES_FAIL(home,
00220                          (Union<ConstantView,
00221                           ComplementView<SetView>,
00222                           ConstantView>::post(home, yv, cx, zv)));
00223         }
00224         break;
00225       }
00226     } else {
00227       rel_op_post<ConstantView,SetView,ConstantView>(home, yv, op, x, r, zv);
00228     }
00229   }  
00230 
00231 }
00232 
00233 // STATISTICS: set-post