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
00041
00042
00043
00044 namespace Gecode { namespace Set { namespace Rel {
00045
00046 template <class View0, class View1>
00047 forceinline
00048 Eq<View0,View1>::Eq(Space* home, View0 x, View1 y)
00049 : MixBinaryPropagator<View0,PC_SET_ANY,View1,PC_SET_ANY>(home,x,y) {}
00050
00051 template <class View0, class View1>
00052 forceinline
00053 Eq<View0,View1>::Eq(Space* home, bool share, Eq& p)
00054 : MixBinaryPropagator<View0,PC_SET_ANY,View1,PC_SET_ANY>(home,share,p) {}
00055
00056 template <class View0, class View1>
00057 ExecStatus
00058 Eq<View0,View1>::post(Space* home, View0 x, View1 y) {
00059 (void) new (home) Eq(home,x,y);
00060 return ES_OK;
00061 }
00062
00063 template <class View0, class View1>
00064 Actor*
00065 Eq<View0,View1>::copy(Space* home, bool share) {
00066 return new (home) Eq(home,share,*this);
00067 }
00068
00069 template <class View0, class View1>
00070 Support::Symbol
00071 Eq<View0,View1>::ati(void) {
00072 return Reflection::mangle<View0,View1>("Gecode::Set::Rel::Eq");
00073 }
00074
00075 template <class View0, class View1>
00076 Reflection::ActorSpec
00077 Eq<View0,View1>::spec(const Space* home, Reflection::VarMap& m) const {
00078 return MixBinaryPropagator<View0,PC_SET_ANY,View1,PC_SET_ANY>
00079 ::spec(home, m, ati());
00080 }
00081
00082 template <class View0, class View1>
00083 void
00084 Eq<View0,View1>::post(Space* home, Reflection::VarMap& vars,
00085 const Reflection::ActorSpec& spec) {
00086 spec.checkArity(2);
00087 View0 x0(home, vars, spec[0]);
00088 View1 x1(home, vars, spec[1]);
00089 (void) new (home) Eq(home,x0,x1);
00090 }
00091
00092 template <class View0, class View1>
00093 ExecStatus
00094 Eq<View0,View1>::propagate(Space* home, ModEventDelta med) {
00095
00096 ModEvent me0 = View0::me(med);
00097 ModEvent me1 = View1::me(med);
00098
00099 if ( testSetEventLB(me0,me1) ) {
00100 GlbRanges<View0> x0lb(x0);
00101 GlbRanges<View1> x1lb(x1);
00102 Iter::Ranges::Union<GlbRanges<View0>,GlbRanges<View1> > lbu(x0lb,x1lb);
00103 Iter::Ranges::Cache<Iter::Ranges::Union
00104 <GlbRanges<View0>, GlbRanges<View1> > > lbuc(lbu);
00105 GECODE_ME_CHECK ( x0.includeI(home,lbuc) );
00106 lbuc.reset();
00107 GECODE_ME_CHECK ( x1.includeI(home,lbuc) );
00108 }
00109
00110 if (testSetEventUB(me0,me1) ) {
00111 LubRanges<View0> x0ub(x0);
00112 LubRanges<View1> x1ub(x1);
00113 Iter::Ranges::Inter<LubRanges<View0>,LubRanges<View1> > ubi(x0ub,x1ub);
00114 Iter::Ranges::Cache<Iter::Ranges::Inter
00115 <LubRanges<View0>,LubRanges<View1> > > ubic(ubi);
00116 GECODE_ME_CHECK ( x0.intersectI(home,ubic) );
00117 ubic.reset();
00118 GECODE_ME_CHECK ( x1.intersectI(home,ubic) );
00119 }
00120
00121 if (testSetEventCard(me0,me1) ) {
00122 unsigned int max = std::min(x0.cardMax(),x1.cardMax());
00123 unsigned int min = std::max(x0.cardMin(),x1.cardMin());
00124 GECODE_ME_CHECK ( x0.cardMax(home,max) );
00125 GECODE_ME_CHECK ( x1.cardMax(home,max) );
00126 GECODE_ME_CHECK ( x0.cardMin(home,min) );
00127 GECODE_ME_CHECK ( x1.cardMin(home,min) );
00128 }
00129
00130 if (x0.assigned()) {
00131 assert (x1.assigned());
00132 return ES_SUBSUMED(this,home);
00133 }
00134 return shared(x0,x1) ? ES_NOFIX : ES_FIX;
00135 }
00136
00137 }}}
00138
00139