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 #ifndef __GECODE_INT_EXTENSIONAL_HH__
00039 #define __GECODE_INT_EXTENSIONAL_HH__
00040
00041 #include <gecode/int.hh>
00042
00043 #include <gecode/int/rel.hh>
00044
00050 namespace Gecode { namespace Int { namespace Extensional {
00051
00066 template<class View, class Val, class Degree, class StateIdx>
00067 class LayeredGraph : public Propagator {
00068 protected:
00070 class State {
00071 public:
00072 Degree i_deg;
00073 Degree o_deg;
00074
00075 void init(void);
00076 };
00078 class Edge {
00079 public:
00080 StateIdx i_state;
00081 StateIdx o_state;
00082 };
00084 class Support {
00085 public:
00086 Val val;
00087 Degree n_edges;
00088 Edge* edges;
00089 };
00091 typedef typename Gecode::Support::IntTypeTraits<Val>::utype ValSize;
00093 class Layer {
00094 public:
00095 View x;
00096 StateIdx n_states;
00097 ValSize size;
00098 State* states;
00099 Support* support;
00100 };
00102 class LayerValues {
00103 private:
00104 const Support* s1;
00105 const Support* s2;
00106 public:
00108 LayerValues(void);
00110 LayerValues(const Layer& l);
00112 void init(const Layer& l);
00114 bool operator ()(void) const;
00116 void operator ++(void);
00118 int val(void) const;
00119 };
00121 class Index : public Advisor {
00122 public:
00124 int i;
00126 Index(Space& home, Propagator& p, Council<Index>& c, int i);
00128 Index(Space& home, Index& a);
00129 };
00131 class IndexRange {
00132 private:
00133 int _fst;
00134 int _lst;
00135 public:
00137 IndexRange(void);
00139 void reset(void);
00141 void add(int i);
00143 void add(const IndexRange& ir);
00145 void lshift(int n);
00147 bool empty(void) const;
00149 int fst(void) const;
00151 int lst(void) const;
00152 };
00154 Council<Index> c;
00156 int n;
00158 Layer* layers;
00160 StateIdx max_states;
00162 unsigned int n_states;
00164 unsigned int n_edges;
00166 IndexRange i_ch;
00168 IndexRange o_ch;
00170 IndexRange a_ch;
00172 State& i_state(int i, StateIdx is);
00174 State& i_state(int i, const Edge& e);
00176 bool i_dec(int i, const Edge& e);
00178 State& o_state(int i, StateIdx os);
00180 State& o_state(int i, const Edge& e);
00182 bool o_dec(int i, const Edge& e);
00184 void audit(void);
00186 template<class Var>
00187 ExecStatus initialize(Space& home,
00188 const VarArgArray<Var>& x, const DFA& dfa);
00190 LayeredGraph(Space& home, LayeredGraph<View,Val,Degree,StateIdx>& p);
00191 public:
00193 template<class Var>
00194 LayeredGraph(Home home,
00195 const VarArgArray<Var>& x, const DFA& dfa);
00197 virtual Actor* copy(Space& home);
00199 virtual PropCost cost(const Space& home, const ModEventDelta& med) const;
00201 virtual void reschedule(Space& home);
00203 virtual ExecStatus advise(Space& home, Advisor& a, const Delta& d);
00205 virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00207 virtual size_t dispose(Space& home);
00209 template<class Var>
00210 static ExecStatus post(Home home,
00211 const VarArgArray<Var>& x, const DFA& dfa);
00212 };
00213
00215 template<class Var>
00216 ExecStatus post_lgp(Home home,
00217 const VarArgArray<Var>& x, const DFA& dfa);
00218
00219 }}}
00220
00221 #include <gecode/int/extensional/layered-graph.hpp>
00222
00223 namespace Gecode { namespace Int { namespace Extensional {
00224
00226 typedef Gecode::Support::BitSetData BitSetData;
00227
00228
00229
00230
00231 template<unsigned int size> class TinyBitSet;
00232
00234 template<class IndexType>
00235 class BitSet {
00236 template<class> friend class BitSet;
00237 template<unsigned int> friend class TinyBitSet;
00238 protected:
00240 IndexType _limit;
00242 IndexType* _index;
00244 BitSetData* _bits;
00246 void replace_and_decrease(IndexType i, BitSetData w);
00247 public:
00249 BitSet(Space& home, unsigned int n);
00251 template<class OldIndexType>
00252 BitSet(Space& home, const BitSet<OldIndexType>& bs);
00254 BitSet(Space& home, const TinyBitSet<1U>& tbs);
00256 BitSet(Space& home, const TinyBitSet<2U>& tbs);
00258 BitSet(Space& home, const TinyBitSet<3U>& tbs);
00260 BitSet(Space& home, const TinyBitSet<4U>& tbs);
00262 unsigned int limit(void) const;
00264 bool empty(void) const;
00266 void flush(void);
00268 unsigned int width(void) const;
00270 void clear_mask(BitSetData* mask) const;
00272 void add_to_mask(const BitSetData* b, BitSetData* mask) const;
00274 template<bool sparse>
00275 void intersect_with_mask(const BitSetData* mask);
00277 void intersect_with_masks(const BitSetData* a, const BitSetData* b);
00279 bool intersects(const BitSetData* b) const;
00281 void nand_with_mask(const BitSetData* b);
00283 unsigned long long int ones(void) const;
00285 unsigned long long int ones(const BitSetData* b) const;
00287 unsigned long long int bits(void) const;
00289 unsigned int words(void) const;
00291 unsigned int size(void) const;
00292 };
00293
00294 }}}
00295
00296 #include <gecode/int/extensional/bit-set.hpp>
00297
00298 namespace Gecode { namespace Int { namespace Extensional {
00299
00301 template<unsigned int _size>
00302 class TinyBitSet {
00303 template<unsigned int> friend class TinyBitSet;
00304 protected:
00306 BitSetData _bits[_size];
00307 public:
00309 TinyBitSet(Space& home, unsigned int n);
00311 template<unsigned int largersize>
00312 TinyBitSet(Space& home, const TinyBitSet<largersize>& tbs);
00314 template<class IndexType>
00315 TinyBitSet(Space& home, const BitSet<IndexType>& bs);
00317 int limit(void) const;
00319 bool empty(void) const;
00321 void flush(void);
00323 unsigned int width(void) const;
00325 void clear_mask(BitSetData* mask);
00327 void add_to_mask(const BitSetData* b, BitSetData* mask) const;
00329 template<bool sparse>
00330 void intersect_with_mask(const BitSetData* mask);
00332 void intersect_with_masks(const BitSetData* a, const BitSetData* b);
00334 bool intersects(const BitSetData* b);
00336 void nand_with_mask(const BitSetData* b);
00338 void nand_with_masks(const BitSetData* a, const BitSetData* b);
00340 unsigned long long int ones(void) const;
00342 unsigned long long int ones(const BitSetData* b) const;
00344 unsigned long long int bits(void) const;
00346 unsigned int words(void) const;
00348 unsigned int size(void) const;
00349 };
00350
00351 }}}
00352
00353 #include <gecode/int/extensional/tiny-bit-set.hpp>
00354
00355 namespace Gecode { namespace Int { namespace Extensional {
00356
00358 typedef TupleSet::Tuple Tuple;
00359
00361 template<class View, bool pos>
00362 class Compact : public Propagator {
00363 protected:
00365 typedef TupleSet::Range Range;
00367 class CTAdvisor : public ViewAdvisor<View> {
00368 public:
00369 using ViewAdvisor<View>::view;
00370 protected:
00372 const Range* _fst;
00374 const Range* _lst;
00375 public:
00377
00378
00379 CTAdvisor(Space& home, Propagator& p, Council<CTAdvisor>& c,
00380 const TupleSet& ts, View x0, int i);
00382 CTAdvisor(Space& home, CTAdvisor& a);
00384
00385 void adjust(void);
00387 const Range* fst(void) const;
00389 const Range* lst(void) const;
00391 void dispose(Space& home, Council<CTAdvisor>& c);
00392 };
00394
00395
00396
00397 class ValidSupports {
00398 protected:
00400 const unsigned int n_words;
00402 int max;
00404 ViewRanges<View> xr;
00406 const Range* sr;
00408 const Range* lst;
00410 int n;
00412 const BitSetData* s;
00414 void find(void);
00415 public:
00417 ValidSupports(const Compact<View,pos>& p, CTAdvisor& a);
00419 ValidSupports(const TupleSet& ts, int i, View x);
00421 void operator ++(void);
00423 bool operator ()(void) const;
00425 const BitSetData* supports(void) const;
00427 int val(void) const;
00428 };
00430 class LostSupports {
00431 protected:
00433 const unsigned int n_words;
00435 const Range* r;
00437 const Range* lst;
00439 int l;
00441 int h;
00443 const BitSetData* s;
00444 public:
00446 LostSupports(const Compact<View,pos>& p, CTAdvisor& a,
00447 int l, int h);
00449 void operator ++(void);
00451 bool operator ()(void) const;
00453 const BitSetData* supports(void) const;
00454 };
00456
00457
00458
00459 bool all(void) const;
00461 bool atmostone(void) const;
00463 protected:
00465 const unsigned int n_words;
00467 TupleSet ts;
00469 Council<CTAdvisor> c;
00471 Compact(Space& home, Compact& p);
00473 Compact(Home home, const TupleSet& ts);
00475 template<class Table>
00476 void setup(Space& home, Table& table, ViewArray<View>& x);
00478 template<class Table>
00479 bool full(const Table& table) const;
00481 const Range* range(CTAdvisor& a, int n);
00483 const BitSetData* supports(CTAdvisor& a, int n);
00484 public:
00486 virtual PropCost cost(const Space& home, const ModEventDelta& med) const;
00488 size_t dispose(Space& home);
00489 };
00490
00503 template<class View, class Table>
00504 class PosCompact : public Compact<View,true> {
00505 public:
00506 typedef typename Compact<View,true>::ValidSupports ValidSupports;
00507 typedef typename Compact<View,true>::Range Range;
00508 typedef typename Compact<View,true>::CTAdvisor CTAdvisor;
00509 typedef typename Compact<View,true>::LostSupports LostSupports;
00510
00511 using Compact<View,true>::setup;
00512 using Compact<View,true>::supports;
00513 using Compact<View,true>::all;
00514 using Compact<View,true>::atmostone;
00515 using Compact<View,true>::c;
00516 using Compact<View,true>::ts;
00517
00519
00520
00521 enum StatusType {
00522 SINGLE = 0,
00523 MULTIPLE = 1,
00524 NONE = 2,
00525 PROPAGATING = 3
00526 };
00528 class Status {
00529 protected:
00531 ptrdiff_t s;
00532 public:
00534 Status(StatusType t);
00536 Status(const Status& s);
00538 StatusType type(void) const;
00540 bool single(CTAdvisor& a) const;
00542 void touched(CTAdvisor& a);
00544 void none(void);
00546 void propagating(void);
00547 };
00549 Status status;
00551 Table table;
00553 bool empty(void) const;
00555 template<class TableProp>
00556 PosCompact(Space& home, TableProp& p);
00558 PosCompact(Home home, ViewArray<View>& x, const TupleSet& ts);
00559 public:
00561 virtual void reschedule(Space& home);
00563 virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00565 virtual Actor* copy(Space& home);
00567 static ExecStatus post(Home home, ViewArray<View>& x, const TupleSet& ts);
00569 size_t dispose(Space& home);
00571 virtual ExecStatus advise(Space& home, Advisor& a, const Delta& d);
00572 };
00573
00575 template<class View>
00576 ExecStatus postposcompact(Home home, ViewArray<View>& x, const TupleSet& ts);
00577
00593 template<class View, class Table>
00594 class NegCompact : public Compact<View,false> {
00595 public:
00596 typedef typename Compact<View,false>::ValidSupports ValidSupports;
00597 typedef typename Compact<View,false>::Range Range;
00598 typedef typename Compact<View,false>::CTAdvisor CTAdvisor;
00599
00600 using Compact<View,false>::setup;
00601 using Compact<View,false>::full;
00602 using Compact<View,false>::supports;
00603 using Compact<View,false>::atmostone;
00604 using Compact<View,false>::c;
00605 using Compact<View,false>::ts;
00606
00608 Table table;
00610 template<class TableProp>
00611 NegCompact(Space& home, TableProp& p);
00613 NegCompact(Home home, ViewArray<View>& x, const TupleSet& ts);
00614 public:
00616 virtual void reschedule(Space& home);
00618 virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00620 virtual Actor* copy(Space& home);
00622 static ExecStatus post(Home home, ViewArray<View>& x, const TupleSet& ts);
00624 size_t dispose(Space& home);
00626 virtual ExecStatus advise(Space& home, Advisor& a, const Delta& d);
00627 };
00628
00630 template<class View>
00631 ExecStatus postnegcompact(Home home, ViewArray<View>& x, const TupleSet& ts);
00632
00633
00635 template<class View, class Table, class CtrlView, ReifyMode rm>
00636 class ReCompact : public Compact<View,false> {
00637 public:
00638 typedef typename Compact<View,false>::ValidSupports ValidSupports;
00639 typedef typename Compact<View,false>::Range Range;
00640 typedef typename Compact<View,false>::CTAdvisor CTAdvisor;
00641
00642 using Compact<View,false>::setup;
00643 using Compact<View,false>::full;
00644 using Compact<View,false>::supports;
00645 using Compact<View,false>::c;
00646 using Compact<View,false>::ts;
00647
00649 Table table;
00651 CtrlView b;
00653 ViewArray<View> y;
00655 template<class TableProp>
00656 ReCompact(Space& home, TableProp& p);
00658 ReCompact(Home home, ViewArray<View>& x, const TupleSet& ts, CtrlView b);
00659 public:
00661 virtual void reschedule(Space& home);
00663 virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00665 virtual Actor* copy(Space& home);
00667 static ExecStatus post(Home home, ViewArray<View>& x, const TupleSet& ts,
00668 CtrlView b);
00670 size_t dispose(Space& home);
00672 virtual ExecStatus advise(Space& home, Advisor& a, const Delta& d);
00673 };
00674
00676 template<class View, class CtrlView, ReifyMode rm>
00677 ExecStatus postrecompact(Home home, ViewArray<View>& x, const TupleSet& ts,
00678 CtrlView b);
00679
00680 }}}
00681
00682 #include <gecode/int/extensional/compact.hpp>
00683
00684 #endif
00685
00686