36 namespace Gecode {
namespace Int {
namespace Distinct {
45 using namespace ViewValGraph;
47 view = home.
alloc<ViewNode<View>*>(n_view);
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++)
105 if (!match(m,view[
i]))
113 using namespace ViewValGraph;
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())
125 view[
i] = view[--n_view];
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())
168 if (!match(m,re.
pop()))
177 using namespace ViewValGraph;
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);
214 if (x->min <
count) {
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) {
230 if (n_view_visited < n_view) {
241 using namespace ViewValGraph;
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())
251 view[
i] = view[--n_view];
254 IterPruneVal<View> pv(view[
i]);
void push(const T &x)
Push element x on top of stack.
#define GECODE_ASSUME(p)
Assert certain property.
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 max(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
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.
bool mark(void)
Mark edges in graph, return true if pruning is at all possible.
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.
int n
Number of negative literals for node type.
Gecode::IntArgs i({1, 2, 3, 4})
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
int size(void) const
Return size of array (number of elements)
bool sync(void)
Synchronize graph with new view domains.