34 namespace Gecode {
namespace Search {
namespace Seq {
42 template<
class Tracer>
46 template<
class Tracer>
50 : _space(s), _choice(
c), _alt(
a), _nid(nid) {}
52 template<
class Tracer>
58 template<
class Tracer>
64 template<
class Tracer>
70 template<
class Tracer>
76 template<
class Tracer>
90 template<
class Tracer>
94 tracer.engine(SearchTracer::EngineType::LDS, 1U);
98 template<
class Tracer>
101 cur = s;
d = 0U; exhausted =
true;
103 tracer.ei()->invalidate();
106 template<
class Tracer>
112 delete ds.pop().space();
113 cur = s;
d = d0; exhausted =
true;
115 tracer.ei()->invalidate();
119 template<
class Tracer>
125 template<
class Tracer>
131 template<
class Tracer>
137 delete ds.pop().space();
140 template<
class Tracer>
151 unsigned int a = ds.top().alt();
152 const Choice* ch = ds.top().choice();
153 unsigned int nid = ds.top().nid();
155 cur = ds.pop().space();
157 tracer.ei()->init(tracer.wid(), nid, 0, *cur, *ch);
162 cur = ds.top().space()->clone();
164 tracer.ei()->init(tracer.wid(), nid,
a, *cur, *ch);
182 unsigned int nid = tracer.nid();
184 tracer.wid(), nid, *s, ch);
185 tracer.node(*tracer.ei(),ni);
187 tracer.ei()->init(tracer.wid(), nid, 0, *cur, *ch);
197 tracer.wid(), tracer.nid(), *s);
198 tracer.node(*tracer.ei(),ni);
206 tracer.wid(), tracer.nid(), *s);
207 tracer.node(*tracer.ei(),ni);
215 switch (cur->status(*
this)) {
219 tracer.wid(), tracer.nid(), *cur);
220 tracer.node(*tracer.ei(),ni);
228 tracer.skip(*tracer.ei());
235 const Choice* ch = cur->choice();
237 unsigned int nid = tracer.nid();
240 tracer.wid(), nid, *cur, ch);
241 tracer.node(*tracer.ei(),ni);
246 unsigned int d_a = (
d >= alt-1) ? alt-1 :
d;
248 Node sn(cc,ch,d_a-1,nid);
250 stack_depth(
static_cast<unsigned long int>(ds.entries()));
252 tracer.ei()->init(tracer.wid(), nid, d_a, *cur, *ch);
253 cur->commit(*ch,d_a);
257 tracer.ei()->init(tracer.wid(), nid, 0, *cur, *ch);
262 goto check_discrepancy;
270 template<
class Tracer>
273 :
opt(o), e(
opt), root(NULL),
d(0) {
287 template<
class Tracer>
294 if (((s == NULL) && e.stopped()) || (++
d >
opt.d_l) || e.done())
300 }
else if (root != NULL) {
301 e.reset(root->clone(),
d);
307 template<
class Tracer>
313 template<
class Tracer>
316 return e.statistics();
320 template<
class Tracer>
323 delete root; root=NULL;
d=0;
337 template<
class Tracer>
344 template<
class Tracer>