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=0;
i<n_buckets;
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;
359 by_val[buckets[by_idx[
i].val]++] =
i+1;
364 Support::quicksort<Idx>(by_val,
size,less);
367 for (Idx
i=0;
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.
int n
Number of negative literals for node type.
Gecode::Support::IntTypeTraits< Val >::utype ValSize
Type for value size.
Gecode::IntArgs i({1, 2, 3, 4})
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)
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.
bool shared(ViewArray< ViewX > x, ViewArray< ViewY > y)
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.