40 namespace Gecode {
namespace Int {
namespace Linear {
46 template<
class P,
class N>
63 template<
class Val,
class P,
class N, PropCond pc>
71 template<
class Val,
class P,
class N, PropCond pc>
79 template<
class Val,
class P,
class N, PropCond pc>
85 template<
class Val,
class P,
class N, PropCond pc>
88 x.cancel(home,*
this,pc);
89 y.cancel(home,*
this,pc);
98 template<
class Val,
class P,
class N, PropCond pc,
class Ctrl>
106 template<
class Val,
class P,
class N, PropCond pc,
class Ctrl>
114 template<
class Val,
class P,
class N, PropCond pc,
class Ctrl>
119 return sizeof(*this);
127 template<
class Val,
class View>
132 for (
int i = n;
i--; ) {
135 c -=
m; x[
i] = x[--n];
137 sl -=
m; su -= x[
i].max();
142 for (
int i = n;
i--; ) {
143 sl -= x[
i].min(); su -= x[
i].max();
148 template<
class Val,
class View>
153 for (
int i = n;
i--; ) {
156 c +=
m; y[
i] = y[--n];
158 sl +=
m; su += y[
i].min();
163 for (
int i = n;
i--; ) {
164 sl += y[
i].max(); su += y[
i].min();
170 template<
class Val,
class P,
class N>
178 bounds_p<Val,P>(med, x,
c, sl, su);
179 bounds_n<Val,N>(med, y,
c, sl, su);
190 return (c == static_cast<Val>(0)) ?
196 const int mod_sl = 1;
197 const int mod_su = 2;
199 int mod = mod_sl | mod_su;
205 for (
int i = x.
size();
i--; ) {
206 const Val xi_max = x[
i].max();
211 su += xi_max - x[
i].max();
216 for (
int i = y.
size();
i--; ) {
217 const Val yi_min = y[
i].min();
222 su += y[
i].min() - yi_min;
230 for (
int i = x.
size();
i--; ) {
231 const Val xi_min = x[
i].min();
236 sl += xi_min - x[
i].min();
241 for (
int i = y.
size();
i--; ) {
242 const Val yi_max = y[
i].max();
247 sl += y[
i].max() - yi_max;
262 template<
class Val,
class P,
class N>
267 template<
class Val,
class P,
class N>
273 }
else if (x.
size() == 0) {
282 template<
class Val,
class P,
class N>
291 template<
class Val,
class P,
class N>
300 assert(x.
size() == 2);
302 (home,share,p,x[0],x[1],c);
308 assert(y.
size() == 2);
310 (home,share,p,y[0],y[1],-c);
318 (home,share,p,x[0],x[1],
c);
323 (home,share,p,y[0],y[1],-c);
330 template<
class Val,
class P,
class N>
339 assert(x.
size() == 3);
341 (home,share,p,x[0],x[1],x[2],c);
347 assert(y.
size() == 3);
349 (home,share,p,y[0],y[1],y[2],-c);
357 (home,share,p,x[0],x[1],x[2],
c);
365 (home,share,p,y[0],y[1],y[2],-c);
368 template<
class Val,
class P,
class N>
374 return eqtobin(home,share,*
this,x,y,c);
376 return eqtoter(home,share,*
this,x,y,c);
381 template<
class Val,
class P,
class N>
384 return prop_bnd<Val,P,N>(home,med,*
this,x,y,
c);
392 template<
class Val,
class P,
class N,
class Ctrl>
398 template<
class Val,
class P,
class N,
class Ctrl>
405 }
else if (x.
size() == 0) {
414 template<
class Val,
class P,
class N,
class Ctrl>
419 template<
class Val,
class P,
class N,
class Ctrl>
425 template<
class Val,
class P,
class N,
class Ctrl>
436 bounds_p<Val,P>(med, x,
c, sl, su);
437 bounds_n<Val,N>(med, y,
c, sl, su);
439 if ((-sl == c) && (-su ==
c)) {
443 if ((-sl > c) || (-su < c)) {
456 template<
class Val,
class P,
class N>
461 template<
class Val,
class P,
class N>
467 }
else if (x.
size() == 0) {
476 template<
class Val,
class P,
class N>
485 template<
class Val,
class P,
class N>
494 assert(x.
size() == 2);
496 (home,share,p,x[0],x[1],c);
502 assert(y.
size() == 2);
504 (home,share,p,y[0],y[1],-c);
512 (home,share,p,x[0],x[1],
c);
517 (home,share,p,y[0],y[1],-c);
524 template<
class Val,
class P,
class N>
533 assert(x.
size() == 3);
535 (home,share,p,x[0],x[1],x[2],c);
541 assert(y.
size() == 3);
543 (home,share,p,y[0],y[1],y[2],-c);
551 (home,share,p,x[0],x[1],x[2],
c);
559 (home,share,p,y[0],y[1],y[2],-c);
562 template<
class Val,
class P,
class N>
568 return nqtobin(home,share,*
this,x,y,c);
570 return nqtoter(home,share,*
this,x,y,c);
575 template<
class Val,
class P,
class N>
578 for (
int i = x.
size();
i--; )
582 for (
int i = y.
size();
i--; )
593 return (c == static_cast<Val>(0)) ?
605 template<
class Val,
class P,
class N>
610 template<
class Val,
class P,
class N>
616 }
else if (x.
size() == 0) {
625 template<
class Val,
class P,
class N>
634 template<
class Val,
class P,
class N>
643 assert(x.
size() == 2);
645 (home,share,p,x[0],x[1],c);
651 assert(y.
size() == 2);
661 (home,share,p,x[0],x[1],
c);
673 template<
class Val,
class P,
class N>
682 assert(x.
size() == 3);
684 (home,share,p,x[0],x[1],x[2],c);
690 assert(y.
size() == 3);
700 (home,share,p,x[0],x[1],x[2],
c);
711 template<
class Val,
class P,
class N>
717 return lqtobin(home,share,*
this,x,y,c);
719 return lqtoter(home,share,*
this,x,y,c);
724 template<
class Val,
class P,
class N>
731 for (
int i = x.
size();
i--; ) {
739 for (
int i = y.
size();
i--; ) {
756 return (c >= static_cast<Val>(0)) ?
760 for (
int i = x.
size();
i--; )
762 for (
int i = y.
size();
i--; )
770 for (
int i = x.
size();
i--; ) {
772 Val slx = sl + x[
i].min();
782 for (
int i = y.
size();
i--; ) {
784 Val sly = y[
i].max() - sl;
801 template<
class Val,
class P,
class N>
807 template<
class Val,
class P,
class N>
814 }
else if (x.
size() == 0) {
823 template<
class Val,
class P,
class N>
828 template<
class Val,
class P,
class N>
834 template<
class Val,
class P,
class N>
846 bounds_p<Val,P>(med,x,
c,sl,su);
847 bounds_n<Val,N>(med,y,
c,sl,su);