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 #ifndef __GECODE_INT_COUNT_HH__
00037 #define __GECODE_INT_COUNT_HH__
00038
00039 #include <gecode/int.hh>
00040
00046 namespace Gecode { namespace Int { namespace Count {
00047
00053
00054 template<class VY>
00055 bool isintset(VY y);
00057 template<class VY>
00058 bool isval(VY y);
00059
00061 template<class VY>
00062 void subscribe(Space& home, Propagator& p, VY y);
00064 template<class VY>
00065 void cancel(Space& home, Propagator& p, VY y);
00067 template<class VY>
00068 void reschedule(Space& home, Propagator& p, VY y);
00070 template<class VY>
00071 void update(VY& y, Space& home, bool shared, VY py);
00072
00074 template<class VX>
00075 RelTest holds(VX x, VX y);
00077 template<class VX>
00078 RelTest holds(VX x, ConstIntView y);
00080 template<class VX>
00081 RelTest holds(VX x, ZeroIntView y);
00083 template<class VX>
00084 RelTest holds(VX x, const IntSet& y);
00085
00087 template<class VX>
00088 ExecStatus post_true(Home home, ViewArray<VX>& x, VX y);
00090 template<class VX>
00091 ExecStatus post_true(Home home, ViewArray<VX>& x, ConstIntView y);
00093 template<class VX>
00094 ExecStatus post_true(Home home, ViewArray<VX>& x, ZeroIntView y);
00096 template<class VX>
00097 ExecStatus post_true(Home home, ViewArray<VX>& x, const IntSet& y);
00098
00100 template<class VX>
00101 ExecStatus post_false(Home home, ViewArray<VX>& x, VX y);
00103 template<class VX>
00104 ExecStatus post_false(Home home, ViewArray<VX>& x, ConstIntView y);
00106 template<class VX>
00107 ExecStatus post_false(Home home, ViewArray<VX>& x, ZeroIntView y);
00109 template<class VX>
00110 ExecStatus post_false(Home home, ViewArray<VX>& x, const IntSet& y);
00111
00113 template<class VX>
00114 ExecStatus prune(Home home, ViewArray<VX>& x, VX y);
00116 template<class VX>
00117 ExecStatus prune(Home home, ViewArray<VX>& x, ConstIntView y);
00119 template<class VX>
00120 ExecStatus prune(Home home, ViewArray<VX>& x, ZeroIntView y);
00122 template<class VX>
00123 ExecStatus prune(Home home, ViewArray<VX>& x, const IntSet& y);
00125
00126 }}}
00127
00128 #include <gecode/int/count/rel.hpp>
00129
00130
00131 namespace Gecode { namespace Int { namespace Count {
00132
00137 template<class VX, class VY>
00138 class IntBase : public Propagator {
00139 protected:
00141 ViewArray<VX> x;
00143 int n_s;
00145 VY y;
00147 int c;
00149 IntBase(Space& home, IntBase& p);
00151 IntBase(Home home, ViewArray<VX>& x, int n_s, VY y, int c);
00152 public:
00154 virtual PropCost cost(const Space& home, const ModEventDelta& med) const;
00156 virtual void reschedule(Space& home);
00158 virtual size_t dispose(Space& home);
00159 };
00160
00171 template<class VX, class VY>
00172 class EqInt : public IntBase<VX,VY> {
00173 protected:
00174 using IntBase<VX,VY>::x;
00175 using IntBase<VX,VY>::n_s;
00176 using IntBase<VX,VY>::y;
00177 using IntBase<VX,VY>::c;
00179 EqInt(Space& home, EqInt& p);
00181 EqInt(Home home, ViewArray<VX>& x, int n_s, VY y, int c);
00182 public:
00184 virtual Actor* copy(Space& home);
00186 virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00188 static ExecStatus post(Home home, ViewArray<VX>& x, VY y, int c);
00189 };
00190
00201 template<class VX, class VY>
00202 class GqInt : public IntBase<VX,VY> {
00203 protected:
00204 using IntBase<VX,VY>::x;
00205 using IntBase<VX,VY>::n_s;
00206 using IntBase<VX,VY>::y;
00207 using IntBase<VX,VY>::c;
00209 GqInt(Space& home, GqInt& p);
00211 GqInt(Home home, ViewArray<VX>& x, int n_s, VY y, int c);
00212 public:
00214 virtual Actor* copy(Space& home);
00216 virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00218 static ExecStatus post(Home home, ViewArray<VX>& x, VY y, int c);
00219 };
00220
00231 template<class VX, class VY>
00232 class LqInt : public IntBase<VX,VY> {
00233 protected:
00234 using IntBase<VX,VY>::x;
00235 using IntBase<VX,VY>::n_s;
00236 using IntBase<VX,VY>::y;
00237 using IntBase<VX,VY>::c;
00239 LqInt(Space& home, LqInt& p);
00241 LqInt(Home home, ViewArray<VX>& x, int n_s, VY y, int c);
00242 public:
00244 virtual Actor* copy(Space& home);
00246 virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00248 static ExecStatus post(Home home, ViewArray<VX>& x, VY y, int c);
00249 };
00250
00251 }}}
00252
00253 #include <gecode/int/count/int-base.hpp>
00254 #include <gecode/int/count/int-eq.hpp>
00255 #include <gecode/int/count/int-gq.hpp>
00256 #include <gecode/int/count/int-lq.hpp>
00257
00258
00259 namespace Gecode { namespace Int { namespace Count {
00260
00265 template<class VX, class VY, class VZ>
00266 class ViewBase : public Propagator {
00267 protected:
00269 ViewArray<VX> x;
00271 VY y;
00273 VZ z;
00275 int c;
00277 ViewBase(Space& home, ViewBase& p);
00279 ViewBase(Home home, ViewArray<VX>& x, VY y, VZ z, int c);
00280 public:
00282 virtual size_t dispose(Space& home);
00284 virtual PropCost cost(const Space& home, const ModEventDelta& med) const;
00286 virtual void reschedule(Space& home);
00287 protected:
00289 void count(Space& home);
00291 int atleast(void) const;
00293 int atmost(void) const;
00295 static bool sharing(const ViewArray<VX>& x, const VY& y, const VZ& z);
00296 };
00297
00308 template<class VX, class VY, class VZ, bool shr, bool dom>
00309 class EqView : public ViewBase<VX,VY,VZ> {
00310 protected:
00311 using ViewBase<VX,VY,VZ>::x;
00312 using ViewBase<VX,VY,VZ>::z;
00313 using ViewBase<VX,VY,VZ>::c;
00314 using ViewBase<VX,VY,VZ>::y;
00315 using ViewBase<VX,VY,VZ>::count;
00316 using ViewBase<VX,VY,VZ>::atleast;
00317 using ViewBase<VX,VY,VZ>::atmost;
00318 using ViewBase<VX,VY,VZ>::sharing;
00319
00321 EqView(Space& home, EqView& p);
00322 public:
00324 EqView(Home home, ViewArray<VX>& x, VY y, VZ z, int c);
00326 virtual Actor* copy(Space& home);
00328 virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00330 static ExecStatus post(Home home, ViewArray<VX>& x, VY y, VZ z, int c);
00331 };
00332
00343 template<class VX, class VY, class VZ, bool shr>
00344 class LqView : public ViewBase<VX,VY,VZ> {
00345 protected:
00346 using ViewBase<VX,VY,VZ>::x;
00347 using ViewBase<VX,VY,VZ>::z;
00348 using ViewBase<VX,VY,VZ>::c;
00349 using ViewBase<VX,VY,VZ>::y;
00350 using ViewBase<VX,VY,VZ>::count;
00351 using ViewBase<VX,VY,VZ>::atleast;
00352 using ViewBase<VX,VY,VZ>::atmost;
00353 using ViewBase<VX,VY,VZ>::sharing;
00354
00356 LqView(Space& home, LqView& p);
00357 public:
00359 LqView(Home home, ViewArray<VX>& x, VY y, VZ z, int c);
00361 virtual Actor* copy(Space& home);
00363 virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00365 static ExecStatus post(Home home, ViewArray<VX>& x, VY y, VZ z, int c);
00366 };
00367
00378 template<class VX, class VY, class VZ, bool shr, bool dom>
00379 class GqView : public ViewBase<VX,VY,VZ> {
00380 protected:
00381 using ViewBase<VX,VY,VZ>::x;
00382 using ViewBase<VX,VY,VZ>::z;
00383 using ViewBase<VX,VY,VZ>::c;
00384 using ViewBase<VX,VY,VZ>::y;
00385 using ViewBase<VX,VY,VZ>::count;
00386 using ViewBase<VX,VY,VZ>::atleast;
00387 using ViewBase<VX,VY,VZ>::atmost;
00388 using ViewBase<VX,VY,VZ>::sharing;
00389
00391 GqView(Space& home, GqView& p);
00392 public:
00394 GqView(Home home, ViewArray<VX>& x, VY y, VZ z, int c);
00396 virtual Actor* copy(Space& home);
00398 virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00400 static ExecStatus post(Home home, ViewArray<VX>& x, VY y, VZ z, int c);
00401 };
00402
00403 }}}
00404
00405 #include <gecode/int/count/view-base.hpp>
00406 #include <gecode/int/count/view-eq.hpp>
00407 #include <gecode/int/count/view-gq.hpp>
00408 #include <gecode/int/count/view-lq.hpp>
00409
00410 #endif
00411
00412
00413