41 namespace Gecode {
namespace Search {
44 template<
class T,
template<
class>
class E>
54 template<
class T,
template<
class>
class E>
59 template<
class T,
template<
class>
class E>
62 return build<T,PBS<T,E> >(s,
opt);
69 namespace Gecode {
namespace Search {
namespace Seq {
82 namespace Gecode {
namespace Search {
namespace Par {
95 namespace Gecode {
namespace Search {
97 template<
class T,
template<
class>
class E>
105 static_cast<double>(opt.
assets)),1.0);
107 unsigned int n_slaves = opt.
assets;
112 SearchTracer::EngineType::PBS, n_slaves);
114 for (
unsigned int i=0;
i<n_slaves;
i++) {
116 Space* slave = (
i == n_slaves-1) ?
117 master : master->
clone();
119 slaves[
i] = build<T,E>(slave,
opt);
125 template<
class T,
template<
class>
class E>
131 int n_slaves = sebs.
size();
136 SearchTracer::EngineType::PBS, n_slaves);
138 for (
int i=0;
i<n_slaves;
i++) {
141 sebs[
i]->options().stop = stops[
i];
142 sebs[
i]->options().clone =
false;
143 Space* slave = (
i == n_slaves-1) ?
144 master : master->
clone();
146 slaves[
i] = (*sebs[
i])(slave);
153 #ifdef GECODE_HAS_THREADS 155 template<
class T,
template<
class>
class E>
162 unsigned int n_slaves =
std::min(static_cast<unsigned int>(opt.
threads),
168 SearchTracer::EngineType::PBS, n_slaves);
173 for (
unsigned int i=0;
i<n_slaves;
i++) {
175 Space* slave = (
i == n_slaves-1) ?
176 master : master->
clone();
178 slaves[
i] = build<T,E>(slave,
opt);
184 template<
class T,
template<
class>
class E>
195 SearchTracer::EngineType::PBS, n_slaves);
200 for (
int i=0;
i<n_slaves;
i++) {
203 sebs[
i]->options().stop = stops[
i];
204 sebs[
i]->options().clone =
false;
205 Space* slave = (
i == n_slaves-1) ?
206 master : master->
clone();
208 slaves[
i] = (*sebs[
i])(slave);
212 for (
int i=n_slaves;
i<sebs.
size();
i++)
224 template<
class T,
template<
class>
class E>
243 dynamic_cast<T*
>(s->clone()) : s;
247 (void) master->master(0);
251 (void) master->slave(0);
252 e = Search::build<T,E>(master,
opt);
256 #ifdef GECODE_HAS_THREADS 258 e = Search::pbspar<T,E>(master,stat,
opt);
261 e = Search::pbsseq<T,E>(master,stat,
opt);
264 template<
class T,
template<
class>
class E>
271 for (
int i=sebs.
size();
i--; )
272 b += sebs[
i]->
best() ? 1 : 0;
273 if ((b > 0) && (b < sebs.
size()))
275 best = (b == sebs.
size());
291 dynamic_cast<T*
>(s->clone()) : s;
295 (void) master->master(0);
297 #ifdef GECODE_HAS_THREADS 299 e = Search::pbspar<T,E>(master,sebs,stat,
opt,
best);
302 e = Search::pbsseq<T,E>(master,sebs,stat,
opt,
best);
305 template<
class T,
template<
class>
class E>
310 template<
class T,
template<
class>
class E>
314 SEBs sebs(2, seb0, seb1);
317 template<
class T,
template<
class>
class E>
321 SEBs sebs(3, seb0, seb1, seb2);
324 template<
class T,
template<
class>
class E>
328 SEBs sebs(4, seb0, seb1, seb2, seb3);
332 template<
class T,
template<
class>
class E>
339 template<
class T,
template<
class>
class E>
Engine * pbsengine(Engine **slaves, Stop **stops, unsigned int n_slaves, const Statistics &stat, const Search::Options &opt, bool best)
Create sequential portfolio engine.
void build(T *s, SEBs &sebs, const Search::Options &o)
The actual build function.
Search engine implementation interface
Engine * pbspar(T *master, const Search::Statistics &stat, Options &opt)
int size(void) const
Return size of array (number of elements)
Engine * pbsseq(T *master, const Search::Statistics &stat, Options &opt)
const FloatNum max
Largest allowed float value.
Meta engine using a portfolio of search engines.
#define GECODE_SEARCH_EXPORT
Options & options(void)
Provide access to options.
virtual Engine * operator()(Space *s) const
The actual build function.
T * alloc(long unsigned int n)
Allocate block of n objects of type T from region.
A class for building search engines.
Exception: No assets requested for portfolio-based search
Options opt
Stored and already expanded options.
void stop(Support::Timer &timer, std::ostream &os)
Get time since start of timer and print user friendly time information.
Engine * build(Space *s, const Options &opt)
Build an engine of type E for a script T.
virtual T * next(void)
Return next solution (NULL, if none exists or search has been stopped)
Engine * dead(const Options &o, const Statistics &stat)
unsigned long int fail
Number of failed nodes in search tree.
Engine * pbsengine(Engine **slaves, Stop **stops, unsigned int n_slaves, const Statistics &stat, bool best)
Create parallel portfolio engine.
Options expand(void) const
Expand with real number of threads.
double threads
Number of threads to use.
const bool b
Whether engine to be built is a best solution search engine.
const FloatNum min
Smallest allowed float value.
Gecode::IntArgs i(4, 1, 2, 3, 4)
Space * clone(CloneStatistics &stat=unused_clone) const
Clone space.
Stop * pbsstop(Stop *so)
Create stop object.
bool clone
Whether engines create a clone when being initialized.
virtual bool slave(const MetaInfo &mi)
Slave configuration function for meta search engines.
SearchTracer * tracer
Tracer object for tracing search.
Exception: Mixed non-best and best solution search requested
unsigned int assets
Number of assets (engines) in a portfolio.
T * pbs(T *s, const Search::Options &o)
Run a portfolio of search engines.
Post propagator for SetVar SetOpType SetVar SetRelType r
static void engine(SearchTracer *tracer, SearchTracer::EngineType t, unsigned int n)
Register engine.
bool best(void) const
Whether engine is a best solution search engine.
PbsBuilder(const Options &opt)
The constructor.
Stop * pbsstop(Stop *so)
Create stop object.
Passing search engine builder arguments.
Stop * stop
Stop object for stopping search.
Gecode toplevel namespace
Base-class for Stop-object.
PBS(T *s, const Search::Options &o=Search::Options::def)
Initialize with engines running copies of s with options o.