00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #ifndef __GECODE_SET_SELECT_HH__
00041 #define __GECODE_SET_SELECT_HH__
00042
00043 #include <gecode/set.hh>
00044
00045 #include <gecode/int/idx-view.hh>
00046 #include <gecode/int/element.hh>
00047 #include <gecode/set/rel.hh>
00048 #include <gecode/set/rel-op.hh>
00049
00050 namespace Gecode { namespace Int {
00052 template<>
00053 class ViewToVarArg<Gecode::Set::SetView> {
00054 public:
00055 typedef Gecode::SetVarArgs argtype;
00056 };
00058 template<>
00059 class ViewToVarArg<Gecode::Set::SingletonView> {
00060 public:
00061 typedef Gecode::IntVarArgs argtype;
00062 };
00063 }}
00064
00065 namespace Gecode { namespace Set { namespace Element {
00066
00078 template<class View, class View0, class View1>
00079 class ElementIntersection : public Propagator {
00080 public:
00081 typedef Gecode::Int::IdxViewArray<View> IdxViewArray;
00082 protected:
00083 IntSet universe;
00084 IdxViewArray iv;
00085 View0 x0;
00086 View1 x1;
00087
00089 ElementIntersection(Space& home, bool share,ElementIntersection& p);
00091 ElementIntersection(Home home,IdxViewArray&,View0,View1,
00092 const IntSet& universe);
00093 public:
00095 virtual Actor* copy(Space& home,bool);
00096 virtual PropCost cost(const Space& home, const ModEventDelta& med) const;
00098 virtual size_t dispose(Space& home);
00100 virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00106 static ExecStatus post(Home home,IdxViewArray& x, View0 y,
00107 View1 z, const IntSet& u);
00108 };
00109
00116 template<class View, class View0, class View1>
00117 class ElementUnion : public Propagator {
00118 public:
00119 typedef Gecode::Int::IdxViewArray<View> IdxViewArray;
00120 protected:
00121 IdxViewArray iv;
00122 View0 x0;
00123 View1 x1;
00124
00126 ElementUnion(Space& home, bool share,ElementUnion& p);
00128 ElementUnion(Home home,IdxViewArray&,View0,View1);
00129 public:
00131 virtual Actor* copy(Space& home,bool);
00132 virtual PropCost cost(const Space& home, const ModEventDelta& med) const;
00134 virtual size_t dispose(Space& home);
00136 virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00142 static ExecStatus post(Home home,IdxViewArray& x,View0 y, View1 z);
00143 };
00144
00151 template<class SView, class RView>
00152 class ElementUnionConst : public Propagator {
00153 protected:
00154 SView x0;
00155 IntSet* iv;
00156 int n_iv;
00157 RView x1;
00158
00160 ElementUnionConst(Space& home, bool share,ElementUnionConst& p);
00162 ElementUnionConst(Home home,SView,const IntSetArgs&,RView);
00163 public:
00165 virtual Actor* copy(Space& home,bool);
00166 virtual PropCost cost(const Space& home, const ModEventDelta& med) const;
00168 virtual size_t dispose(Space& home);
00170 virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00176 static ExecStatus post(Home home,SView z,const IntSetArgs& x,RView y);
00177 };
00178
00185 template<class SView, class RView>
00186 class ElementDisjoint : public Propagator {
00187 public:
00188 typedef Gecode::Int::IdxViewArray<SView> IdxViewArray;
00189 protected:
00190 IdxViewArray iv;
00191 RView x1;
00192
00194 ElementDisjoint(Space& home, bool share,ElementDisjoint& p);
00196 ElementDisjoint(Home home,IdxViewArray&,RView);
00197 public:
00199 virtual Actor* copy(Space& home,bool);
00200 virtual PropCost cost(const Space& home, const ModEventDelta& med) const;
00202 virtual size_t dispose(Space& home);
00204 virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00206 static ExecStatus post(Home home,IdxViewArray& x,RView y);
00207 };
00208
00209 }}}
00210
00211 #include <gecode/set/element/inter.hpp>
00212 #include <gecode/set/element/union.hpp>
00213 #include <gecode/set/element/unionConst.hpp>
00214 #include <gecode/set/element/disjoint.hpp>
00215
00216 #endif
00217
00218
00219