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() < rx.min()) {
114 e->unlink(); e->mark();
118 assert(rx.min() == e->val(x)->val());
120 for (
unsigned int j=rx.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.
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.
void sync(Space &home)
Synchronize graph with new view domains.
Post propagator for SetVar SetOpType SetVar SetRelType r
Post propagator for SetVar SetOpType SetVar y
unsigned int count
Marking counter.
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
void scc(Space &home)
Compute the strongly connected components.
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.