38 namespace Gecode {
namespace Int {
namespace Element {
42 template<
class V0,
class V1,
class Idx,
class Val>
47 template<
class V0,
class V1,
class Idx,
class Val>
55 template<
class V0,
class V1,
class Idx,
class Val>
61 while ((i != 0) && iv[i].
marked())
65 template<
class V0,
class V1,
class Idx,
class Val>
70 template<
class V0,
class V1,
class Idx,
class Val>
79 template<
class V0,
class V1,
class Idx,
class Val>
88 template<
class V0,
class V1,
class Idx,
class Val>
91 :
iv(iv0),
i(
iv[0].val_next) {}
92 template<
class V0,
class V1,
class Idx,
class Val>
97 template<
class V0,
class V1,
class Idx,
class Val>
102 template<
class V0,
class V1,
class Idx,
class Val>
111 template<
class V0,
class V1,
class Idx,
class Val>
117 while ((i != 0) && iv[i].
marked())
121 template<
class V0,
class V1,
class Idx,
class Val>
126 template<
class V0,
class V1,
class Idx,
class Val>
135 template<
class V0,
class V1,
class Idx,
class Val>
145 template<
class V0,
class V1,
class Idx,
class Val>
149 template<
class V0,
class V1,
class Idx,
class Val>
160 template<
class V0,
class V1,
class Idx,
class Val>
169 template<
class V0,
class V1,
class Idx,
class Val>
177 return sizeof(*this);
180 template<
class V0,
class V1,
class Idx,
class Val>
185 }
else if (x1.assigned()) {
193 template<
class V0,
class V1,
class Idx,
class Val>
196 :
Propagator(home,share,p), s0(0), s1(0), iv(NULL) {
198 x0.update(home,share,p.
x0);
199 x1.update(home,share,p.
x1);
202 template<
class V0,
class V1,
class Idx,
class Val>
208 template<
class V0,
class V1,
class Idx,
class Val>
218 template<
class V0,
class V1,
class Idx,
class Val>
222 Idx
i = iv[p].idx_next;
224 while (
v() && (i != 0)) {
226 if (iv[i].idx < v.
min()) {
227 iv[
i].mark(); i=iv[
i].idx_next; iv[p].idx_next=
i;
228 }
else if (iv[i].idx > v.
max()) {
231 p=
i; i=iv[
i].idx_next;
236 iv[
i].mark(); i=iv[
i].idx_next;
240 template<
class V0,
class V1,
class Idx,
class Val>
244 Idx
i = iv[p].val_next;
246 while (
v() && (i != 0)) {
248 i=iv[
i].val_next; iv[p].val_next=
i;
249 }
else if (iv[i].val < v.
min()) {
250 iv[
i].mark(); i=iv[
i].val_next; iv[p].val_next=
i;
251 }
else if (iv[i].val > v.
max()) {
254 p=
i; i=iv[
i].val_next;
259 iv[
i].mark(); i=iv[
i].val_next;
263 template<
class V0,
class V1,
class Idx,
class Val>
268 int*
v = r.
alloc<
int>(x0.size());
271 if (c[
i.val()] != x1.val())
278 template<
class V0,
class V1,
class Idx,
class Val>
286 if (x1.assigned() && (iv == NULL)) {
291 if ((static_cast<ValSize>(x1.size()) == s1) &&
292 (
static_cast<IdxSize>(x0.size()) != s0)) {
301 s1=
static_cast<ValSize>(x1.size());
303 assert(!x0.assigned());
307 if ((static_cast<IdxSize>(x0.size()) == s0) &&
308 (
static_cast<ValSize>(x1.size()) != s1)) {
317 s0=
static_cast<IdxSize>(x0.size());
319 return (x0.assigned() || x1.assigned()) ?
323 bool assigned = x0.assigned() && x1.assigned();
333 if ((x1.min() <=
c[
v.val()]) && (x1.max() >=
c[
v.val()])) {
334 by_idx[
size].idx =
static_cast<Idx
>(
v.val());
335 by_idx[
size].val =
static_cast<Val
>(
c[
v.val()]);
343 if (x1.width() <= 128) {
344 int n_buckets =
static_cast<int>(x1.width());
346 int* buckets = pos - x1.min();
347 for (
int i=n_buckets;
i--; )
349 for (Idx
i=size;
i--; )
350 buckets[by_idx[
i].val]++;
352 for (
int i=0;
i<n_buckets;
i++) {
353 int n=pos[
i]; pos[
i]=p; p+=n;
356 for (Idx
i=size;
i--; )
357 by_val[buckets[by_idx[
i].val]++] =
i+1;
359 for (Idx
i = size;
i--; )
362 Support::quicksort<Idx>(by_val,
size,less);
365 for (Idx
i = size-1;
i--; ) {
366 by_idx[
i].idx_next =
i+2;
367 iv[by_val[
i]].val_next = by_val[
i+1];
369 by_idx[size-1].idx_next = 0;
370 iv[by_val[size-1]].val_next = 0;
373 iv[0].val_next = by_val[0];
388 s0=
static_cast<IdxSize>(x0.size());
389 s1=
static_cast<ValSize>(x1.size());
393 s0=
static_cast<IdxSize>(x0.size());
394 s1=
static_cast<ValSize>(x1.size());
395 return (x0.assigned() || x1.assigned()) ?
401 template<
class V0,
class V1>
404 assert(c.
size() > 0);
410 for (
int i=1;
i<c.
size();
i++) {