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);
void push(const T &x)
Push element x on top of stack.
ViewNode< IntView > ** view
Array of view nodes.
int n_matched
Number of matched edges.
int size(void) const
Return size (number of values)
Graph(void)
Construct graph as not yet initialized.
Range iterator for integer variable views
ValNode< View > * next_val(void) const
Return next value node.
int n_view
Number of view nodes.
int n_val
Number of value nodes.
T * alloc(long unsigned int n)
Allocate block of n objects of type T from space heap.
int p
Number of positive literals for node type.
bool empty(void) const
Test whether stack is empty.
Gecode::IntArgs i(4, 1, 2, 3, 4)
int n
Number of negative literals for node type.
void revert(Node< View > *d)
Revert edge to node d for matching.
Value iterator from range iterator.
int size(void) const
Return size of maximal matching (excluding assigned views)
void init(Space &home, ViewNode< View > *x)
Initialize the edges for the view node x.
#define GECODE_ME_CHECK(me)
Check whether modification event me is failed, and forward failure.
void sync(Space &home)
Synchronize graph with new view domains.
unsigned int count
Marking counter.
Node * x
Pointer to corresponding Boolean expression node.
Edge< View > ** val_edges_ref(void)
Return pointer to first edge fields of all value edges.
Stack with fixed number of elements.
ValNode< IntView > * val
Array of value nodes.
T pop(void)
Pop topmost element from stack and return it.
Class for storing values of already assigned views.
int size(void) const
Return size of array (number of elements)
Gecode toplevel namespace
void scc(Space &home)
Compute the strongly connected components.
bool match(ViewNodeStack &m, ViewNode< IntView > *x)
Find a matching for node x.
void init(Space &home, const ValSet &vs, const ViewArray< IntView > &x)
Initialize graph including values in vs.
ExecStatus prune(Space &home)
Prune all values corresponding to unused edges.