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;
206 r[0].prevnext(NULL,&
r[1]);
207 for (
int i = 1;
i <
n-1;
i++) {
210 r[
i].prevnext(&
r[
i-1],&
r[
i+1]);
214 r[
n-1].prevnext(&
r[
n-2],NULL);
243 return fst() == NULL;
293 return (
fst() == NULL) || in_full(
n);
299 return (
fst() == NULL) || in_full(static_cast<int>(
n));
326 return static_cast<const IntDelta&>(
d).min();
330 return static_cast<const IntDelta&>(
d).max();
334 return static_cast<const IntDelta&>(
d).any();
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()) {}
433 p=NULL; c=
x->ranges_fwd();
468 :
n(NULL),
c(
x->ranges_bwd()) {}
471 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);
560 f.prevnext(NULL,
fst());
l.prevnext(
lst(),NULL);
571 assert((
r != &
f) && (
r != &
l));
572 if (
r->max() < min0) {
576 p->next(
r,
n);
n->prev(
r,
p);
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));
610 p->next(
r,
n);
r->prev(
p,
n);
623 p->next(
r,
n);
n->prev(
r,
p);
628 assert((
r == &
l) && !ri());
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()))
701 return lq(home,i_min-1);
705 return gq(home,i_max+1);
713 f.prevnext(NULL,
n);
l.prevnext(
n,NULL);
716 f.prevnext(NULL,
fst());
l.prevnext(
lst(),NULL);
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)) {
743 p->next(
r,
n);
n->prev(
r,
p);
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;
810 b = (static_cast<unsigned int>(fn->
min()-
dom.
min()) +
811 static_cast<unsigned int>(
dom.
max()-ln->
max()));
856 while (
i() && (
i.val() <
dom.
min()))
867 }
while (
i() && (
i.val() ==
v));
871 return nq_full(home,
v);
879 f.prevnext(NULL,
n);
l.prevnext(
n,NULL);
882 f.prevnext(NULL,
fst());
l.prevnext(
lst(),NULL);
894 assert((
r != &
f) && (
r != &
l));
901 if ((
v ==
r->min()) && (
v ==
r->max())) {
905 p->next(
r,
n);
n->prev(
r,
p);
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());
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.
RangeList * next(const RangeList *p) const
Return next element (from previous p)
ModEvent eq(Space &home, int n)
Restrict domain values to be equal to n.
int min(void) const
Return minimum.
int min(void) const
Return minimum of domain.
VarImp * forward(void) const
Use forward pointer if variable already copied.
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.
unsigned int width(void) const
Return width of range (distance between minimum and maximum)
bool range(void) const
Test whether domain is a range.
void fix(RangeList *n)
Restore simple link to next element (so that it becomes a true free list)
RangeList * prev(const RangeList *n) const
Return previous element (from next n)
bool operator()(void) const
Test whether iterator is still at a range or done.
int min(void) const
Return smallest value of range.
const RangeList * ranges_bwd(void) const
Return range list for backward iteration.
FreeList * next(void) const
Return next freelist object.
RangeList * _lst
Link the last element.
void max(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
unsigned int width(int i) const
Return width of range at position i.
bool in(int n) const
Test whether n is contained in domain.
RangeList * lst(void) const
Return last element of rangelist.
void dom(Home home, FloatVar x, FloatVal n)
Propagates .
int ModEvent
Type for modification events.
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.
int min(int i) const
Return minimum of range at position i.
void init(const IntVarImp *x)
Initialize with ranges from variable implementation x.
const RangeList * ranges_fwd(void) const
Return range list for forward iteration.
int med(void) const
Return median of domain (greatest element not greater than the median)
RangeList(void)
Default constructor (noop)
T * alloc(long unsigned int n)
Allocate block of n objects of type T from space heap.
const Gecode::ModEvent ME_INT_FAILED
Domain operation has resulted in failure.
int val(void) const
Return assigned value (only if assigned)
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 assigned(void) const
Test whether variable is assigned.
unsigned int width(void) const
Return width of range (distance between minimum and maximum)
int n
Number of negative literals for node type.
unsigned int regret_max(void) const
Return regret of domain maximum (distance to next smaller value)
unsigned int width(void) const
Return width of domain (distance between maximum and minimum)
static ModEvent me(const ModEventDelta &med)
Project modification event for this variable type from med.
bool copied(void) const
Is variable already copied.
int max(void) const
Return maximum.
unsigned int regret_min(void) const
Return regret of domain minimum (distance to next larger value)
Range iterator for computing intersection (binary)
void operator++(void)
Move iterator to previous range (if possible)
int max(int i) const
Return maximum of range at position i.
const Gecode::ModEvent ME_INT_VAL
Domain operation has resulted in a value (assigned variable)
Range iterator from value iterator.
RangeList * fst(void) const
Return first element of rangelist.
struct Gecode::@579::NNF::@61::@62 b
For binary nodes (and, or, eqv)
Range iterator for ranges of integer variable implementation.
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...
unsigned int width(void) const
Return width (distance between maximum and minimum)
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.
ModEvent minus_v(Space &home, I &i, bool depends=true)
Remove from domain the values described by i.
Post propagator for SetVar SetOpType SetVar SetRelType r
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.
Post propagator for f(x \diamond_{\mathit{op}} y) \sim_r z \f$ void rel(Home home
int max(void) const
Return largest value of range.
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.
Generic domain change information to be supplied to advisors.
Lists of ranges (intervals)
const Gecode::ModEvent ME_INT_DOM
Domain operation has changed the domain.
void operator++(void)
Move iterator to next range (if possible)
int max(void) const
Return largest value of range.
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.
ModEvent fail(Space &home)
Run advisors to be run on failure and returns ME_GEN_FAILED.
void fl_dispose(FreeList *f, FreeList *l)
Return freelist-managed memory to freelist.
Post propagator for SetVar x
unsigned int size(void) const
Return size (cardinality) of domain.
int ranges(void) const
Return number of ranges of the specification.
static bool any(const Delta &d)
Test whether arbitrary values got pruned.
Gecode toplevel namespace
Range iterator for computing set difference.
int min(void) const
Return smallest value of range.
VarImp * next(void) const
Return next copied variable.
void init(const IntVarImp *x)
Initialize with ranges from variable implementation x.
bool operator()(void) const
Test whether iterator is still at a range or done.
int ModEventDelta
Modification event deltas.
ModEvent narrow_r(Space &home, I &i, bool depends=true)
Replace domain by ranges described by i.
#define GECODE_NEVER
Assert that this command is never executed.
const Gecode::ModEvent ME_INT_NONE
Domain operation has not changed domain.
ModEvent gq(Space &home, int n)
Restrict domain values to be greater or equal than n.
#define GECODE_INT_RL2PD(r)
int max(void) const
Return maximum of domain.