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 Meta {
namespace Sequential {
77 engine(Engine** slaves, Stop** stops,
unsigned int n_slaves,
78 const Statistics& stat,
const Search::Options&
opt,
bool best);
82 namespace Gecode {
namespace Search {
namespace Meta {
namespace Parallel {
90 engine(Engine** slaves, Stop** stops,
unsigned int n_slaves,
91 const Statistics& stat,
bool best);
95 namespace Gecode {
namespace Search {
namespace Meta {
97 template<
class T,
template<
class>
class E>
105 static_cast<double>(
opt.assets)),1.0);
107 unsigned int n_slaves =
opt.assets;
111 for (
unsigned int i=0;
i<n_slaves;
i++) {
113 Space* slave = (
i == n_slaves-1) ?
114 master : master->
clone(
opt.threads <= 1.0,
opt.share_pbs);
116 slaves[
i] = build<T,E>(slave,
opt);
122 template<
class T,
template<
class>
class E>
128 int n_slaves = sebs.size();
132 for (
int i=0;
i<n_slaves;
i++) {
135 sebs[
i]->options().stop = stops[
i];
136 sebs[
i]->options().clone =
false;
137 Space* slave = (
i == n_slaves-1) ?
138 master : master->
clone(sebs[
i]->options().threads <= 1.0,
139 sebs[
i]->options().share_pbs);
141 slaves[
i] = (*sebs[
i])(slave);
148 #ifdef GECODE_HAS_THREADS
150 template<
class T,
template<
class>
class E>
157 unsigned int n_slaves =
std::min(
static_cast<unsigned int>(
opt.threads),
160 opt.threads = floor(
opt.threads /
static_cast<double>(n_slaves));
165 for (
unsigned int i=0;
i<n_slaves;
i++) {
167 Space* slave = (
i == n_slaves-1) ?
168 master : master->
clone(
false,
opt.share_pbs);
170 slaves[
i] = build<T,E>(slave,
opt);
176 template<
class T,
template<
class>
class E>
183 int n_slaves =
std::min(
static_cast<int>(
opt.threads),
188 for (
int i=0;
i<n_slaves;
i++) {
191 sebs[
i]->options().stop = stops[
i];
192 sebs[
i]->options().clone =
false;
193 Space* slave = (
i == n_slaves-1) ?
194 master : master->
clone(
false,sebs[
i]->options().share_pbs);
196 slaves[
i] = (*sebs[
i])(slave);
200 for (
int i=n_slaves;
i<sebs.size();
i++)
212 template<
class T,
template<
class>
class E>
230 T* master =
opt.clone ?
231 dynamic_cast<T*
>(s->clone(
opt.
threads <= 1.0,
opt.share_pbs)) : s;
235 (void) master->master(0);
239 (void) master->slave(0);
240 e = Search::build<T,E>(master,
opt);
244 #ifdef GECODE_HAS_THREADS
246 e = Search::Meta::parallel<T,E>(master,stat,
opt);
249 e = Search::Meta::sequential<T,E>(master,stat,
opt);
252 template<
class T,
template<
class>
class E>
259 for (
int i=sebs.size();
i--; )
260 b += sebs[
i]->best() ? 1 : 0;
261 if ((
b > 0) && (
b < sebs.size()))
263 best = (
b == sebs.size());
278 T* master =
opt.clone ?
279 dynamic_cast<T*
>(s->clone(
opt.
threads <= 1.0,
opt.share_pbs)) : s;
283 (void) master->master(0);
285 #ifdef GECODE_HAS_THREADS
287 e = Search::Meta::parallel<T,E>(master,sebs,stat,
opt,best);
290 e = Search::Meta::sequential<T,E>(master,sebs,stat,
opt,best);
293 template<
class T,
template<
class>
class E>
298 template<
class T,
template<
class>
class E>
302 SEBs sebs(2, seb0, seb1);
305 template<
class T,
template<
class>
class E>
309 SEBs sebs(3, seb0, seb1, seb2);
312 template<
class T,
template<
class>
class E>
316 SEBs sebs(4, seb0, seb1, seb2, seb3);
320 template<
class T,
template<
class>
class E>
327 template<
class T,
template<
class>
class E>