43 namespace Gecode {
namespace Int {
namespace Arithmetic {
49 template<
class VA,
class VB,
class Ops>
56 ModEvent me = x0.lq(home,ops.fnroot(x1.max()));
61 ModEvent me = x0.gq(home,ops.cnroot(x1.min()));
66 ModEvent me = x1.lq(home,ops.pow(x0.max()));
71 ModEvent me = x1.gq(home,ops.pow(x0.min()));
79 template<
class VA,
class VB,
class Ops>
85 template<
class VA,
class VB,
class Ops>
92 assert(!x1.assigned());
98 template<
class VA,
class VB,
class Ops>
105 template<
class VA,
class VB,
class Ops>
111 template<
class VA,
class VB,
class Ops>
128 assert((x0.
min() < 0) && (0 < x0.
max()));
130 assert(x1.
min() >= 0);
131 int u = ops.fnroot(x1.
max());
135 ops.pow(-x0.
min()))));
137 assert((x1.
min() < 0) && (0 < x1.
max()));
155 if (static_cast<unsigned int>(ops.exp()) >=
sizeof(
int) * CHAR_BIT) {
160 ops.exp(ops.even() ? 2 : 1);
163 if (ops.exp() == 0) {
166 }
else if (ops.exp() == 1) {
171 assert(ops.exp() != 0);
185 if ((x0.
min() >= 0) || ((x1.
min() >= 0) && !ops.even()))
188 if (ops.even() && (x0.
max() <= 0))
192 if (!ops.even() && ((x0.
max() <= 0) || (x1.
max() <= 0)))
199 assert((x0.
min() < 0) && (x0.
max() > 0));
203 ops.pow(x0.
max()))));
228 if ((x0.min() >= 0) || ((x1.min() >= 0) && !ops.even()))
230 ::
post(home(*
this),x0,x1,ops)));
232 if (ops.even() && (x0.max() <= 0))
236 if (!ops.even() && ((x0.max() <= 0) || (x1.max() <= 0)))
243 if (x0.assigned() && x1.assigned())
244 return (ops.pow(x0.val()) == x1.val()) ?
282 return ops.fnroot(x);
298 return -ops.fnroot(-x);
300 return ops.fnroot(x);
309 template<
class VA,
class VB,
class Ops>
315 template<
class VA,
class VB,
class Ops>
321 if (!x0.assigned()) {
322 assert(!x1.assigned());
328 template<
class VA,
class VB,
class Ops>
335 template<
class VA,
class VB,
class Ops>
341 template<
class VA,
class VB,
class Ops>
352 template<
class VA,
class VB,
class Ops>
357 return x0.assigned() ?
393 if (static_cast<unsigned int>(ops.exp()) >=
sizeof(
int) * CHAR_BIT) {
398 ops.exp(ops.even() ? 2 : 1);
401 if (ops.exp() == 0) {
404 }
else if (ops.exp() == 1) {
409 assert(ops.exp() != 0);
423 if ((x0.
min() >= 0) || ((x1.
min() >= 0) && !ops.even()))
426 if (ops.even() && (x0.
max() <= 0))
430 if (!ops.even() && ((x0.
max() <= 0) || (x1.
max() <= 0)))
437 assert((x0.
min() < 0) && (x0.
max() > 0));
441 ops.pow(x0.
max()))));
477 if ((x0.min() >= 0) || ((x1.min() >= 0) && !ops.even()))
479 ::
post(home(*
this),x0,x1,ops)));
481 if (ops.even() && (x0.max() <= 0))
485 if (!ops.even() && ((x0.max() <= 0) || (x1.max() <= 0)))
492 if (x0.assigned() && x1.assigned())
493 return (ops.pow(x0.val()) == x1.val()) ?
502 using namespace Iter::Values;
503 Positive<ViewValues<IntView> >
pos(
i);
504 Negative<ViewValues<IntView> >
neg(j);
509 Map<Minus,ValuesMapPow<Ops>,
true> sm(m,vmp);
511 Map<Minus,ValuesMapPow<Ops>,
true> >
u(sp,sm);
522 using namespace Iter::Values;
527 Map<ViewValues<IntView>,ValuesMapNroot<Ops>,
true> >
u(mi,sj);
virtual Actor * copy(Space &home, bool share)
Copy propagator during cloning.
#define GECODE_REWRITE(prop, post)
Rewrite propagator by executing post function.
void mod(Home home, IntVar x0, IntVar x1, IntVar x2, IntConLevel icl)
Post propagator for .
void post(Home home, Term *t, int n, FloatRelType frt, FloatVal c)
Post propagator for linear constraint over floats.
ExecStatus ES_SUBSUMED(Propagator &p)
const FloatNum max
Largest allowed float value.
ModEvent eq(Space &home, int n)
Restrict domain values to be equal to n.
Propagator for ternary union
Mapping integer (must be an n-th power) to n-th root.
ExecStatus ES_NOFIX_PARTIAL(Propagator &p, const ModEventDelta &med)
Propagator p has not computed partial fixpoint
static ExecStatus post(Home home, View0 x0, View1 x1)
Post domain consistent propagator .
virtual Actor * copy(Space &home, bool share)
Copy propagator during cloning.
int ModEvent
Type for modification events.
static ExecStatus post(Home home, VA x0, VB x1, Ops ops)
Post propagator.
Bounds consistent power propagator.
int val(int x) const
Perform mapping.
ValuesMapNroot(const Ops &o)
Initialize with operations o.
int val(int x) const
Perform mapping.
virtual ExecStatus propagate(Space &home, const ModEventDelta &med)
Perform propagation.
int val(int x) const
Perform mapping.
Value iterator for integer views.
virtual Actor * copy(Space &home, bool share)
Copy propagator during cloning.
Propagation has computed fixpoint.
static PropCost unary(PropCost::Mod m)
Single variable for modifier pcm.
const int max
Largest allowed integer value.
PowPlusBnd(Home home, VA x0, VB x1, const Ops &ops)
Constructor for posting.
const int min
Smallest allowed integer value.
Base-class for both propagators and branchers.
static ExecStatus post(Home home, View0 x0, View1 x1)
Post bounds consistent propagator .
int max(void) const
Return maximum of domain.
#define GECODE_ES_CHECK(es)
Check whether execution status es is failed or subsumed, and forward failure or subsumption.
bool same(const CachedView< View > &x, const CachedView< View > &y)
int p
Number of positive literals for node type.
Mapping integer (must be an n-th power) to n-th root (signed)
Gecode::IntArgs i(4, 1, 2, 3, 4)
static ExecStatus post(Home home, VA x0, VB x1, Ops ops)
Post propagator.
Execution has resulted in failure.
ModEvent lq(Space &home, int n)
Restrict domain values to be less or equal than n.
const Gecode::PropCond PC_INT_BND
Propagate when minimum or maximum of a view changes.
const Gecode::ModEvent ME_INT_VAL
Domain operation has resulted in a value (assigned variable)
virtual PropCost cost(const Space &home, const ModEventDelta &med) const
Cost function.
static ExecStatus post(Home home, IntView x0, IntView x1, Ops ops)
Post propagator.
Bounds consistent positive power propagator.
virtual ExecStatus propagate(Space &home, const ModEventDelta &med)
Perform propagation.
const Gecode::PropCond PC_INT_DOM
Propagate when domain changes.
int min(void) const
Return minimum of domain.
virtual ExecStatus propagate(Space &home, const ModEventDelta &med)
Perform propagation.
Value iterator for mapping values of a value iterator.
PowDom(Space &home, bool share, PowDom< Ops > &p)
Constructor for cloning p.
ValuesMapNrootSigned(const Ops &o)
Initialize with operations o.
ExecStatus prop_pow_plus_bnd(Space &home, VA x0, VB x1, const Ops &ops)
#define GECODE_ME_CHECK(me)
Check whether modification event me is failed, and forward failure.
Mapping integer to power.
Domain consistent power propagator.
union Gecode::@518::NNF::@57 u
Union depending on nodetype t.
Domain consistent positive power propagator.
Integer view for integer variables.
Node * x
Pointer to corresponding Boolean expression node.
const Gecode::ModEvent ME_INT_DOM
Domain operation has changed the domain.
PowPlusDom(Home home, VA x0, VB x1, const Ops &ops)
Constructor for posting.
virtual ExecStatus propagate(Space &home, const ModEventDelta &med)
Perform propagation.
static ModEvent me(const ModEventDelta &med)
Return modification event for view type in med.
bool pos(const View &x)
Test whether x is postive.
bool me_modified(ModEvent me)
Check whether modification event me describes variable modification.
virtual Actor * copy(Space &home, bool share)
Copy propagator during cloning.
static ExecStatus post(Home home, IntView x0, IntView x1, Ops ops)
Post propagator.
ModEvent gq(Space &home, int n)
Restrict domain values to be greater or equal than n.
int med(void) const
Return median of domain (greatest element not greater than the median)
Propagation has not computed fixpoint.
virtual PropCost cost(const Space &home, const ModEventDelta &med) const
Cost function.
Gecode toplevel namespace
ValuesMapPow(const Ops &o)
Initialize with operations o.
ExecStatus prop_pow_bnd(Space &home, IntView x0, IntView x1, const Ops &ops)
int ModEventDelta
Modification event deltas.
Home class for posting propagators
static PropCost binary(PropCost::Mod m)
Two variables for modifier pcm.
PowBnd(Space &home, bool share, PowBnd &p)
Constructor for cloning p.
bool me_failed(ModEvent me)
Check whether modification event me is failed.
bool neg(const View &x)
Test whether x is negative.