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);
Scale integer view (template)
Propagator for bounds consistent binary linear disequality
void posteqint(Home home, IntView &x, int c, CtrlView b, ReifyMode rm, IntConLevel icl)
Propagator for bounds consistent n-ary linear equality
IntConLevel
Consistency levels for integer propagators.
Inverse implication for reification.
ReifyMode mode(void) const
Return reification mode.
Exception: Value out of limits
void eliminate(Term< BoolView > *t, int &n, long long int &d)
Eliminate assigned views.
Binary domain consistent equality propagator.
Propagator for reified bounds consistent n-ary linear less or equal
BoolVar var(void) const
Return Boolean control variable.
bool one(const Gecode::FloatValArgs &a)
Check whether has only one coefficients.
void post(Home home, Term< BoolView > *t, int n, IntRelType irt, IntView x, int c, IntConLevel)
Post propagator for linear constraint over Booleans.
Propagator for bounds consistent n-ary linear disequality
Propagator for domain consistent n-ary linear equality
Propagator for bounds consistent ternary linear equality
Reified less or equal with integer propagator.
Propagator for bounds consistent binary linear equality
const int max
Largest allowed integer value.
const int min
Smallest allowed integer value.
Propagator for bounds consistent ternary linear less or equal
Gecode::FloatVal c(-8, 8)
Exception: Unknown relation passed as argument
Gecode::IntArgs i(4, 1, 2, 3, 4)
int n
Number of negative literals for node type.
IntRelType
Relation types for integers.
int gcd(int a, int b)
Compute the greatest common divisor of a and b.
ModEvent lq(Space &home, Val n)
Restrict domain values to be less or equal than n.
Propagator for bounds consistent binary linear less or equal
bool precision(Term< IntView > *t_p, int n_p, Term< IntView > *t_n, int n_n, long long int d)
Decide the required precision and check for overflow.
Reification specification.
void rewrite(IntRelType &r, long long int &d)
Rewrite non-strict relations.
bool overflow_add(int n, int m)
Check whether adding n and m would overflow.
IntType floor_div_xp(IntType x, IntType y)
Compute where y is non-negative.
Propagator for reified bounds consistent n-ary linear equality
Propagator for reified bounds consistent binary linear less or equal
#define GECODE_INT_PL_BIN(CLASS)
Macro for posting binary special cases for linear constraints.
Reified bounds consistent equality with integer propagator.
Integer view for integer variables.
bool overflow_sub(int n, int m)
Check whether subtracting m from n would overflow.
Node * x
Pointer to corresponding Boolean expression node.
ScaleView< int, unsigned int > IntScaleView
Integer-precision integer scale view.
#define GECODE_INT_PL_TER(CLASS)
Macro for posting ternary special cases for linear constraints.
Propagator for reified bounds consistent binary linear equality
#define GECODE_ME_FAIL(me)
Check whether modification event me is failed, and fail space home.
void fail(void)
Mark space as failed.
Class for describing linear term .
struct Gecode::@518::NNF::@57::@58 b
For binary nodes (and, or, eqv)
void post_nary(Home home, ViewArray< View > &x, ViewArray< View > &y, IntRelType irt, Val c)
Posting n-ary propagators.
Gecode toplevel namespace
Propagator for bounds consistent n-ary linear less or equal
Implication for reification.
ScaleView< long long int, unsigned long long int > LLongScaleView
Long long-precision integer scale view.
Propagator for bounds consistent ternary linear disquality
ModEvent nq(Space &home, Val n)
Restrict domain values to be different from n.
Reified domain consistent equality with integer propagator.
void check(int n, const char *l)
Check whether n is in range, otherwise throw out of limits with information l.
Home class for posting propagators
#define GECODE_ES_FAIL(es)
Check whether execution status es is failed, and fail space home.
ReifyMode
Mode for reification.
#define GECODE_NEVER
Assert that this command is never executed.
struct Gecode::@518::NNF::@57::@59 a
For atomic nodes.
Domain propagation or consistency.
ModEvent eq(Space &home, Val n)
Restrict domain values to be equal to n.
ModEvent gq(Space &home, Val n)
Restrict domain values to be greater or equal than n.
Equivalence for reification (default)
Boolean view for Boolean variables.