more robust optim of IsEqualCt and IsDifferentCt

This commit is contained in:
lperron@google.com
2012-09-06 11:52:01 +00:00
parent 567874af31
commit 5a3d03166e

View File

@@ -352,7 +352,10 @@ class IsEqualCt : public CastConstraint {
virtual void InitialPropagate() {
PropagateRange();
if (!target_var_->Bound() && left_->IsVar() && right_->IsVar()) {
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.
@@ -436,6 +439,10 @@ class IsEqualCt : public CastConstraint {
}
private:
bool IsInteresting(IntExpr* const e) const {
return e->IsVar() && e->Var()->Max() - e->Var()->Min() >= e->Var()->Size();
}
IntExpr* const left_;
IntExpr* const right_;
Demon* range_demon_;
@@ -474,7 +481,10 @@ class IsDifferentCt : public CastConstraint {
virtual void InitialPropagate() {
PropagateRange();
if (!target_var_->Bound() && left_->IsVar() && right_->IsVar()) {
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.
@@ -558,6 +568,10 @@ class IsDifferentCt : public CastConstraint {
}
private:
bool IsInteresting(IntExpr* const e) const {
return e->IsVar() && e->Var()->Max() - e->Var()->Min() >= e->Var()->Size();
}
IntExpr* const left_;
IntExpr* const right_;
Demon* range_demon_;