40 namespace Gecode {
namespace Int {
namespace Distinct {
49 using namespace ViewValGraph;
51 view = home.
alloc<ViewNode<View>*>(n_view);
54 int min = x[n_view-1].min();
55 int max = x[n_view-1].max();
56 for (
int i=n_view-1;
i--; ) {
61 unsigned int width =
static_cast<unsigned int>(max-min+1);
64 if (width < static_cast<unsigned int>(n_view))
68 for (
int i=n_view;
i--; )
69 view[
i] =
new (home) ViewNode<View>(x[
i]);
73 if (static_cast<unsigned int>(n_view)*4 >= width) {
75 ValNode<View>** val2node = r.alloc<ValNode<View>* >(width);
77 for (
unsigned int i=width;
i--; )
80 for (
int i=n_view;
i--; ) {
81 Edge<View>** edge_p = view[
i]->val_edges_ref();
83 if (val2node[xi.val()-
min] == NULL)
84 val2node[xi.val()-
min] =
new (home) ValNode<View>(xi.val());
85 *edge_p =
new (home) Edge<View>(val2node[xi.val()-
min],view[
i]);
86 edge_p = (*edge_p)->next_edge_ref();
91 for (
unsigned int i=width;
i--; )
92 if (val2node[
i] != NULL) {
93 val2node[
i]->next_val(val);
100 for (
int i=n_view;
i--; )
108 for (
int i = n_view;
i--; )
109 if (!match(m,view[
i]))
117 using namespace ViewValGraph;
122 for (
int i = n_view;
i--; ) {
123 ViewNode<View>*
x = view[
i];
124 if (x->view().assigned()) {
125 x->edge_fst()->val(x)->matching(NULL);
126 for (Edge<View>* e = x->val_edges(); e != NULL; e = e->next_edge())
128 view[
i] = view[--n_view];
129 }
else if (x->changed()) {
131 Edge<View>* m = x->edge_fst();
132 Edge<View>**
p = x->val_edges_ref();
135 while (e->val(x)->val() < r.min()) {
137 e->unlink(); e->mark();
141 assert(r.min() == e->val(x)->val());
143 for (
unsigned int j=r.width(); j--; ) {
145 p = e->next_edge_ref();
152 e->unlink(); e->mark();
157 m->val(x)->matching(NULL);
163 for (Edge<View>* e = x->val_edges(); e != NULL; e = e->next_edge())
170 if (!match(m,re.
pop()))
179 using namespace ViewValGraph;
183 int n_view_visited = 0;
193 ValNode<View>**
v = &val;
195 if (!(*v)->matching()) {
197 *v = (*v)->next_val();
202 v = (*v)->next_val_ref();
205 v = (*v)->next_val_ref();
210 while (!visit.
empty()) {
211 ValNode<View>*
n = visit.
pop();
212 for (Edge<View>* e = n->edge_fst(); e != n->edge_lst(); e=e->next()) {
215 ViewNode<View>*
x = e->view(n);
216 if (x->min <
count) {
219 assert(x->edge_fst()->next() == x->edge_lst());
220 ValNode<View>* m = x->edge_fst()->val(x);
221 x->edge_fst()->use();
222 if (m->min <
count) {
232 if (n_view_visited < n_view) {
243 using namespace ViewValGraph;
246 for (
int i = n_view;
i--; ) {
247 ViewNode<View>*
x = view[
i];
248 if (!x->edge_fst()->used(x)) {
250 x->edge_fst()->val(x)->matching(NULL);
251 for (Edge<View>* e = x->val_edges(); e != NULL; e = e->next_edge())
253 view[
i] = view[--n_view];
256 IterPruneVal<View> pv(view[
i]);
void push(const T &x)
Push element x on top of stack.
bool mark(Space &home)
Mark edges in graph, return true if pruning is at all possible.
const FloatNum max
Largest allowed float value.
void max(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
ExecStatus prune(Space &home, bool &assigned)
Prune unmarked edges, assigned is true if a view got assigned.
Value iterator for integer views.
Range iterator for integer views.
T * alloc(long unsigned int n)
Allocate block of n objects of type T from space heap.
ExecStatus init(Space &home, ViewArray< View > &x)
Initialize graph.
int p
Number of positive literals for node type.
bool empty(void) const
Test whether stack is empty.
Graph(void)
Construct graph as not yet initialized.
const FloatNum min
Smallest allowed float value.
Gecode::IntArgs i(4, 1, 2, 3, 4)
int n
Number of negative literals for node type.
Execution has resulted in failure.
View-value graph base class.
#define GECODE_ME_CHECK(me)
Check whether modification event me is failed, and forward failure.
void min(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
Node * x
Pointer to corresponding Boolean expression node.
void count(Home home, const IntVarArgs &x, int n, IntRelType irt, int m, IntConLevel)
Post propagator for .
bool assigned(View x, int v)
Whether x is assigned to value v.
Stack with fixed number of elements.
T pop(void)
Pop topmost element from stack and return it.
int size(void) const
Return size of array (number of elements)
Gecode toplevel namespace
bool sync(Space &home)
Synchronize graph with new view domains.