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>
143 Event(
ev_t _e,
int _task,
int _date,
int _inc = 0,
bool _first_prof =
false)
161 template<
class ViewM,
class ViewP,
class ViewU,
class View>
166 int* prune_tasks,
int& prune_tasks_size) {
168 if (ntask > 0 && (at_most ? su >
c[r] : su <
c[r])) {
173 while (pti != prune_tasks_size) {
174 int t = prune_tasks[pti];
180 (at_most ? u[t].
min() < 0
182 (at_most ? su-contribution[t] >
c[r]
183 : su-contribution[t] <
c[r])) {
199 if (at_most ? su-contribution[t]+u[t].
min() >
c[r]
200 : su-contribution[t]+u[t].
max() <
c[r]) {
201 if (e[t].
min() > low &&
208 int ptmin = p[t].min();
211 a(low-ptmin+1, up),
b(low+1, up+ptmin);
237 ? u[t].lq(home,
c[r]-su+contribution[t])
238 : u[t].gq(home,
c[r]-su+contribution[t]))) {
244 if (!
m[t].in(r) || (e[t].
max() <= up+1)) {
245 prune_tasks[pti] = prune_tasks[--prune_tasks_size];
258 bool operator ()(
const C& lhs,
const C& rhs) {
264 template<
class ViewM,
class ViewP,
class ViewU,
class View>
269 for (
int t = s.size(); t--; )
280 int *prune_tasks = region.
alloc<
int>(s.size());
281 int prune_tasks_size;
282 int *contribution = region.
alloc<
int>(s.size());
283 for (
int r =
c.
size();
r--; ) {
285 #define GECODE_PUSH_EVENTS(E) assert(events_size < s.size()*8); \
286 events[events_size++] = E
289 for (
int t = s.size(); t--; ) {
292 s[t].max() < e[t].min()) {
303 at_most ? u[t].
min() : u[t].
max(),
true));
305 at_most ? -u[t].
min() : -u[t].
max()));
314 at_most ? u[t].
min() : u[t].
max(),
true));
316 at_most ? -u[t].
min() : -u[t].
max()));
326 #undef GECODE_PUSH_EVENTS
329 if (events_size == 0) {
343 prune_tasks_size = 0;
344 for (
int i = s.
size();
i--; ) contribution[
i] = 0;
347 while (ei < events_size) {
349 if (d != events[ei].date) {
352 contribution, prune_tasks, prune_tasks_size));
356 ntask += events[ei].
inc;
358 su += events[ei].
inc;
359 if(events[ei].first_prof)
360 contribution[events[ei].
task] = at_most
361 ?
std::max(contribution[events[ei].task], events[ei].inc)
362 :
std::min(contribution[events[ei].task], events[ei].inc);
365 assert(prune_tasks_size<s.size());
366 prune_tasks[prune_tasks_size++] = events[ei].
task;
373 contribution, prune_tasks, prune_tasks_size));