Go to the documentation of this file.
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];
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);
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]);
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.
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.
Gecode toplevel namespace
Range iterator for integer views.
bool sync(void)
Synchronize graph with new view domains.
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.
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.
void update(Space &home, VarImpVar< VarImp > &y)
Update this variable to be a clone of variable y.
#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.
Gecode::IntArgs i({1, 2, 3, 4})
@ ES_OK
Execution is okay.
int p
Number of positive literals for node type.
const FloatNum max
Largest allowed float value.
bool mark(void)
Mark edges in graph, return true if pruning is at all possible.
#define GECODE_ASSUME(p)
Assert certain property.