38 namespace Gecode {
namespace Int {
namespace NValues {
51 using namespace ViewValGraph;
59 ValNode<IntView>**
v = &
val;
62 view[
i] =
new (home) ViewNode<IntView>();
64 ValNode<IntView>* nv =
new (home) ValNode<IntView>(n.val());
65 *v = nv; v = nv->next_val_ref();
68 *e =
new (home) Edge<IntView>(nv,
view[i],NULL);
80 for (
int i=x.
size();
i--; ) {
81 view[
i] =
new (home) ViewNode<IntView>(x[
i]);
88 for (
int i = x.
size();
i--; )
95 using namespace ViewValGraph;
103 ViewNode<IntView>* x =
view[
i];
108 Edge<IntView>*
m = x->matched() ? x->edge_fst() : NULL;
109 Edge<IntView>** p = x->val_edges_ref();
110 Edge<IntView>* e = *p;
112 while (e->val(x)->val() < r.min()) {
114 e->unlink(); e->mark();
118 assert(r.min() == e->val(x)->val());
120 for (
unsigned int j=r.width(); j--; ) {
122 p = e->next_edge_ref();
129 e->unlink(); e->mark();
132 if ((m != NULL) && m->marked()) {
134 m->val(x)->matching(NULL);
140 for (Edge<IntView>* e=x->val_edges(); e != NULL; e = e->next_edge())
156 using namespace ViewValGraph;
159 int n_view_visited = 0;
168 ValNode<IntView>**
v = &
val;
171 if (!(*v)->matching()) {
179 v = (*v)->next_val_ref();
182 v = (*v)->next_val_ref();
187 while (!visit.
empty()) {
188 ValNode<IntView>* n = visit.
pop();
189 for (Edge<IntView>* e = n->edge_fst(); e != n->edge_lst();
192 ViewNode<IntView>* x = e->view(n);
196 if (x->min <
count) {
199 assert(x->edge_fst()->next() == x->edge_lst());
200 ValNode<IntView>*
m = x->edge_fst()->val(x);
201 x->edge_fst()->use();
202 if (m->min <
count) {
213 if (n_view_visited <
n_view) {
221 if (!
view[
i]->matched()) {
227 while (!visit.
empty()) {
229 ViewNode<IntView>* x = visit.
pop();
230 for (Edge<IntView>* e = x->val_edges(); e != NULL; e = e->next_edge())
232 if (e != x->edge_fst()) {
233 ValNode<IntView>* n = e->val(x);
235 if (n->matching() != NULL) {
237 n->matching()->use();
238 ViewNode<IntView>* y = n->matching()->view(n);
239 if (y->min <
count) {
249 if (n_view_visited <
n_view) {
259 using namespace ViewValGraph;
262 ViewNode<IntView>* x =
view[
i];
264 if (x->matched() && !x->edge_fst()->used(x)) {
266 x->edge_fst()->val(x)->matching(NULL);
267 for (Edge<IntView>* e = x->val_edges(); e != NULL; e=e->next_edge())
271 IterPruneVal<IntView> pv(x);