34 namespace Gecode {
namespace Int {
namespace NValues {
47 using namespace ViewValGraph;
55 ValNode<IntView>**
v = &
val;
58 view[
i] =
new (home) ViewNode<IntView>();
60 ValNode<IntView>* nv =
new (home) ValNode<IntView>(
n.val());
61 *v = nv; v = nv->next_val_ref();
64 *e =
new (home) Edge<IntView>(nv,
view[i],NULL);
76 for (
int i=x.
size();
i--; ) {
77 view[
i] =
new (home) ViewNode<IntView>(x[
i]);
84 for (
int i = x.
size();
i--; )
91 using namespace ViewValGraph;
99 ViewNode<IntView>*
x =
view[
i];
104 Edge<IntView>* m = x->matched() ? x->edge_fst() : NULL;
105 Edge<IntView>**
p = x->val_edges_ref();
106 Edge<IntView>* e = *
p;
109 while (e->val(x)->val() < rx.min()) {
111 e->unlink(); e->mark();
115 assert(rx.min() == e->val(x)->val());
117 for (
unsigned int j=rx.width(); j--; ) {
119 p = e->next_edge_ref();
126 e->unlink(); e->mark();
129 if ((m != NULL) && m->marked()) {
131 m->val(x)->matching(NULL);
137 for (Edge<IntView>* e=x->val_edges(); e != NULL; e = e->next_edge())
153 using namespace ViewValGraph;
156 int n_view_visited = 0;
165 ValNode<IntView>**
v = &
val;
168 if (!(*v)->matching()) {
176 v = (*v)->next_val_ref();
179 v = (*v)->next_val_ref();
184 while (!visit.
empty()) {
185 ValNode<IntView>*
n = visit.
pop();
186 for (Edge<IntView>* e = n->edge_fst(); e != n->edge_lst();
189 ViewNode<IntView>*
x = e->view(n);
193 if (x->min <
count) {
196 assert(x->edge_fst()->next() == x->edge_lst());
197 ValNode<IntView>* m = x->edge_fst()->val(x);
198 x->edge_fst()->use();
199 if (m->min <
count) {
210 if (n_view_visited <
n_view) {
218 if (!
view[
i]->matched()) {
224 while (!visit.
empty()) {
226 ViewNode<IntView>*
x = visit.
pop();
227 for (Edge<IntView>* e = x->val_edges(); e != NULL; e = e->next_edge())
229 if (e != x->edge_fst()) {
230 ValNode<IntView>*
n = e->val(x);
232 if (n->matching() != NULL) {
234 n->matching()->use();
235 ViewNode<IntView>*
y = n->matching()->view(n);
236 if (y->min <
count) {
246 if (n_view_visited <
n_view) {
256 using namespace ViewValGraph;
259 ViewNode<IntView>*
x =
view[
i];
261 if (x->matched() && !x->edge_fst()->used(x)) {
263 x->edge_fst()->val(x)->matching(NULL);
264 for (Edge<IntView>* e = x->val_edges(); e != NULL; e=e->next_edge())
268 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.
void sync(void)
Synchronize graph with new view domains.
#define GECODE_ASSUME(p)
Assert certain property.
ValNode< View > * next_val(void) const
Return next value node.
Graph(void)
Construct graph as not yet initialized.
bool empty(void) const
Test whether stack is empty.
Range iterator for integer variable views
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.
Gecode::IntArgs i(4, 1, 2, 3, 4)
int n
Number of negative literals for node type.
int size(void) const
Return size (number of values)
void revert(Node< View > *d)
Revert edge to node d for matching.
Value iterator from range iterator.
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.
Post propagator for SetVar SetOpType SetVar SetRelType r
Post propagator for SetVar SetOpType SetVar y
unsigned int count
Marking counter.
void scc(void)
Compute the strongly connected components.
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.
int size(void) const
Return size of maximal matching (excluding assigned views)
T pop(void)
Pop topmost element from stack and return it.
Post propagator for SetVar x
Class for storing values of already assigned views.
Gecode toplevel namespace
bool match(ViewNodeStack &m, ViewNode< IntView > *x)
Find a matching for node x.
int size(void) const
Return size of array (number of elements)
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.