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();
63 Edge<IntView>** e =
view[i]->val_edges_ref();
64 *e =
new (home) Edge<IntView>(nv,
view[i],NULL);
66 (*e)->revert(
view[i]); nv->matching(*e);
72 assert(i -
x.size() == vs.
size());
76 for (
int i=0; i<
x.size(); i++) {
77 view[i] =
new (home) ViewNode<IntView>(
x[i]);
84 for (
int i=0; i<
x.size(); i++)
98 for (
int i=0; i<
n_view; i++) {
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())
145 for (
int i=0; i<
n_view; i++)
156 int n_view_visited = 0;
165 ValNode<IntView>** v = &
val;
168 if (!(*v)->matching()) {
171 *v = (*v)->next_val();
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);
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) {
217 for (
int i=0; i<
n_view; i++)
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);
246 if (n_view_visited <
n_view) {
258 for (
int i =
n_view; i--; ) {
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 init(Space &home, const ValSet &vs, const ViewArray< IntView > &x)
Initialize graph including values in vs.
void sync(void)
Synchronize graph with new view domains.
Graph(void)
Construct graph as not yet initialized.
int n_matched
Number of matched edges.
ExecStatus prune(Space &home)
Prune all values corresponding to unused edges.
int size(void) const
Return size of maximal matching (excluding assigned views)
Class for storing values of already assigned views.
int size(void) const
Return size (number of values)
Range iterator for integer views.
int min(void) const
Return smallest value of range.
unsigned int width(void) const
Return width of range (distance between minimum and maximum)
Support::StaticStack< ViewNode< IntView > *, Region > ViewNodeStack
void init(Space &home, ViewNode< View > *x)
Initialize the edges for the view node x.
ViewNode< IntView > ** view
bool match(ViewNodeStack &m, ViewNode< IntView > *x)
Value iterator from range iterator.
T * alloc(long unsigned int n)
Allocate block of n objects of type T from space heap.
Stack with fixed number of elements.
void push(const T &x)
Push element x on top of stack.
T pop(void)
Pop topmost element from stack and return it.
bool empty(void) const
Test whether stack is empty.
#define GECODE_ME_CHECK(me)
Check whether modification event me is failed, and forward failure.
Number of values propagators.
Support classes for propagators using a view-value graph.
Gecode toplevel namespace
Post propagator for SetVar SetOpType SetVar SetRelType r
Post propagator for SetVar SetOpType SetVar y
@ ES_OK
Execution is okay.
Post propagator for SetVar x
#define GECODE_ASSUME(p)
Assert certain property.