36namespace 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]);
int p
Number of positive literals for node type.
int n
Number of negative literals for node type.
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)
View-value graph base class.
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.
void update(Space &home, VarImpVar< VarImp > &y)
Update this variable to be a clone of variable y.
bool assigned(void) const
Test whether view is assigned.
#define GECODE_ME_CHECK(me)
Check whether modification event me is failed, and forward failure.
Gecode toplevel namespace
void count(Home home, const IntVarArgs &x, int n, IntRelType irt, int m, IntPropLevel ipl=IPL_DEF)
Post propagator for .
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.