52 for (
int i=1; i<
n_view; i++) {
57 unsigned int width =
static_cast<unsigned int>(
max-
min+1);
60 if (width <
static_cast<unsigned int>(
n_view))
64 for (
int i=0; i<
n_view; i++)
65 view[i] =
new (home) ViewNode<View>(
x[i]);
69 if (
static_cast<unsigned int>(
n_view)*4 >= width) {
71 ValNode<View>** val2node =
r.alloc<ValNode<View>* >(width);
73 for (
unsigned int i=0U; i<width; i++)
76 for (
int i=0; i<
n_view; i++) {
77 Edge<View>** edge_p =
view[i]->val_edges_ref();
79 if (val2node[xi.val()-
min] == NULL)
80 val2node[xi.val()-
min] =
new (home) ValNode<View>(xi.val());
81 *edge_p =
new (home) Edge<View>(val2node[xi.val()-
min],
view[i]);
82 edge_p = (*edge_p)->next_edge_ref();
87 for (
unsigned int i=width; i--; )
88 if (val2node[i] != NULL) {
89 val2node[i]->next_val(
val);
96 for (
int i=0; i<
n_view; i++)
104 for (
int i=0; i<
n_view; i++)
118 for (
int i =
n_view; i--; ) {
119 ViewNode<View>*
x =
view[i];
121 if (
x->view().assigned()) {
122 x->edge_fst()->val(
x)->matching(NULL);
123 for (Edge<View>* e =
x->val_edges(); e != NULL; e = e->next_edge())
126 }
else if (
x->changed()) {
128 Edge<View>* m =
x->edge_fst();
129 Edge<View>** p =
x->val_edges_ref();
133 while (e->val(
x)->val() < rx.
min()) {
135 e->unlink(); e->mark();
139 assert(rx.
min() == e->val(
x)->val());
141 for (
unsigned int j=rx.
width(); j--; ) {
143 p = e->next_edge_ref();
150 e->unlink(); e->mark();
155 m->val(
x)->matching(NULL);
161 for (Edge<View>* e =
x->val_edges(); e != NULL; e = e->next_edge())
181 int n_view_visited = 0;
191 ValNode<View>** v = &
val;
193 if (!(*v)->matching()) {
195 *v = (*v)->next_val();
200 v = (*v)->next_val_ref();
203 v = (*v)->next_val_ref();
208 while (!visit.
empty()) {
209 ValNode<View>* n = visit.
pop();
210 for (Edge<View>* e = n->edge_fst(); e != n->edge_lst(); e=e->next()) {
213 ViewNode<View>*
x = e->view(n);
217 assert(
x->edge_fst()->next() ==
x->edge_lst());
218 ValNode<View>* m =
x->edge_fst()->val(
x);
219 x->edge_fst()->use();
220 if (m->min <
count) {
244 for (
int i =
n_view; i--; ) {
245 ViewNode<View>*
x =
view[i];
246 if (!
x->edge_fst()->used(
x)) {
248 x->edge_fst()->val(
x)->matching(NULL);
249 for (Edge<View>* e =
x->val_edges(); e != NULL; e = e->next_edge())
254 IterPruneVal<View> pv(
view[i]);
Graph(void)
Construct graph as not yet initialized.
bool mark(void)
Mark edges in graph, return true if pruning is at all possible.
bool sync(void)
Synchronize graph with new view domains.
ExecStatus init(Space &home, ViewArray< View > &x)
Initialize graph.
ExecStatus prune(Space &home, bool &assigned)
Prune unmarked edges, assigned is true if a view got assigned.
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< View > *, Region > ViewNodeStack
Stack used during matching.
void init(Space &home, ViewNode< View > *x)
Initialize the edges for the view node x.
unsigned int count
Marking counter.
ViewNode< View > ** view
Array of view nodes.
bool match(ViewNodeStack &m, ViewNode< View > *x)
Find a matching for node x.
int n_view
Number of view nodes.
int n_val
Number of value nodes.
void scc(void)
Compute the strongly connected components.
ValNode< View > * val
Array of value nodes.
Value iterator for integer views.
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.
Support classes for propagators using a view-value graph.
Gecode toplevel namespace
Post propagator for SetVar SetOpType SetVar SetRelType r
void min(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
@ ES_OK
Execution is okay.
@ ES_FAILED
Execution has resulted in failure.
void max(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
Post propagator for SetVar x
#define GECODE_ASSUME(p)
Assert certain property.