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++;
286 for (
ScaleBool* f=p.fst(); f<p.lst(); f++)
288 for (
ScaleBool* f=n.fst(); f<n.lst(); f++)
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) {
311 for (
ScaleBool* l=p.lst(); (f < l) && (f->
a > sl_p); f++) {
316 p.fst(f); mod |= MOD_SU;
322 for (
ScaleBool* l=n.lst(); (f < l) && (f->
a > sl_p); f++) {
327 n.fst(f); mod |= MOD_SU;
332 const int x_min = x.min();
333 ModEvent me = x.gq(home,x.max() - sl_p);
337 su_n -= x.min() - x_min;
342 if ((mod & MOD_SU) != 0) {
347 for (
ScaleBool* l=p.lst(); (f < l) && (f->
a > su_n); f++) {
352 p.fst(f); mod |= MOD_SL;;
358 for (
ScaleBool* l=n.lst(); (f < l) && (f->
a > su_n); f++) {
363 n.fst(f); mod |= MOD_SL;;
368 const int x_max = x.max();
369 ModEvent me = x.lq(home,x.min() + su_n);
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++;
499 for (
ScaleBool* f=n.fst(); f<n.lst(); f++)
508 for (
ScaleBool* l=p.lst(); (f < l) && (f->
a > sl); f++)
515 for (
ScaleBool* l=n.lst(); (f < l) && (f->
a > sl); f++) {
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()) {