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>
111 b.update(home,share,p.
b);
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, ReifyMode rm>
398 template<
class Val,
class P,
class N,
class Ctrl, ReifyMode rm>
405 }
else if (x.
size() == 0) {
414 template<
class Val,
class P,
class N,
class Ctrl, ReifyMode rm>
420 template<
class Val,
class P,
class N,
class Ctrl, ReifyMode rm>
426 template<
class Val,
class P,
class N,
class Ctrl, ReifyMode rm>
443 bounds_p<Val,P>(med,
x,
c, sl, su);
444 bounds_n<Val,N>(med, y,
c, sl, su);
446 if ((-sl == c) && (-su ==
c)) {
451 if ((-sl > c) || (-su < c)) {
465 template<
class Val,
class P,
class N>
470 template<
class Val,
class P,
class N>
476 }
else if (x.
size() == 0) {
485 template<
class Val,
class P,
class N>
494 template<
class Val,
class P,
class N>
503 assert(x.
size() == 2);
505 (home,share,p,x[0],x[1],c);
511 assert(y.
size() == 2);
513 (home,share,p,y[0],y[1],-c);
521 (home,share,
p,x[0],x[1],
c);
526 (home,share,p,y[0],y[1],-c);
533 template<
class Val,
class P,
class N>
542 assert(x.
size() == 3);
544 (home,share,p,x[0],x[1],x[2],c);
550 assert(y.
size() == 3);
552 (home,share,p,y[0],y[1],y[2],-c);
560 (home,share,
p,x[0],x[1],x[2],
c);
568 (home,share,p,y[0],y[1],y[2],-c);
571 template<
class Val,
class P,
class N>
577 return nqtobin(home,share,*
this,x,y,c);
579 return nqtoter(home,share,*
this,x,y,c);
584 template<
class Val,
class P,
class N>
587 for (
int i = x.
size();
i--; )
591 for (
int i = y.
size();
i--; )
602 return (c == static_cast<Val>(0)) ?
614 template<
class Val,
class P,
class N>
619 template<
class Val,
class P,
class N>
625 }
else if (x.
size() == 0) {
634 template<
class Val,
class P,
class N>
643 template<
class Val,
class P,
class N>
652 assert(x.
size() == 2);
654 (home,share,p,x[0],x[1],c);
660 assert(y.
size() == 2);
670 (home,share,
p,x[0],x[1],
c);
682 template<
class Val,
class P,
class N>
691 assert(x.
size() == 3);
693 (home,share,p,x[0],x[1],x[2],c);
699 assert(y.
size() == 3);
709 (home,share,
p,x[0],x[1],x[2],
c);
720 template<
class Val,
class P,
class N>
726 return lqtobin(home,share,*
this,x,y,c);
728 return lqtoter(home,share,*
this,x,y,c);
733 template<
class Val,
class P,
class N>
740 for (
int i = x.
size();
i--; ) {
748 for (
int i = y.
size();
i--; ) {
765 return (c >= static_cast<Val>(0)) ?
769 for (
int i = x.
size();
i--; )
771 for (
int i = y.
size();
i--; )
779 for (
int i = x.
size();
i--; ) {
781 Val slx = sl + x[
i].min();
791 for (
int i = y.
size();
i--; ) {
793 Val sly = y[
i].max() - sl;
810 template<
class Val,
class P,
class N, ReifyMode rm>
816 template<
class Val,
class P,
class N, ReifyMode rm>
823 }
else if (x.
size() == 0) {
832 template<
class Val,
class P,
class N, ReifyMode rm>
837 template<
class Val,
class P,
class N, ReifyMode rm>
843 template<
class Val,
class P,
class N, ReifyMode rm>
861 bounds_p<Val,P>(med,
x,
c,sl,su);
862 bounds_n<Val,N>(med,y,
c,sl,su);