44 namespace Gecode {
namespace Int {
namespace Linear {
54 :
Propagator(home), co(home), x(x0), n_as(n_s), n_hs(n_s),
c(c0) {
66 for (
int i=n_hs;
i--; )
68 x[
i]=x[--n_hs]; x[n_hs]=x[--n_x];
76 for (
int i=n_x-1;
i>=n_hs;
i--)
79 }
else if (x[
i].zero()) {
89 :
Propagator(home,share,p), n_as(p.n_as), n_hs(n_as) {
106 for (
int i=n_hs;
i--; )
110 return sizeof(*this);
146 for (
int i = x.
size()-1;
i>=n_hs;
i--)
148 std::swap(x[
i],x[n_hs]);
149 x[n_hs++].subscribe(home,a);
152 }
else if (x[
i].
one()) {
156 assert(n_hs <= x.size());
165 int n = x.size()-n_hs+n_as;
168 if ((
c <= 0) || (
c == n))
178 assert((n_as ==
c) && (x.size() == n_hs));
182 for (
int i=n_hs;
i--; )
194 for (
int i=n_x;
i--; )
197 }
else if (x[
i].
one()) {
198 x[
i] = x[--n_x]; c--;
212 for (
int i=n_x;
i--; )
254 if ((
c+1 < n_as) && (x.size()-n_hs <
c))
257 for (
int i = x.
size()-1;
i>=n_hs;
i--)
259 std::swap(x[
i],x[n_hs]);
260 x[n_hs++].subscribe(home,a);
263 }
else if (x[
i].
one()) {
271 int n = x.size()-n_hs+n_as;
272 if ((
c < 0) || (
c > n))
274 if ((
c == 0) || (
c == n))
283 assert(x.size() == n_hs);
288 for (
int i=n_hs;
i--; )
293 for (
int i=n_hs;
i--; )
305 for (
int i=n_x;
i--; )
308 }
else if (x[
i].
one()) {
309 x[
i] = x[--n_x]; c--;
313 if ((c < 0) || (c > n_x))
317 for (
int i=n_x;
i--; )
323 for (
int i=n_x;
i--; )
342 b[b.
size()-1]), x(b),
c(c0) {
343 assert(
x.
size() >= 2);
351 return sizeof(*this);
363 n--; p.
x[
i]=p.
x[n];
x[
i]=
x[n];
364 }
else if (p.
x[
i].one()) {
365 n--; p_c--; p.
x[
i]=p.
x[n];
x[
i]=
x[n];
380 }
else if (x[
i].zero()) {
384 if ((n < c) || (c < 0))
421 }
else if (x[
i].zero()) {
425 assert(!x[
i].zero() && !x[
i].
one());
441 if (x0.zero() || x0.one())
444 if (x1.zero() || x1.one())
446 int n = x.size() + s0 + s1;
447 if ((n <
c) || (
c < 0))
475 template<
class VX,
class VB>
484 template<
class VX,
class VB>
487 if (n_s != x.size()) {
489 for (
int i=n_x;
i--; )
493 assert(x.size() == n_s);
497 template<
class VX,
class VB>
505 b.update(home,share,p.
b);
508 template<
class VX,
class VB>
516 return sizeof(*this);
519 template<
class VX,
class VB>
555 template<
class VX,
class VB>
560 template<
class VX,
class VB>
566 template<
class VX,
class VB>
572 template<
class VX,
class VB>
578 if ((n_s <
c) || (
c <= 0))
584 template<
class VX,
class VB>
599 for (
int i=x.
size();
i--; )
602 ::
post(home(*
this),nx,x.size()-
c+1));
608 template<
class VX,
class VB>
611 assert(!b.assigned());
615 for (
int i=n_x;
i--; )
618 }
else if (x[
i].
one()) {
619 x[
i] = x[--n_x]; c--;
631 }
else if (c == n_x) {
634 for (
int i=n_x;
i--; )
650 template<
class VX,
class VB>
655 template<
class VX,
class VB>
661 template<
class VX,
class VB>
667 template<
class VX,
class VB>
674 if ((
c < 0) || (
c > n_s) || (n_s == 0))
680 template<
class VX,
class VB>
684 if ((
c == 0) && (n_s == 0)) {
700 template<
class VX,
class VB>
703 assert(!b.assigned());
707 for (
int i=n_x;
i--; )
710 }
else if (x[
i].
one()) {
711 x[
i] = x[--n_x]; c--;
714 if ((n_x < c) || (c < 0)) {
717 }
else if ((c == 0) && (n_x == 0)) {
724 }
else if (c == n_x) {
727 for (
int i=n_x;
i--; )