Go to the documentation of this file.
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]);
Post propagator for SetVar x
unsigned int width(void) const
Return width of range (distance between minimum and maximum)
View-value graph base class.
Graph(void)
Construct graph as not yet initialized.
void max(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
int min(void) const
Return smallest value of range.
bool assigned(View x, int v)
Whether x is assigned to value v.
Gecode::IntArgs i(4, 1, 2, 3, 4)
Stack with fixed number of elements.
Value iterator for integer views.
const FloatNum min
Smallest allowed float value.
bool assigned(void) const
Test whether view is assigned.
void update(Space &home, bool share, VarImpVar< VarImp > &y)
Update this variable to be a clone of variable y.
Gecode toplevel namespace
Range iterator for integer views.
Post propagator for SetVar SetOpType SetVar SetRelType r
T * alloc(long unsigned int n)
Allocate block of n objects of type T from space heap.
bool empty(void) const
Test whether stack is empty.
T pop(void)
Pop topmost element from stack and return it.
bool sync(Space &home)
Synchronize graph with new view domains.
bool mark(Space &home)
Mark edges in graph, return true if pruning is at all possible.
void count(Home home, const IntVarArgs &x, int n, IntRelType irt, int m, IntPropLevel)
Post propagator for .
ExecStatus prune(Space &home, bool &assigned)
Prune unmarked edges, assigned is true if a view got assigned.
void push(const T &x)
Push element x on top of stack.
#define GECODE_ME_CHECK(me)
Check whether modification event me is failed, and forward failure.
void min(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
int n
Number of negative literals for node type.
@ ES_FAILED
Execution has resulted in failure.
ExecStatus init(Space &home, ViewArray< View > &x)
Initialize graph.
@ ES_OK
Execution is okay.
int p
Number of positive literals for node type.
const FloatNum max
Largest allowed float value.