Go to the documentation of this file.
47 namespace Gecode {
namespace Int {
namespace Cumulatives {
49 template<
class ViewM,
class ViewP,
class ViewU,
class View>
60 m(_m), s(_s),
p(_p), e(
_e),
u(_u),
c(
_c), at_most(_at_most) {
70 template<
class ViewM,
class ViewP,
class ViewU,
class View>
77 (void)
new (home)
Val(home, m,s,
p,e,
u,
c,at_most);
81 template<
class ViewM,
class ViewP,
class ViewU,
class View>
85 :
Propagator(home,share,vp), at_most(vp.at_most) {
87 s.update(home, share, vp.
s);
89 e.update(home, share, vp.
e);
94 template<
class ViewM,
class ViewP,
class ViewU,
class View>
107 return sizeof(*this);
110 template<
class ViewM,
class ViewP,
class ViewU,
class View>
116 template<
class ViewM,
class ViewP,
class ViewU,
class View>
126 template<
class ViewM,
class ViewP,
class ViewU,
class View>
153 Event(
ev_t _e,
int _task,
int _date,
int _inc = 0,
bool _first_prof =
false)
171 template<
class ViewM,
class ViewP,
class ViewU,
class View>
176 int* prune_tasks,
int& prune_tasks_size) {
178 if (ntask > 0 && (at_most ? su >
c[
r] : su <
c[
r])) {
183 while (pti != prune_tasks_size) {
184 int t = prune_tasks[pti];
190 (at_most ?
u[
t].
min() < 0
192 (at_most ? su-contribution[
t] >
c[
r]
193 : su-contribution[
t] <
c[
r])) {
209 if (at_most ? su-contribution[
t]+
u[
t].
min() >
c[
r]
210 : su-contribution[
t]+
u[
t].
max() <
c[
r]) {
211 if (e[
t].
min() > low &&
218 int ptmin =
p[
t].min();
221 a(low-ptmin+1, up),
b(low+1, up+ptmin);
247 ?
u[
t].lq(home,
c[
r]-su+contribution[
t])
248 :
u[
t].gq(home,
c[
r]-su+contribution[
t]))) {
254 if (!m[
t].in(
r) || (e[
t].
max() <= up+1)) {
255 prune_tasks[pti] = prune_tasks[--prune_tasks_size];
268 bool operator ()(
const C& lhs,
const C& rhs) {
274 template<
class ViewM,
class ViewP,
class ViewU,
class View>
279 for (
int t = s.size();
t--; )
290 int *prune_tasks = region.
alloc<
int>(s.size());
291 int prune_tasks_size;
292 int *contribution = region.
alloc<
int>(s.size());
293 for (
int r =
c.
size();
r--; ) {
295 #define GECODE_PUSH_EVENTS(E) assert(events_size < s.size()*8); \
296 events[events_size++] = E
299 for (
int t = s.size();
t--; ) {
302 s[
t].max() < e[
t].min()) {
336 #undef GECODE_PUSH_EVENTS
339 if (events_size == 0) {
353 prune_tasks_size = 0;
354 for (
int i = s.size();
i--; ) contribution[
i] = 0;
357 while (ei < events_size) {
359 if (
d != events[ei].date) {
362 contribution, prune_tasks, prune_tasks_size));
366 ntask += events[ei].
inc;
368 su += events[ei].
inc;
369 if(events[ei].first_prof)
370 contribution[events[ei].
task] = at_most
371 ?
std::max(contribution[events[ei].task], events[ei].inc)
372 :
std::min(contribution[events[ei].task], events[ei].inc);
375 assert(prune_tasks_size<s.size());
376 prune_tasks[prune_tasks_size++] = events[ei].
task;
383 contribution, prune_tasks, prune_tasks_size));
void notice(Actor &a, ActorProperty p, bool duplicate=false)
Notice actor property.
bool me_failed(ModEvent me)
Check whether modification event me is failed.
void update(Space &, bool share, ViewArray< View > &a)
Update array to be a clone of array a.
ev_t
Types of events for the sweep-line.
void max(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
void subscribe(Space &home, Propagator &p, PropCond pc, bool schedule=true)
Subscribe propagator p with propagation condition pc to variable.
An event collects the information for one evnet for the sweep-line.
ExecStatus ES_SUBSUMED(Propagator &p)
int date
The date of this event.
Event(ev_t _e, int _task, int _date, int _inc=0, bool _first_prof=false)
Simple constructor.
ExecStatus prune(Space &home, int low, int up, int r, int ntask, int su, int *contribution, int *prune_tasks, int &prune_tasks_size)
bool assigned(View x, int v)
Whether x is assigned to value v.
Gecode::IntArgs i(4, 1, 2, 3, 4)
T * alloc(long unsigned int n)
Allocate block of n objects of type T from region.
ExecStatus subsumed(Space &home, Propagator &p, int c, TaskArray< Task > &t)
Check for subsumption (all tasks must be assigned)
Base-class for both propagators and branchers.
static PropCost quadratic(PropCost::Mod m, unsigned int n)
Quadratic complexity for modifier m and size measure n.
FloatVal min(const FloatNum &x, const FloatVal &y)
union Gecode::@579::NNF::@61 u
Union depending on nodetype t.
#define GECODE_PUSH_EVENTS(E)
Gecode toplevel namespace
Base-class for propagators.
#define GECODE_ES_CHECK(es)
Check whether execution status es is failed or subsumed, and forward failure or subsumption.
void insertion(Type *l, Type *r, Less &less)
Standard insertion sort.
static ExecStatus post(Home home, const ViewArray< ViewM > &, const ViewArray< View > &, const ViewArray< ViewP > &, const ViewArray< View > &, const ViewArray< ViewU > &, const SharedArray< int > &, bool)
Post propagator.
virtual size_t dispose(Space &home)
Dispose propagator.
Home class for posting propagators
struct Gecode::@579::NNF::@61::@63 a
For atomic nodes.
struct Gecode::@579::NNF::@61::@62 b
For binary nodes (and, or, eqv)
@ AP_DISPOSE
Actor must always be disposed.
void update(Space &home, bool share, SharedHandle &sh)
Updating during cloning.
Post propagator for SetVar SetOpType SetVar SetRelType r
Val(Space &home, bool share, Val< ViewM, ViewP, ViewU, View > &p)
bool operator<(const Event &ev) const
Order events based on date.
virtual ExecStatus propagate(Space &home, const ModEventDelta &med)
Perform propagation.
virtual PropCost cost(const Space &home, const ModEventDelta &med) const
Cost function (defined as low quadratic)
virtual void reschedule(Space &home)
Schedule function.
Multi _e(Gecode::IntArgs(4, 4, 2, 3, 1))
const Gecode::PropCond PC_INT_BND
Propagate when minimum or maximum of a view changes.
ExecStatus prune(Space &home, ViewArray< VX > &x, ConstIntView)
FloatNum size(void) const
Return size of float value (distance between maximum and minimum)
Multi _c(Gecode::IntArgs(3, 1, 2, 3))
bool failed(void) const
Check whether space is failed.
Propagator for the cumulatives constraint
int inc
The quantity changed by this event (if any)
Range iterator for singleton range.
FloatVal max(const FloatNum &x, const FloatVal &y)
void ignore(Actor &a, ActorProperty p, bool duplicate=false)
Ignore actor property.
virtual size_t dispose(Space &home)
Delete actor and return its size.
void min(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
int task
The task this event refers to.
Gecode::FloatVal c(-8, 8)
@ ES_FAILED
Execution has resulted in failure.
const Gecode::PropCond PC_INT_DOM
Propagate when domain changes.
int ModEventDelta
Modification event deltas.
@ ES_NOFIX
Propagation has not computed fixpoint.
@ ES_OK
Execution is okay.
int p
Number of positive literals for node type.
ev_t e
The type of the event.
virtual Actor * copy(Space &home, bool share)
Create copy during cloning.