40 namespace Gecode {
namespace Int {
namespace Distinct {
49 using namespace ViewValGraph;
51 view = home.
alloc<ViewNode<View>*>(n_view);
54 int min =
x[n_view-1].min();
55 int max =
x[n_view-1].max();
56 for (
int i=n_view-1;
i--; ) {
61 unsigned int width = static_cast<unsigned int>(
max-
min+1);
64 if (width < static_cast<unsigned int>(n_view))
68 for (
int i=n_view;
i--; )
69 view[
i] =
new (home) ViewNode<View>(
x[
i]);
73 if (static_cast<unsigned int>(n_view)*4 >= width) {
75 ValNode<View>** val2node =
r.alloc<ValNode<View>* >(width);
77 for (
unsigned int i=width;
i--; )
80 for (
int i=n_view;
i--; ) {
81 Edge<View>** edge_p = view[
i]->val_edges_ref();
83 if (val2node[xi.val()-
min] == NULL)
84 val2node[xi.val()-
min] =
new (home) ValNode<View>(xi.val());
85 *edge_p =
new (home) Edge<View>(val2node[xi.val()-
min],view[
i]);
86 edge_p = (*edge_p)->next_edge_ref();
91 for (
unsigned int i=width;
i--; )
92 if (val2node[
i] != NULL) {
93 val2node[
i]->next_val(val);
100 for (
int i=n_view;
i--; )
108 for (
int i = n_view;
i--; )
109 if (!match(m,view[
i]))
117 using namespace ViewValGraph;
122 for (
int i = n_view;
i--; ) {
123 ViewNode<View>*
x = view[
i];
125 x->edge_fst()->val(
x)->matching(NULL);
126 for (Edge<View>* e =
x->val_edges(); e != NULL; e = e->next_edge())
128 view[
i] = view[--n_view];
129 }
else if (
x->changed()) {
131 Edge<View>* m =
x->edge_fst();
132 Edge<View>**
p =
x->val_edges_ref();
135 while (e->val(
x)->val() < rx.min()) {
137 e->unlink(); e->mark();
141 assert(rx.min() == e->val(
x)->val());
143 for (
unsigned int j=rx.width(); j--; ) {
145 p = e->next_edge_ref();
152 e->unlink(); e->mark();
157 m->val(
x)->matching(NULL);
163 for (Edge<View>* e =
x->val_edges(); e != NULL; e = e->next_edge())
170 if (!match(m,re.
pop()))
179 using namespace ViewValGraph;
183 int n_view_visited = 0;
193 ValNode<View>**
v = &val;
195 if (!(*v)->matching()) {
197 *
v = (*v)->next_val();
202 v = (*v)->next_val_ref();
205 v = (*v)->next_val_ref();
210 while (!visit.
empty()) {
211 ValNode<View>*
n = visit.
pop();
212 for (Edge<View>* e =
n->edge_fst(); e !=
n->edge_lst(); e=e->next()) {
215 ViewNode<View>*
x = e->view(
n);
219 assert(
x->edge_fst()->next() ==
x->edge_lst());
220 ValNode<View>* m =
x->edge_fst()->val(
x);
221 x->edge_fst()->use();
222 if (m->min <
count) {
232 if (n_view_visited < n_view) {
243 using namespace ViewValGraph;
246 for (
int i = n_view;
i--; ) {
247 ViewNode<View>*
x = view[
i];
248 if (!
x->edge_fst()->used(
x)) {
250 x->edge_fst()->val(
x)->matching(NULL);
251 for (Edge<View>* e =
x->val_edges(); e != NULL; e = e->next_edge())
253 view[
i] = view[--n_view];
256 IterPruneVal<View> pv(view[
i]);
void push(const T &x)
Push element x on top of stack.
bool mark(Space &home)
Mark edges in graph, return true if pruning is at all possible.
const FloatNum max
Largest allowed float value.
void count(Home home, const IntVarArgs &x, int n, IntRelType irt, int m, IntPropLevel)
Post propagator for .
void update(Space &home, bool share, VarImpVar< VarImp > &y)
Update this variable to be a clone of variable y.
void max(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
bool assigned(void) const
Test whether view is assigned.
bool empty(void) const
Test whether stack is empty.
ExecStatus prune(Space &home, bool &assigned)
Prune unmarked edges, assigned is true if a view got assigned.
Value iterator for integer views.
Range iterator for integer views.
T * alloc(long unsigned int n)
Allocate block of n objects of type T from space heap.
ExecStatus init(Space &home, ViewArray< View > &x)
Initialize graph.
int p
Number of positive literals for node type.
Graph(void)
Construct graph as not yet initialized.
const FloatNum min
Smallest allowed float value.
Gecode::IntArgs i(4, 1, 2, 3, 4)
int n
Number of negative literals for node type.
Execution has resulted in failure.
View-value graph base class.
#define GECODE_ME_CHECK(me)
Check whether modification event me is failed, and forward failure.
Post propagator for SetVar SetOpType SetVar SetRelType r
void min(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
bool assigned(View x, int v)
Whether x is assigned to value v.
Stack with fixed number of elements.
T pop(void)
Pop topmost element from stack and return it.
Post propagator for SetVar x
Gecode toplevel namespace
bool sync(Space &home)
Synchronize graph with new view domains.