38 template<
class V0,
class V1,
class Idx,
class Val>
43 template<
class V0,
class V1,
class Idx,
class Val>
51 template<
class V0,
class V1,
class Idx,
class Val>
57 while ((i != 0) && iv[i].marked())
61 template<
class V0,
class V1,
class Idx,
class Val>
66 template<
class V0,
class V1,
class Idx,
class Val>
71 while ((i != 0) && iv[i].marked())
75 template<
class V0,
class V1,
class Idx,
class Val>
78 assert(!iv[i].marked());
84 template<
class V0,
class V1,
class Idx,
class Val>
87 : iv(iv0), i(iv[0].val_next) {}
88 template<
class V0,
class V1,
class Idx,
class Val>
93 template<
class V0,
class V1,
class Idx,
class Val>
98 template<
class V0,
class V1,
class Idx,
class Val>
101 assert(!iv[i].marked());
107 template<
class V0,
class V1,
class Idx,
class Val>
113 while ((i != 0) && iv[i].marked())
117 template<
class V0,
class V1,
class Idx,
class Val>
122 template<
class V0,
class V1,
class Idx,
class Val>
127 while ((i != 0) && iv[i].marked())
131 template<
class V0,
class V1,
class Idx,
class Val>
134 assert(!iv[i].marked());
141 template<
class V0,
class V1,
class Idx,
class Val>
145 template<
class V0,
class V1,
class Idx,
class Val>
148 return iv[i].val <
iv[j].val;
156 template<
class V0,
class V1,
class Idx,
class Val>
165 template<
class V0,
class V1,
class Idx,
class Val>
173 return sizeof(*this);
176 template<
class V0,
class V1,
class Idx,
class Val>
181 }
else if (
x1.assigned()) {
189 template<
class V0,
class V1,
class Idx,
class Val>
193 x0.update(home,p.x0);
194 x1.update(home,p.x1);
197 template<
class V0,
class V1,
class Idx,
class Val>
203 template<
class V0,
class V1,
class Idx,
class Val>
213 template<
class V0,
class V1,
class Idx,
class Val>
220 template<
class V0,
class V1,
class Idx,
class Val>
224 Idx i =
iv[p].idx_next;
226 while (v() && (i != 0)) {
227 assert(!
iv[i].marked());
228 if (
iv[i].idx < v.
min()) {
229 iv[i].mark(); i=
iv[i].idx_next;
iv[p].idx_next=i;
230 }
else if (
iv[i].idx > v.
max()) {
233 p=i; i=
iv[i].idx_next;
238 iv[i].mark(); i=
iv[i].idx_next;
242 template<
class V0,
class V1,
class Idx,
class Val>
246 Idx i =
iv[p].val_next;
248 while (v() && (i != 0)) {
249 if (
iv[i].marked()) {
250 i=
iv[i].val_next;
iv[p].val_next=i;
251 }
else if (
iv[i].val < v.
min()) {
252 iv[i].mark(); i=
iv[i].val_next;
iv[p].val_next=i;
253 }
else if (
iv[i].val > v.
max()) {
256 p=i; i=
iv[i].val_next;
261 iv[i].mark(); i=
iv[i].val_next;
265 template<
class V0,
class V1,
class Idx,
class Val>
270 int* v = r.
alloc<
int>(
x0.size());
273 if (
c[i.val()] !=
x1.val())
280 template<
class V0,
class V1,
class Idx,
class Val>
288 if (
x1.assigned() && (
iv ==
nullptr)) {
295 assert(
iv !=
nullptr);
305 assert(!
x0.assigned());
311 assert(
iv !=
nullptr);
321 return (
x0.assigned() ||
x1.assigned()) ?
325 bool assigned =
x0.assigned() &&
x1.assigned();
335 if ((
x1.min() <=
c[v.val()]) && (
x1.max() >=
c[v.val()])) {
336 by_idx[
size].
idx =
static_cast<Idx
>(v.val());
345 if (
x1.width() <= 128) {
346 int n_buckets =
static_cast<int>(
x1.width());
347 int* pos = r.
alloc<
int>(n_buckets);
348 int* buckets = pos -
x1.min();
349 for (
int i=0; i<n_buckets; i++)
351 for (Idx i=0; i<
size; i++)
352 buckets[by_idx[i].val]++;
354 for (
int i=0; i<n_buckets; i++) {
355 int n=pos[i]; pos[i]=p; p+=n;
358 for (Idx i=0; i<
size; i++)
359 by_val[buckets[by_idx[i].val]++] = i+1;
361 for (Idx i=0; i<
size; i++)
367 for (Idx i=0; i<
size-1; i++) {
369 iv[by_val[i]].val_next = by_val[i+1];
372 iv[by_val[
size-1]].val_next = 0;
375 iv[0].val_next = by_val[0];
397 return (
x0.assigned() ||
x1.assigned()) ?
403 template<
class V0,
class V1>
406 assert(c.
size() > 0);
412 for (
int i=1; i<c.
size(); i++) {
Base-class for both propagators and branchers.
virtual size_t dispose(Space &home)
Delete actor and return its size.
Home class for posting propagators
void notice(Actor &a, ActorProperty p, bool duplicate=false)
Notice actor property.
Sorting pointers to (index,value) pairs in value order.
bool operator()(Idx &i, Idx &j)
Compare pairs at positions i and j.
const IdxVal * iv
Index-value pairs.
ByVal(const IdxVal *iv)
Initialize with index value pairs.
Linked index-value pairs.
Val val
The value Mark that this pair should be removed.
bool marked(void) const
Return whether this pair is marked for removal.
Idx idx_next
The position of the next pair in index order.
Value iterator for indices in index-value map.
Idx val(void) const
Return index of current index value pair.
void operator++(void)
Move to next index value pair (next index).
IterIdxUnmark(IdxVal *iv)
Initialize with start.
bool operator()(void) const
Test whether more pairs to be iterated.
Value iterator for values in index-value map.
void operator++(void)
Move to next index value pair (next value).
bool operator()(void) const
Test whether more pairs to be iterated.
Val val(void) const
Return value of current index value pair.
IterValUnmark(IdxVal *iv)
Initialize with start.
Value iterator for values in index-value map.
bool operator()(void) const
Test whether more pairs to be iterated.
IterVal(IdxVal *iv)
Initialize with start.
Val val(void) const
Return value of current index value pair.
void operator++(void)
Move to next index value pair (next value).
Int(Space &home, Int &p)
Constructor for cloning p.
ValSize s1
Size of x1 at last execution.
void prune_val(void)
Prune values according to x1.
IntSharedArray c
Shared array of integer values.
static ExecStatus post(Home home, IntSharedArray &i, V0 x0, V1 x1)
Post propagator for .
virtual Actor * copy(Space &home)
Perform copying during cloning.
virtual void reschedule(Space &home)
Schedule function.
static ExecStatus assigned_val(Space &home, IntSharedArray &c, V0 x0, V1 x1)
Prune when x1 is assigned.
IdxSize s0
Size of x0 at last execution.
virtual ExecStatus propagate(Space &home, const ModEventDelta &med)
Perform propagation.
IdxVal * iv
The index-value data structure.
Gecode::Support::IntTypeTraits< Idx >::utype IdxSize
Type for index size.
Gecode::Support::IntTypeTraits< Val >::utype ValSize
Type for value size.
virtual PropCost cost(const Space &home, const ModEventDelta &med) const
Cost function (defined as high binary).
void prune_idx(void)
Prune index according to x0.
virtual size_t dispose(Space &home)
Delete propagator and return its size.
Range iterator for integer views.
int max(void) const
Return largest value of range.
int min(void) const
Return smallest value of range.
Value iterator for integer views.
Value iterator for array of integers
static PropCost unary(PropCost::Mod m)
Single variable for modifier pcm.
static PropCost binary(PropCost::Mod m)
Two variables for modifier pcm.
size_t size
The size of the propagator (used during subsumption).
ModEventDelta med
A set of modification events (used during propagation).
Propagator(Home home)
Constructor for posting.
T * alloc(long unsigned int n)
Allocate block of n objects of type T from region.
int size(void) const
Return number of elements.
T * alloc(long unsigned int n)
Allocate block of n objects of type T from space heap.
ExecStatus ES_SUBSUMED(Propagator &p)
Propagator p is subsumed
void ignore(Actor &a, ActorProperty p, bool duplicate=false)
Ignore actor property.
int ModEventDelta
Modification event deltas.
#define GECODE_ME_CHECK(me)
Check whether modification event me is failed, and forward failure.
#define GECODE_ES_CHECK(es)
Check whether execution status es is failed or subsumed, and forward failure or subsumption.
@ AP_DISPOSE
Actor must always be disposed.
ExecStatus post_int(Home home, IntSharedArray &c, V0 x0, V1 x1)
Post propagator with appropriate index and value types.
const Gecode::PropCond PC_INT_DOM
Propagate when domain changes.
const Gecode::ModEvent ME_INT_VAL
Domain operation has resulted in a value (assigned variable).
void quicksort(Type *l, Type *r, Less &less)
Standard quick sort.
IntType s_type(signed int n)
Return type required to represent n.
IntType
Description of integer types.
@ IT_CHAR
char integer type
@ IT_SHRT
short integer type
Gecode toplevel namespace
SharedArray< int > IntSharedArray
Arrays of integers that can be shared among several element constraints.
void min(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
@ ES_OK
Execution is okay.
@ ES_FIX
Propagation has computed fixpoint.
@ ES_FAILED
Execution has resulted in failure.
@ ES_NOFIX
Propagation has not computed fixpoint.
void max(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
bool shared(ViewArray< ViewX > x, ViewArray< ViewY > y)