fix for issue33

This commit is contained in:
lperron@google.com
2013-11-22 10:48:49 +00:00
parent c1defac6f3
commit 7cd445566c

View File

@@ -722,15 +722,19 @@ class RankedPropagator : public Constraint {
IntervalVar* const interval = RankedInterval(i);
IntervalVar* const next_interval = RankedInterval(i + 1);
IntVar* const slack = RankedSlack(i);
DCHECK(interval->MustBePerformed());
DCHECK(next_interval->MustBePerformed());
const int64 transition_time = RankedTransitionTime(i, i + 1);
next_interval->SetStartRange(
CapAdd(interval->StartMin(), slack->Min() + transition_time),
CapAdd(interval->StartMax(), slack->Max() + transition_time));
}
// Propagates on ranked last from right to left.
for (int i = last_position; i > last_sentinel; --i) {
for (int i = last_position; i > last_sentinel + 1; --i) {
IntervalVar* const interval = RankedInterval(i - 1);
IntervalVar* const next_interval = RankedInterval(i);
DCHECK(interval->MustBePerformed());
DCHECK(next_interval->MustBePerformed());
IntVar* const slack = RankedSlack(i - 1);
const int64 transition_time = RankedTransitionTime(i - 1, i);
interval->SetStartRange(
@@ -788,10 +792,13 @@ class RankedPropagator : public Constraint {
}
}
// TODO(user): cache transition on ranked intervals in a vector.
// Propagates on ranked first from right to left.
for (int i = std::min(first_sentinel - 2, last_position - 1); i >= 0; --i) {
IntervalVar* const interval = RankedInterval(i);
IntervalVar* const next_interval = RankedInterval(i + 1);
DCHECK(interval->MustBePerformed());
DCHECK(next_interval->MustBePerformed());
IntVar* const slack = RankedSlack(i);
const int64 transition_time = RankedTransitionTime(i, i + 1);
interval->SetStartRange(
@@ -799,9 +806,11 @@ class RankedPropagator : public Constraint {
CapSub(next_interval->StartMax(), slack->Min() + transition_time));
}
// Propagates on ranked last from left to right.
for (int i = last_sentinel; i < last_position - 1; ++i) {
for (int i = last_sentinel + 1; i < last_position - 1; ++i) {
IntervalVar* const interval = RankedInterval(i);
IntervalVar* const next_interval = RankedInterval(i + 1);
DCHECK(interval->MustBePerformed());
DCHECK(next_interval->MustBePerformed());
IntVar* const slack = RankedSlack(i);
const int64 transition_time = RankedTransitionTime(i, i + 1);
next_interval->SetStartRange(