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]);