44 namespace Gecode {
namespace Int {
namespace Linear {
50 if (t[
i].
x.assigned()) {
51 long long int ax = t[
i].
a *
static_cast<long long int>(t[
i].
x.val());
74 std::swap(n_p,n_n); std::swap(t_p,t_n); d = -
d;
89 for (
int i = n_p;
i--; ) {
91 t_p[
i].
a *
static_cast<long long int>(t_p[
i].
x.min());
96 t_p[
i].
a *
static_cast<long long int>(t_p[
i].
x.max());
101 for (
int i = n_n;
i--; ) {
102 long long int axmax =
103 t_n[
i].
a *
static_cast<long long int>(t_n[
i].
x.max());
107 long long int axmin =
108 t_n[
i].
a *
static_cast<long long int>(t_n[
i].
x.min());
125 for (
int i = n_p;
i--; ) {
126 long long int axmin =
127 t_p[
i].
a *
static_cast<long long int>(t_p[
i].
x.min());
132 long long int axmax =
133 t_p[
i].
a *
static_cast<long long int>(t_p[
i].
x.max());
139 for (
int i = n_n;
i--; ) {
140 long long int axmin =
141 t_n[
i].
a *
static_cast<long long int>(t_n[
i].
x.min());
146 long long int axmax =
147 t_n[
i].
a *
static_cast<long long int>(t_n[
i].
x.max());
160 template<
class Val,
class View>
180 #define GECODE_INT_PL_BIN(CLASS) \
183 GECODE_ES_FAIL((CLASS<int,IntView,IntView>::post \
184 (home,t_p[0].x,t_p[1].x,c))); \
187 GECODE_ES_FAIL((CLASS<int,IntView,MinusView>::post \
188 (home,t_p[0].x,MinusView(t_n[0].x),c))); \
191 GECODE_ES_FAIL((CLASS<int,MinusView,MinusView>::post \
192 (home,MinusView(t_n[0].x),MinusView(t_n[1].x),c))); \
194 default: GECODE_NEVER; \
198 #define GECODE_INT_PL_TER(CLASS) \
201 GECODE_ES_FAIL((CLASS<int,IntView,IntView,IntView>::post \
202 (home,t_p[0].x,t_p[1].x,t_p[2].x,c))); \
205 GECODE_ES_FAIL((CLASS<int,IntView,IntView,MinusView>::post \
206 (home,t_p[0].x,t_p[1].x, \
207 MinusView(t_n[0].x),c))); \
210 GECODE_ES_FAIL((CLASS<int,IntView,MinusView,MinusView>::post \
212 MinusView(t_n[0].x),MinusView(t_n[1].x),c))); \
215 GECODE_ES_FAIL((CLASS<int,MinusView,MinusView,MinusView>::post \
216 (home,MinusView(t_n[0].x), \
217 MinusView(t_n[1].x),MinusView(t_n[2].x),c))); \
219 default: GECODE_NEVER; \
234 bool is_unit = normalize<IntView>(
t,
n,t_p,n_p,t_n,n_n,
gcd);
236 rewrite(irt,d,t_p,n_p,t_n,n_n);
242 if ((d % gcd) != 0) {
291 bool is_ip =
precision(t_p,n_p,t_n,n_n,d);
293 if (is_unit && is_ip && (icl !=
ICL_DOM)) {
295 c =
static_cast<int>(
d);
312 for (
int i = n_p;
i--; )
315 for (
int i = n_n;
i--; )
317 post_nary<int,IntView>(home,
x,y,irt,
c);
320 if ((n==2) && is_unit && (icl ==
ICL_DOM) && (irt ==
IRT_EQ)) {
322 c =
static_cast<int>(
d);
378 c =
static_cast<int>(
d);
380 for (
int i = n_p;
i--; )
383 for (
int i = n_n;
i--; )
388 post_nary<int,IntScaleView>(home,
x,y,irt,
c);
394 for (
int i = n_p;
i--; )
397 for (
int i = n_n;
i--; )
401 ::
post(home,x,y,d)));
403 post_nary<long long int,LLongScaleView>(home,
x,y,irt,
d);
408 #undef GECODE_INT_PL_BIN
409 #undef GECODE_INT_PL_TER
416 template<
class Val,
class View>
445 post(home,x,y,c,
n)));
449 post(home,x,y,c,
n)));
453 post(home,x,y,c,
n)));
480 template<
class CtrlView>
530 bool is_unit = normalize<IntView>(
t,
n,t_p,n_p,t_n,n_n,
gcd);
532 rewrite(irt,d,t_p,n_p,t_n,n_n);
538 if ((d % gcd) != 0) {
546 if ((d % gcd) != 0) {
563 case IRT_EQ: fail = (d != 0);
break;
564 case IRT_NQ: fail = (d == 0);
break;
565 case IRT_LQ: fail = (0 >
d);
break;
578 bool is_ip =
precision(t_p,n_p,t_n,n_n,d);
580 if (is_unit && is_ip) {
581 c =
static_cast<int>(
d);
586 posteqint<BoolView>(home,t_p[0].x,
c,r.
var(),r.
mode(),icl);
588 posteqint<BoolView>(home,t_p[0].x,-
c,r.
var(),r.
mode(),icl);
601 posteqint<NegBoolView>(home,t_p[0].x,
c,nb,rm,icl);
603 posteqint<NegBoolView>(home,t_p[0].x,-
c,nb,rm,icl);
616 post(home,t_p[0].x,c,r.
var())));
620 post(home,t_p[0].x,c,r.
var())));
629 post(home,t_n[0].
x,-c-1,nb)));
633 post(home,t_n[0].x,-c-1,nb)));
637 post(home,t_n[0].x,-c-1,nb)));
653 post(home,t_p[0].
x,t_p[1].x,c,r.
var())));
657 post(home,t_p[0].x,t_p[1].x,c,r.
var())));
661 post(home,t_p[0].x,t_p[1].x,c,r.
var())));
690 post(home,t_n[0].
x,t_n[1].x,-c,r.
var())));
694 post(home,t_n[0].x,t_n[1].x,-c,r.
var())));
698 post(home,t_n[0].x,t_n[1].x,-c,r.
var())));
714 post(home,t_p[0].
x,t_p[1].x,c,nb)));
718 post(home,t_p[0].x,t_p[1].x,c,nb)));
722 post(home,t_p[0].x,t_p[1].x,c,nb)));
748 post(home,t_p[0].
x,t_p[1].x,-c,nb)));
752 post(home,t_p[0].x,t_p[1].x,-c,nb)));
756 post(home,t_p[0].x,t_p[1].x,-c,nb)));
771 post(home,t_p[0].
x,t_p[1].x,c,r.
var())));
775 post(home,t_p[0].x,t_p[1].x,c,r.
var())));
779 post(home,t_p[0].x,t_p[1].x,c,r.
var())));
831 for (
int i = n_p;
i--; )
834 for (
int i = n_n;
i--; )
836 post_nary<int,IntView>(home,
x,y,irt,
c,
r);
840 c =
static_cast<int>(
d);
842 for (
int i = n_p;
i--; )
845 for (
int i = n_n;
i--; )
847 post_nary<int,IntScaleView>(home,
x,y,irt,
c,
r);
851 for (
int i = n_p;
i--; )
854 for (
int i = n_n;
i--; )
856 post_nary<long long int,LLongScaleView>(home,
x,y,irt,
d,
r);