38 namespace Gecode {
namespace Int {
namespace Linear {
67 int n =
static_cast<int>(sba._lst - sba._fst);
71 for (
int i=n;
i--; ) {
72 _fst[
i].
a = sba._fst[
i].
a;
101 return static_cast<int>(_lst - _fst);
104 ScaleBoolArray::ScaleDec::operator ()(
const ScaleBool&
x,
112 Support::quicksort<ScaleBool,ScaleDec>(
fst(),
size(), scale_dec);
151 template<
class SBAP,
class SBAN,
class VX, PropCond pcx>
157 x.subscribe(home,*
this,pcx);
158 p.subscribe(home,*
this);
159 n.subscribe(home,*
this);
162 template<
class SBAP,
class SBAN,
class VX, PropCond pcx>
169 template<
class SBAP,
class SBAN,
class VX, PropCond pcx>
172 x.cancel(home,*
this,pcx);
173 p.cancel(home,*
this);
174 n.cancel(home,*
this);
176 return sizeof(*this);
179 template<
class SBAP,
class SBAN,
class VX, PropCond pcx>
186 x.update(home,share,x0);
187 p.update(home,share,p0);
188 n.update(home,share,n0);
196 template<
class SBAP,
class SBAN,
class VX>
203 template<
class SBAP,
class SBAN,
class VX>
211 template<
class SBAP,
class SBAN,
class VX>
219 (home,share,*
this,ep,
n,z,
c+
x.val());
222 (home,share,*
this,ep,
n,
x,
c);
224 }
else if (
n.empty()) {
229 (home,share,*
this,
p,en,z,
c+
x.val());
232 (home,share,*
this,
p,en,
x,
c);
239 template<
class SBAP,
class SBAN,
class VX>
250 while ((f < l) && f->
x.
none()) {
258 }
else if (f->
x.
none()) {
259 su_n += f->
a; *t = *f; t++;
270 while ((f < l) && f->
x.
none()) {
278 }
else if (f->
x.
none()) {
279 sl_p += f->
a; *t = *f; t++;
292 if (
p.empty() &&
n.empty()) {
300 const int MOD_SL = 1 << 0;
301 const int MOD_SU = 1 << 1;
303 int mod = MOD_SL | MOD_SU;
306 if ((mod & MOD_SL) != 0) {
316 p.fst(f); mod |= MOD_SU;
327 n.fst(f); mod |= MOD_SU;
332 const int x_min =
x.min();
337 su_n -=
x.min() - x_min;
342 if ((mod & MOD_SU) != 0) {
352 p.fst(f); mod |= MOD_SL;;
363 n.fst(f); mod |= MOD_SL;;
368 const int x_max =
x.max();
373 sl_p +=
x.max() - x_max;
385 template<
class SBAP,
class SBAN,
class VX>
388 SBAP&
p, SBAN&
n, VX
x,
int c) {
394 }
else if (n.empty()) {
411 template<
class SBAP,
class SBAN,
class VX>
418 template<
class SBAP,
class SBAN,
class VX>
426 template<
class SBAP,
class SBAN,
class VX>
434 (home,share,*
this,ep,
n,z,
c+
x.val());
437 (home,share,*
this,ep,
n,
x,
c);
439 }
else if (
n.empty()) {
444 (home,share,*
this,
p,en,z,
c+
x.val());
447 (home,share,*
this,
p,en,
x,
c);
454 template<
class SBAP,
class SBAN,
class VX>
464 while ((f < l) && f->
x.
none())
471 }
else if (f->
x.
none()) {
483 while ((f < l) && f->
x.
none()) {
491 }
else if (f->
x.
none()) {
492 sl += f->
a; *t = *f; t++;
524 const int slx =
x.max() - sl;
532 if (
p.empty() &&
n.empty())
540 template<
class SBAP,
class SBAN,
class VX>
543 SBAP&
p, SBAN&
n, VX
x,
int c) {
549 }
else if (n.empty()) {
565 template<
class SBAP,
class SBAN,
class VX>
572 template<
class SBAP,
class SBAN,
class VX>
580 template<
class SBAP,
class SBAN,
class VX>
588 (home,share,*
this,ep,
n,z,
c+
x.val());
591 (home,share,*
this,ep,
n,
x,
c);
593 }
else if (
n.empty()) {
598 (home,share,*
this,
p,en,z,
c+
x.val());
601 (home,share,*
this,
p,en,
x,
c);
608 template<
class SBAP,
class SBAN,
class VX>
619 c -= f->
a; *f = *(t++);
620 }
else if (f->
x.
zero()) {
634 c += f->
a; *f = *(t++);
635 }
else if (f->
x.
zero()) {
644 if (
p.empty() &&
n.empty()) {
651 if (
p.empty() && (
n.size() == 1)) {
652 if (r == -
n.fst()->a) {
659 if ((
p.size() == 1) &&
n.empty()) {
660 if (r ==
p.fst()->a) {
673 template<
class SBAP,
class SBAN,
class VX>
676 SBAP&
p, SBAN&
n, VX
x,
int c) {
681 }
else if (n.empty()) {