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) {
92 co.update(home,share,p.
co);
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);
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>
503 co.update(home,share,p.
co);
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, ReifyMode rm>
560 template<
class VX,
class VB, ReifyMode rm>
566 template<
class VX,
class VB, ReifyMode rm>
572 template<
class VX,
class VB, ReifyMode rm>
578 if ((n_s <
c) || (
c <= 0))
584 template<
class VX,
class VB, ReifyMode rm>
603 for (
int i=
x.size();
i--; )
606 ::
post(home(*
this),nx,
x.size()-
c+1));
613 template<
class VX,
class VB, ReifyMode rm>
616 assert(!b.assigned());
620 for (
int i=n_x;
i--; )
623 }
else if (x[
i].
one()) {
624 x[
i] = x[--n_x]; c--;
635 }
else if ((c == 1) && (rm ==
RM_EQV)) {
638 }
else if ((c == n_x) && (rm ==
RM_EQV)) {
641 for (
int i=n_x;
i--; )
657 template<
class VX,
class VB, ReifyMode rm>
662 template<
class VX,
class VB, ReifyMode rm>
668 template<
class VX,
class VB, ReifyMode rm>
674 template<
class VX,
class VB, ReifyMode rm>
681 if ((
c < 0) || (
c > n_s) || (n_s == 0))
687 template<
class VX,
class VB, ReifyMode rm>
691 if ((
c == 0) && (n_s == 0)) {
711 template<
class VX,
class VB, ReifyMode rm>
714 assert(!b.assigned());
718 for (
int i=n_x;
i--; )
721 }
else if (x[
i].
one()) {
722 x[
i] = x[--n_x]; c--;
725 if ((n_x < c) || (c < 0)) {
729 }
else if ((c == 0) && (n_x == 0)) {
733 }
else if ((c == 0) && (rm ==
RM_EQV)) {
737 }
else if ((c == n_x) && (rm ==
RM_EQV)) {
740 for (
int i=n_x;
i--; )