38 namespace Gecode {
namespace Gist {
42 NodeAllocatorBase<T>::allocate(
void) {
47 n =
static_cast<int>(
n*1.5+1.0);
50 b[cur_b] =
static_cast<Block*
>(
heap.
ralloc(
sizeof(Block)));
59 cur_t = NodeBlockSize-1;
64 for (
int i=cur_b+1;
i--;)
73 if (cur_t==NodeBlockSize)
75 new (&
b[cur_b]->b[cur_t]) T(p);
76 b[cur_b]->best[cur_t] = -1;
77 return cur_b*NodeBlockSize+cur_t;
84 if (cur_t==NodeBlockSize)
86 new (&
b[cur_b]->b[cur_t]) T(root);
87 b[cur_b]->best[cur_t] = -1;
88 return cur_b*NodeBlockSize+cur_t;
94 assert(i/NodeBlockSize <
n);
95 assert(i/NodeBlockSize < cur_b || i%NodeBlockSize <= cur_t);
96 return &(
b[i/NodeBlockSize]->b[i%NodeBlockSize]);
102 assert(i/NodeBlockSize <
n);
103 assert(i/NodeBlockSize < cur_b || i%NodeBlockSize <= cur_t);
104 int bi =
b[i/NodeBlockSize]->best[i%NodeBlockSize];
105 return bi == -1 ? NULL : (*this)[
bi];
111 assert(i/NodeBlockSize <
n);
112 assert(i/NodeBlockSize < cur_b || i%NodeBlockSize <= cur_t);
113 b[i/NodeBlockSize]->best[i%NodeBlockSize] = best;
125 return !labels.isEmpty();
131 return labels.contains(n);
149 return labels.value(n);
153 Node::getTag(
void)
const {
154 return static_cast<unsigned int>
155 (
reinterpret_cast<ptrdiff_t
>(childrenOrFirstChild) & 3);
159 Node::setTag(
unsigned int tag) {
161 assert(getTag() == UNDET);
162 childrenOrFirstChild =
reinterpret_cast<void*
>
163 ( (
reinterpret_cast<ptrdiff_t
>(childrenOrFirstChild) & ~(3)) | tag);
167 Node::getPtr(
void)
const {
168 return reinterpret_cast<void*
>
169 (
reinterpret_cast<ptrdiff_t
>(childrenOrFirstChild) & ~(3));
173 Node::getFirstChild(
void)
const {
174 return static_cast<int>
175 ((
reinterpret_cast<ptrdiff_t
>(childrenOrFirstChild) & ~(3)) >> 2);
180 childrenOrFirstChild = NULL;
182 setTag(failed ? LEAF : UNDET);
192 return parent < 0 ? NULL : na[parent];
200 assert(getTag() != UNDET && getTag() != LEAF);
201 if (getTag() == TWO_CHILDREN) {
202 assert(n != 1 || noOfChildren <= 0);
203 return n == 0 ? getFirstChild() : -noOfChildren;
205 assert(n < noOfChildren);
206 return static_cast<int*
>(getPtr())[n];
220 case UNDET:
return 0;
222 case TWO_CHILDREN:
return 1+(noOfChildren <= 0);
223 default:
return noOfChildren;
231 Node*
p = na[parent];
T * operator[](int i) const
Return node for index i.
void setLabel(T *n, const QString &l)
Set label of node n to l.
void rfree(void *p)
Free memory block starting at p.
void * ralloc(size_t s)
Allocate s bytes from heap.
Base class for nodes of the search tree.
unsigned int getNumberOfChildren(void) const
Return the number of children.
NodeAllocatorBase(bool bab)
Constructor.
Heap heap
The single global heap.
int getParent(void) const
Return the parent.
QString getLabel(T *n) const
Get label of node n.
int p
Number of positive literals for node type.
bool isRoot(void) const
Check if this node is the root of a tree.
T * alloc(long unsigned int n)
Allocate block of n objects of type T from heap.
bool bab(void) const
Return branch-and-bound flag.
Gecode::IntArgs i(4, 1, 2, 3, 4)
int n
Number of negative literals for node type.
void clearLabel(T *n)
Remove label of node n.
Node(int p, bool failed=false)
Construct node with parent p.
bool showLabels(void) const
Return branching label flag.
void setBest(int i, int b)
Set index of best node before i to b.
~NodeAllocatorBase(void)
Destructor.
void free(T *b, long unsigned int n)
Delete n objects starting at b.
int getIndex(const NodeAllocator &na) const
Return index of this node.
Node class that supports visual layout
int bab(Space *root, const Gist::Options &opt)
Create a new stand-alone Gist for branch-and-bound search of root.
T * best(int i) const
Return index of best node before i.
T * realloc(T *b, long unsigned int n, long unsigned int m)
Reallocate block of n objects starting at b to m objects of type T from heap.
struct Gecode::@518::NNF::@57::@58 b
For binary nodes (and, or, eqv)
Gecode toplevel namespace
int getChild(int n) const
Return index of child no n.
bool isUndetermined(void) const
Return whether this node is undetermined.
bool hasLabel(T *n) const
Return whether node n has a label.
#define GECODE_NEVER
Assert that this command is never executed.