42 namespace Gecode {
namespace Int {
49 #define GECODE_INT_RL2PD(r) reinterpret_cast<ptrdiff_t>(r)
50 #define GECODE_INT_PD2RL(p) reinterpret_cast<RangeList*>(p)
111 return static_cast<unsigned int>(
_max -
_min) + 1;
116 IntVarImp::RangeList::operator
delete(
void*) {}
119 IntVarImp::RangeList::operator
delete(
void*,
Space&) {
123 IntVarImp::RangeList::operator
delete(
void*,
void*) {
128 IntVarImp::RangeList::operator
new(size_t,
Space& home) {
129 return home.fl_alloc<
sizeof(
RangeList)>();
133 IntVarImp::RangeList::operator
new(size_t,
void*
p) {
158 #undef GECODE_INT_RL2PD
159 #undef GECODE_INT_PD2RL
203 unsigned int h =
static_cast<unsigned int>(d.
max()-d.
min())+1;
207 for (
int i = 1;
i < n-1;
i++) {
243 return fst() == NULL;
293 return (
fst() == NULL) || in_full(n);
299 return (
fst() == NULL) || in_full(static_cast<int>(n));
357 ModEvent me = gq_full(home,static_cast<int>(n));
378 ModEvent me = lq_full(home,static_cast<int>(n));
399 int n =
static_cast<int>(m);
411 return nq_full(home,n);
417 return nq_full(home,static_cast<int>(d));
430 :
p(NULL),
c(x->ranges_fwd()) {}
468 :
n(NULL),
c(x->ranges_bwd()) {}
524 if ((min0 == min1) && (max0 == max1))
530 if (depends ||
range()) {
534 unsigned int s =
static_cast<unsigned int>(max0-min0+1);
571 assert((r != &f) && (r != &l));
572 if (r->
max() < min0) {
581 }
else if ((r->
min() == min0) && (r->
max() == max0)) {
588 min0=ri.min(); max0=ri.max(); ++ri;
591 assert((r->
min() <= min0) && (max0 <= r->
max()));
595 r->
min(min0); r->
max(max0);
596 assert(h > r->
width());
604 min0=ri.min(); max0=ri.max(); ++ri;
607 assert(h > static_cast<unsigned int>(max0-min0+1));
628 assert((r == &l) && !ri());
643 fn->
prev(&f,NULL); ln->
next(&l,NULL);
645 unsigned int b = (
static_cast<unsigned int>(fn->
min()-
dom.
min()) +
646 static_cast<unsigned int>(
dom.
max()-ln->
max()));
686 while (
i() && (i.max() <
dom.
min()))
690 if (!
i() || (i.min() >
dom.
max()))
701 return lq(home,i_min-1);
704 (!
i() || (i.min() >
dom.
max())))
705 return gq(home,i_max+1);
728 assert((r != &f) && (r != &l));
729 if (i_min > r->
max()) {
733 }
else if (i_max < r->
min()) {
739 }
else if ((i_min <= r->
min()) && (r->
max() <= i_max)) {
748 }
else if ((i_min > r->
min()) && (i_max < r->
max())) {
750 h +=
static_cast<unsigned int>(i_max - i_min) + 1;
753 p->next(r,n); r->
prev(p,n);
760 }
else if (i_max < r->
max()) {
761 assert(i_min <= r->
min());
763 h += i_max-r->
min()+1;
771 assert((i_max >= r->
max()) && (r->
min() < i_min));
773 h += r->
max()-i_min+1;
808 fn->
prev(&f,NULL); ln->
next(&l,NULL);
810 b = (
static_cast<unsigned int>(fn->
min()-
dom.
min()) +
811 static_cast<unsigned int>(
dom.
max()-ln->
max()));
844 return inter_r(home,r,depends);
856 while (
i() && (i.val() <
dom.
min()))
860 if (!
i() || (i.val() >
dom.
max()))
867 }
while (
i() && (i.val() ==
v));
870 if (!
i() || (i.val() >
dom.
max()))
871 return nq_full(home,v);
894 assert((r != &f) && (r != &l));
901 if ((v == r->
min()) && (v == r->
max())) {
910 }
else if (v == r->
min()) {
912 }
else if (v == r->
max()) {
917 }
else if (v > r->
min()) {
919 assert(v < r->
max());
923 p->next(r,n); r->
prev(p,n);
932 assert((r == &l) || !
i());
962 fn->
prev(&f,NULL); ln->
next(&l,NULL);
964 unsigned int b = (
static_cast<unsigned int>(fn->
min()-
dom.
min()) +
965 static_cast<unsigned int>(
dom.
max()-ln->
max()));
993 : perform_copy(home,share);
ModEvent nq(Space &home, int n)
Restrict domain values to be different from n.
ModEvent eq(Space &home, int n)
Restrict domain values to be equal to n.
unsigned int size(void) const
Return size (cardinality) of domain.
void cancel(Space &home, Propagator &p, PropCond pc)
Cancel subscription of propagator p with propagation condition pc.
void dispose(Space &home, RangeList *p, RangeList *l)
Free memory for all elements between this and l (inclusive)
#define GECODE_ASSUME(p)
Assert certain property.
void fix(RangeList *n)
Restore simple link to next element (so that it becomes a true free list)
int min(void) const
Return minimum.
int min(void) const
Return smallest value of range.
RangeList * _lst
Link the last element.
void max(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
bool operator()(void) const
Test whether iterator is still at a range or done.
void subscribe(Space &home, Propagator &p, PropCond pc, bool schedule=true)
Subscribe propagator p with propagation condition pc to variable.
void dom(Home home, FloatVar x, FloatVal n)
Propagates .
int ModEvent
Type for modification events.
static void schedule(Space &home, Propagator &p, ModEvent me, bool force=false)
Schedule propagator p with modification event me.
Base-class for propagators.
bool operator()(void) const
Test whether iterator is still at a range or done.
FreeList * next(void) const
Return next freelist object.
ModEvent lq(Space &home, int n)
Restrict domain values to be less or equal than n.
IntVarImpFwd(void)
Default constructor.
static ModEventDelta med(ModEvent me)
Translate modification event me into modification event delta.
Base-class for Int-variable implementations.
RangeList * lst(void) const
Return last element of rangelist.
void init(const IntVarImp *x)
Initialize with ranges from variable implementation x.
void cancel(Space &home)
Cancel all subscriptions when variable implementation is assigned.
RangeList(void)
Default constructor (noop)
unsigned int width(void) const
Return width of range (distance between minimum and maximum)
T * alloc(long unsigned int n)
Allocate block of n objects of type T from space heap.
int val(void) const
Return assigned value (only if assigned)
const Gecode::ModEvent ME_INT_FAILED
Domain operation has resulted in failure.
IntVarImpBwd(void)
Default constructor.
Gecode::FloatVal c(-8, 8)
int p
Number of positive literals for node type.
Gecode::IntArgs i(4, 1, 2, 3, 4)
bool copied(void) const
Is variable already copied.
int n
Number of negative literals for node type.
bool assigned(void) const
Test whether variable is assigned.
int max(void) const
Return largest value of range.
static ModEvent me(const ModEventDelta &med)
Project modification event for this variable type from med.
Range iterator for computing intersection (binary)
void operator++(void)
Move iterator to previous range (if possible)
int ranges(void) const
Return number of ranges of the specification.
bool range(void) const
Test whether domain is a range.
int PropCond
Type for propagation conditions.
const Gecode::ModEvent ME_INT_VAL
Domain operation has resulted in a value (assigned variable)
int max(void) const
Return maximum.
Range iterator from value iterator.
unsigned int width(int i) const
Return width of range at position i.
Range iterator for ranges of integer variable implementation.
int min(void) const
Return smallest value of range.
unsigned int regret_max(void) const
Return regret of domain maximum (distance to next smaller value)
const Gecode::ModEvent ME_INT_BND
Domain operation has changed the minimum or maximum of the domain.
FreeList * _next
Pointer to next freelist object.
Gecode::ModEvent notify(Gecode::Space &home, Gecode::ModEvent me, Gecode::Delta &d)
Notify that variable implementation has been modified with modification event me and delta informatio...
RangeList * prev(const RangeList *n) const
Return previous element (from next n)
ModEvent inter_r(Space &home, I &i, bool depends=true)
Intersect domain with ranges described by i.
IntVarImp * copy(Space &home, bool share)
Return copy of this variable.
#define GECODE_INT_PD2RL(p)
unsigned int holes
Size of holes in the domain.
const RangeList * ranges_bwd(void) const
Return range list for backward iteration.
ModEvent minus_v(Space &home, I &i, bool depends=true)
Remove from domain the values described by i.
ModEvent narrow_v(Space &home, I &i, bool depends=true)
Replace domain by values described by i.
void min(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
Integer delta information for advisors.
Integer variable implementation.
RangeList dom
Domain information.
IntVarImp(Space &home, bool share, IntVarImp &x)
Constructor for cloning x.
ModEvent inter_v(Space &home, I &i, bool depends=true)
Intersect domain with values described by i.
Node * x
Pointer to corresponding Boolean expression node.
Generic domain change information to be supplied to advisors.
Lists of ranges (intervals)
int max(void) const
Return maximum of domain.
const Gecode::ModEvent ME_INT_DOM
Domain operation has changed the domain.
void operator++(void)
Move iterator to next range (if possible)
unsigned int width(void) const
Return width (distance between maximum and minimum)
void prevnext(RangeList *p, RangeList *n)
Set previous element to p and next element to n.
ModEvent minus_r(Space &home, I &i, bool depends=true)
Remove from domain the ranges described by i.
unsigned int width(void) const
Return width of range (distance between minimum and maximum)
void fl_dispose(FreeList *f, FreeList *l)
Return freelist-managed memory to freelist.
bool in(int n) const
Test whether n is contained in domain.
RangeList * next(const RangeList *p) const
Return next element (from previous p)
int med(void) const
Return median of domain (greatest element not greater than the median)
static bool any(const Delta &d)
Test whether arbitrary values got pruned.
struct Gecode::@518::NNF::@57::@58 b
For binary nodes (and, or, eqv)
Gecode toplevel namespace
const RangeList * ranges_fwd(void) const
Return range list for forward iteration.
Range iterator for computing set difference.
int max(void) const
Return largest value of range.
void init(const IntVarImp *x)
Initialize with ranges from variable implementation x.
int ModEventDelta
Modification event deltas.
ModEvent narrow_r(Space &home, I &i, bool depends=true)
Replace domain by ranges described by i.
int min(void) const
Return minimum of domain.
#define GECODE_NEVER
Assert that this command is never executed.
const Gecode::ModEvent ME_INT_NONE
Domain operation has not changed domain.
RangeList * fst(void) const
Return first element of rangelist.
struct Gecode::@518::NNF::@57::@59 a
For atomic nodes.
unsigned int regret_min(void) const
Return regret of domain minimum (distance to next larger value)
unsigned int width(void) const
Return width of domain (distance between maximum and minimum)
int max(int i) const
Return maximum of range at position i.
VarImp * forward(void) const
Use forward pointer if variable already copied.
ModEvent gq(Space &home, int n)
Restrict domain values to be greater or equal than n.
#define GECODE_INT_RL2PD(r)
int min(int i) const
Return minimum of range at position i.
void subscribe(Gecode::Space &home, Gecode::Propagator &p, Gecode::PropCond pc, bool assigned, bool schedule)
Subscribe propagator p with propagation condition pc.