simplify IsEqualVar

This commit is contained in:
lperron@google.com
2013-07-14 04:22:33 +00:00
parent 8ba578c556
commit d5ba83df38

View File

@@ -338,11 +338,7 @@ class IsEqualCt : public CastConstraint {
virtual ~IsEqualCt() {}
virtual void Post() {
range_demon_ =
MakeConstraintDemon0(solver(),
this,
&IsEqualCt::PropagateRange,
"PropagateRange");
range_demon_ = solver()->MakeConstraintInitialPropagateCallback(this);
left_->WhenRange(range_demon_);
right_->WhenRange(range_demon_);
Demon* const target_demon =
@@ -354,37 +350,6 @@ class IsEqualCt : public CastConstraint {
}
virtual void InitialPropagate() {
PropagateRange();
if (!target_var_->Bound() &&
IsInteresting(left_) &&
IsInteresting(right_) &&
std::max(left_->Var()->Size(), right_->Var()->Size()) < 32) {
IntVar* const lv = left_->Var();
IntVar* const rv = right_->Var();
// Search for a support.
if (lv->Size() < rv->Size()) {
IntVarIterator* const it = lv->MakeDomainIterator(true);
for (it->Init(); it->Ok(); it->Next()) {
if (rv->Contains(it->Value())) {
return;
}
}
range_demon_->inhibit(solver());
target_var_->SetValue(0);
} else {
IntVarIterator* const it = rv->MakeDomainIterator(true);
for (it->Init(); it->Ok(); it->Next()) {
if (lv->Contains(it->Value())) {
return;
}
}
range_demon_->inhibit(solver());
target_var_->SetValue(0);
}
}
}
void PropagateRange() {
if (target_var_->Bound()) {
PropagateTarget();
return;
@@ -411,12 +376,20 @@ class IsEqualCt : public CastConstraint {
if (target_var_->Min() == 0) {
if (left_->Bound()) {
range_demon_->inhibit(solver());
solver()->AddConstraint(
solver()->MakeNonEquality(right_, left_->Min()));
if (right_->IsVar()) {
right_->Var()->RemoveValue(left_->Min());
} else {
solver()->AddConstraint(
solver()->MakeNonEquality(right_, left_->Min()));
}
} else if (right_->Bound()) {
range_demon_->inhibit(solver());
solver()->AddConstraint(
solver()->MakeNonEquality(left_, right_->Min()));
if (left_->IsVar()) {
left_->Var()->RemoveValue(right_->Min());
} else {
solver()->AddConstraint(
solver()->MakeNonEquality(left_, right_->Min()));
}
}
} else { // Var is true.
left_->SetRange(right_->Min(), right_->Max());