pbs.hh
Go to the documentation of this file.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_SEARCH_META_PARALLEL_PBS_HH__
00039 #define __GECODE_SEARCH_META_PARALLEL_PBS_HH__
00040
00041 #include <gecode/search.hh>
00042
00043 namespace Gecode { namespace Search { namespace Meta { namespace Parallel {
00044
00046 class GECODE_SEARCH_EXPORT PortfolioStop : public Stop {
00047 private:
00049 Stop* so;
00051 volatile bool* tostop;
00052 public:
00054 PortfolioStop(Stop* so);
00056 void share(volatile bool* ts);
00058 virtual bool stop(const Statistics& s, const Options& o);
00060 void stop(bool s);
00062 bool stop(void) const;
00063 };
00064
00065
00066 template<class Collect>
00067 class PBS;
00068
00070 template<class Collect>
00071 class GECODE_SEARCH_EXPORT Slave : public Support::Runnable {
00072 protected:
00074 PBS<Collect>* master;
00076 Engine* slave;
00078 Stop* stop;
00079 public:
00081 Slave(PBS<Collect>* m, Engine* s, Stop* so);
00083 Statistics statistics(void) const;
00085 bool stopped(void) const;
00087 void constrain(const Space& b);
00089 virtual void run(void);
00091 virtual ~Slave(void);
00092 };
00093
00095 class CollectAll {
00096 protected:
00098 Support::DynamicQueue<Space*,Heap> solutions;
00099 public:
00101 static const bool best = false;
00103 CollectAll(void);
00105 bool add(Space* s, Slave<CollectAll>* r);
00107 bool constrain(const Space& b);
00109 bool empty(void) const;
00111 Space* get(Slave<CollectAll>*& r);
00113 ~CollectAll(void);
00114 };
00115
00117 class CollectBest {
00118 protected:
00120 Space* b;
00122 Slave<CollectBest>* reporter;
00123 public:
00125 static const bool best = true;
00127 CollectBest(void);
00129 bool add(Space* s, Slave<CollectBest>* r);
00131 bool constrain(const Space& b);
00133 bool empty(void) const;
00135 Space* get(Slave<CollectBest>*& r);
00137 ~CollectBest(void);
00138 };
00139
00141 template<class Collect>
00142 class GECODE_SEARCH_EXPORT PBS : public Engine {
00143 friend class Slave<Collect>;
00144 protected:
00146 Statistics stat;
00148 Slave<Collect>** slaves;
00150 unsigned int n_slaves;
00152 bool slave_stop;
00154 volatile bool tostop;
00156 Collect solutions;
00158 Support::Mutex m;
00160 unsigned int n_busy;
00162 Support::Event idle;
00164 bool report(Slave<Collect>* slave, Space* s);
00165 public:
00167 PBS(Engine** s, Stop** so, unsigned int n, const Statistics& stat);
00169 virtual Space* next(void);
00171 virtual Statistics statistics(void) const;
00173 virtual bool stopped(void) const;
00175 virtual void constrain(const Space& b);
00177 virtual ~PBS(void);
00178 };
00179
00180 }}}}
00181
00182 #include <gecode/search/meta/parallel/pbs.hpp>
00183
00184 #endif
00185
00186