From ff79a72cc24d3723247501abd496babf34b2be24 Mon Sep 17 00:00:00 2001 From: "lperron@google.com" Date: Fri, 7 Sep 2012 11:52:55 +0000 Subject: [PATCH] added Range on IntAbs() --- src/constraint_solver/expressions.cc | 64 ++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 17 deletions(-) diff --git a/src/constraint_solver/expressions.cc b/src/constraint_solver/expressions.cc index 4e45f42264..9125cf0579 100644 --- a/src/constraint_solver/expressions.cc +++ b/src/constraint_solver/expressions.cc @@ -3441,6 +3441,20 @@ class SubIntExpr : public BaseIntExpr { right_->SetMax(left_->Max() - m); } + virtual int64 Max() const { + return left_->Max() - right_->Min(); + } + + virtual void SetMax(int64 m) { + left_->SetMax(m + right_->Max()); + right_->SetMin(left_->Min() - m); + } + + virtual void Range(int64* mi, int64* ma) { + *mi = left_->Min() - right_->Max(); + *ma = left_->Max() - right_->Min(); + } + virtual void SetRange(int64 l, int64 u) { const int64 left_min = left_->Min(); const int64 right_min = right_->Min(); @@ -3456,15 +3470,6 @@ class SubIntExpr : public BaseIntExpr { } } - virtual int64 Max() const { - return left_->Max() - right_->Min(); - } - - virtual void SetMax(int64 m) { - left_->SetMax(m + right_->Max()); - right_->SetMin(left_->Min() - m); - } - virtual bool Bound() const { return (left_->Bound() && right_->Bound()); } @@ -3532,6 +3537,11 @@ class SafeSubIntExpr : public SubIntExpr { } } + virtual void Range(int64* mi, int64* ma) { + *mi = CapSub(left_->Min(), right_->Max()); + *ma = CapSub(left_->Max(), right_->Min()); + } + virtual int64 Max() const { return CapSub(left_->Max(), right_->Min()); } @@ -4687,8 +4697,9 @@ class IntAbs : public BaseIntExpr { virtual ~IntAbs() {} virtual int64 Min() const { - const int64 emin = expr_->Min(); - const int64 emax = expr_->Max(); + int64 emin = 0; + int64 emax = 0; + expr_->Range(&emin, &emax); if (emin >= 0) { return emin; } @@ -4699,8 +4710,9 @@ class IntAbs : public BaseIntExpr { } virtual void SetMin(int64 m) { - const int64 emin = expr_->Min(); - const int64 emax = expr_->Max(); + int64 emin = 0; + int64 emax = 0; + expr_->Range(&emin, &emax); if (emin >= 0) { expr_->SetMin(m); } else if (emax <= 0) { @@ -4709,8 +4721,9 @@ class IntAbs : public BaseIntExpr { } virtual int64 Max() const { - const int64 emin = expr_->Min(); - const int64 emax = expr_->Max(); + int64 emin = 0; + int64 emax = 0; + expr_->Range(&emin, &emax); if (emin >= 0) { return emax; } @@ -4726,8 +4739,9 @@ class IntAbs : public BaseIntExpr { virtual void SetRange(int64 mi, int64 ma) { expr_->SetRange(-ma, ma); - const int64 emin = expr_->Min(); - const int64 emax = expr_->Max(); + int64 emin = 0; + int64 emax = 0; + expr_->Range(&emin, &emax); if (emin >= 0) { expr_->SetMin(mi); } else if (emax <= 0) { @@ -4735,6 +4749,22 @@ class IntAbs : public BaseIntExpr { } } + virtual void Range(int64* mi, int64 *ma) { + int64 emin = 0; + int64 emax = 0; + expr_->Range(&emin, &emax); + if (emin >= 0) { + *mi = emin; + *ma = emax; + } else if (emax <= 0) { + *mi = -emax; + *ma = -emin; + } else { + *mi = 0; + *ma = std::max(-emin, emax); + } + } + virtual bool Bound() const { return expr_->Bound(); }