more robust optim of IsEqualCt and IsDifferentCt
This commit is contained in:
@@ -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_;
|
||||
|
||||
Reference in New Issue
Block a user