34 namespace Gecode {
namespace Int {
namespace Element {
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>
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>
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>
141 template<
class V0,
class V1,
class Idx,
class Val>
145 template<
class V0,
class V1,
class Idx,
class 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>
226 while (
v() && (i != 0)) {
228 if (
iv[i].idx < v.
min()) {
230 }
else if (
iv[i].idx > v.
max()) {
242 template<
class V0,
class V1,
class Idx,
class Val>
248 while (
v() && (i != 0)) {
251 }
else if (
iv[i].val < v.
min()) {
253 }
else if (
iv[i].val > v.
max()) {
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 == NULL)) {
293 if ((static_cast<ValSize>(
x1.size()) ==
s1) &&
305 assert(!
x0.assigned());
309 if ((static_cast<IdxSize>(
x0.size()) ==
s0) &&
321 return (
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());
337 by_idx[
size].val =
static_cast<Val
>(
c[
v.val()]);
345 if (
x1.width() <= 128) {
346 int n_buckets =
static_cast<int>(
x1.width());
348 int* buckets = pos -
x1.min();
349 for (
int i=n_buckets;
i--; )
351 for (Idx
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=size;
i--; )
359 by_val[buckets[by_idx[
i].val]++] =
i+1;
361 for (Idx
i = size;
i--; )
364 Support::quicksort<Idx>(by_val,
size,less);
367 for (Idx
i = size-1;
i--; ) {
368 by_idx[
i].idx_next =
i+2;
371 by_idx[size-1].idx_next = 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++) {
Val val(void) const
Return value of current index value pair.
bool marked(void *p)
Check whether p is marked.
IdxVal * iv
The index-value data structure.
bool marked(void) const
Return whether this pair is marked for removal.
IdxSize s0
Size of x0 at last execution.
Value iterator for values in index-value map.
ExecStatus ES_SUBSUMED(Propagator &p)
const FloatNum max
Largest allowed float value.
Linked index-value pairs.
Idx val(void) const
Return index of current index value pair.
Actor must always be disposed.
void operator++(void)
Move to next index value pair (next value)
T * alloc(long unsigned int n)
Allocate block of n objects of type T from region.
IterValUnmark(IdxVal *iv)
Initialize with start.
Value iterator for array of integers
void max(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
IterVal(IdxVal *iv)
Initialize with start.
bool pos(const View &x)
Test whether x is postive.
virtual void reschedule(Space &home)
Schedule function.
const IdxVal * iv
Index-value pairs.
Base-class for propagators.
bool operator()(void) const
Test whether more pairs to be iterated.
ValSize s1
Size of x1 at last execution.
Value iterator for indices in index-value map.
Value iterator for integer views.
Propagation has computed fixpoint.
static PropCost unary(PropCost::Mod m)
Single variable for modifier pcm.
IntSharedArray c
Shared array of integer values.
Base-class for both propagators and branchers.
bool operator()(void) const
Test whether more pairs to be iterated.
Range iterator for integer views.
IntType s_type(signed int n)
Return type required to represent n.
T * alloc(long unsigned int n)
Allocate block of n objects of type T from space heap.
#define GECODE_ES_CHECK(es)
Check whether execution status es is failed or subsumed, and forward failure or subsumption.
int p
Number of positive literals for node type.
const FloatNum min
Smallest allowed float value.
Gecode::IntArgs i(4, 1, 2, 3, 4)
int n
Number of negative literals for node type.
Gecode::Support::IntTypeTraits< Val >::utype ValSize
Type for value size.
Val val
The value Mark that this pair should be removed.
Execution has resulted in failure.
Value iterator for values in index-value map.
int size(void) const
Return number of elements.
Idx idx_next
The position of the next pair in index order.
const Gecode::ModEvent ME_INT_VAL
Domain operation has resulted in a value (assigned variable)
void prune_val(void)
Prune values according to x1.
ModEventDelta med
A set of modification events (used during propagation)
int min(void) const
Return smallest value of range.
const Gecode::PropCond PC_INT_DOM
Propagate when domain changes.
size_t size
The size of the propagator (used during subsumption)
Gecode::Support::IntTypeTraits< Idx >::utype IdxSize
Type for index size.
static ExecStatus post(Home home, IntSharedArray &i, V0 x0, V1 x1)
Post propagator for .
#define GECODE_ME_CHECK(me)
Check whether modification event me is failed, and forward failure.
void operator++(void)
Move to next index value pair (next index)
void notice(Actor &a, ActorProperty p, bool duplicate=false)
Notice actor property.
ByVal(const IdxVal *iv)
Initialize with index value pairs.
Post propagator for SetVar SetOpType SetVar SetRelType r
void min(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
virtual PropCost cost(const Space &home, const ModEventDelta &med) const
Cost function (defined as high binary)
void ignore(Actor &a, ActorProperty p, bool duplicate=false)
Ignore actor property.
virtual Actor * copy(Space &home)
Perform copying during cloning.
virtual size_t dispose(Space &home)
Delete actor and return its size.
virtual size_t dispose(Space &home)
Delete propagator and return its size.
bool assigned(View x, int v)
Whether x is assigned to value v.
Int(Space &home, Int &p)
Constructor for cloning p.
int max(void) const
Return largest value of range.
Val val(void) const
Return value of current index value pair.
ExecStatus post_int(Home home, IntSharedArray &c, V0 x0, V1 x1)
Post propagator with apropriate index and value types.
Propagation has not computed fixpoint.
void prune_idx(void)
Prune index according to x0.
void operator++(void)
Move to next index value pair (next value)
bool shared(const ConstView< ViewA > &, const ConstView< ViewB > &)
Test whether views share same variable.
IterIdxUnmark(IdxVal *iv)
Initialize with start.
bool operator()(void) const
Test whether more pairs to be iterated.
Idx val_next
The position of the next pair in value order.
Gecode toplevel namespace
Sorting pointers to (index,value) pairs in value order.
IntType
Description of integer types.
int ModEventDelta
Modification event deltas.
Element propagator for array of integers
Home class for posting propagators
static ExecStatus assigned_val(Space &home, IntSharedArray &c, V0 x0, V1 x1)
Prune when x1 is assigned.
static PropCost binary(PropCost::Mod m)
Two variables for modifier pcm.
virtual ExecStatus propagate(Space &home, const ModEventDelta &med)
Perform propagation.
bool operator()(Idx &i, Idx &j)
Compare pairs at positions i and j.