added Range on IntAbs()
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user