fix over propagation in element == cst

This commit is contained in:
lperron@google.com
2012-06-11 14:24:25 +00:00
parent 78d6818aad
commit dbdfd662e9

View File

@@ -1212,18 +1212,14 @@ class IntExprArrayElementCstCt : public Constraint {
this,
&IntExprArrayElementCstCt::PropagateIndex,
"PropagateIndex");
index_->WhenDomain(index_demon);
index_->WhenBound(index_demon);
}
virtual void InitialPropagate() {
for (int i = 0; i < size_; ++i) {
if (!index_->Contains(i)) {
vars_[i]->RemoveValue(target_);
}
if (!vars_[i]->Contains(target_)) {
index_->RemoveValue(i);
} else if (vars_[i]->Bound()) {
index_->SetValue(i);
demons_[i]->inhibit(solver());
}
}
if (index_->Bound()) {
@@ -1232,10 +1228,6 @@ class IntExprArrayElementCstCt : public Constraint {
}
void Propagate(int index) {
if (vars_[index]->Bound() && vars_[index]->Min() == target_) {
index_->SetValue(index);
}
if (!vars_[index]->Contains(target_)) {
index_->RemoveValue(index);
demons_[index]->inhibit(solver());
@@ -1243,25 +1235,6 @@ class IntExprArrayElementCstCt : public Constraint {
}
void PropagateIndex() {
const int64 oldmax = index_->OldMax();
const int64 vmin = index_->Min();
const int64 vmax = index_->Max();
for (int64 value = index_->OldMin(); value < vmin; ++value) {
vars_[value]->RemoveValue(target_);
demons_[value]->inhibit(solver());
}
for (index_iterator_->Init();
index_iterator_->Ok();
index_iterator_->Next()) {
const int64 value = index_iterator_->Value();
vars_[value]->RemoveValue(target_);
demons_[value]->inhibit(solver());
}
for (int64 value = vmax + 1; value <= oldmax; ++value) {
vars_[value]->RemoveValue(target_);
demons_[value]->inhibit(solver());
}
if (index_->Bound()) {
vars_[index_->Min()]->SetValue(target_);
}