[PPL-devel] [GIT] ppl/ppl(master): Improved the relation_with(Congruence) implementation for the weakly relational domains.
Patricia Hill
p.m.hill at leeds.ac.uk
Mon May 18 12:38:11 CEST 2009
Module: ppl/ppl
Branch: master
Commit: b827904975bbeff4079fbb5aedf66a3ac4cb8e30
URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=b827904975bbeff4079fbb5aedf66a3ac4cb8e30
Author: Patricia Hill <p.m.hill at leeds.ac.uk>
Date: Mon May 18 11:26:03 2009 +0100
Improved the relation_with(Congruence) implementation for the weakly relational domains.
---
src/BD_Shape.templates.hh | 61 ++++++++++++++++++++++++++++++-------
src/Octagonal_Shape.templates.hh | 58 ++++++++++++++++++++++++++++-------
2 files changed, 95 insertions(+), 24 deletions(-)
diff --git a/src/BD_Shape.templates.hh b/src/BD_Shape.templates.hh
index eeafd27..819b99e 100644
--- a/src/BD_Shape.templates.hh
+++ b/src/BD_Shape.templates.hh
@@ -1209,8 +1209,8 @@ BD_Shape<T>::relation_with(const Congruence& cg) const {
if (cg.space_dimension() > space_dim)
throw_dimension_incompatible("relation_with(cg)", cg);
- // If the congruence is a bounded difference equality,
- // find the relation with the equivalent equality constraint.
+ // If the congruence is an equality, find the relation with
+ // the equivalent equality constraint.
if (cg.is_equality()) {
Constraint c(cg);
return relation_with(c);
@@ -1231,26 +1231,63 @@ BD_Shape<T>::relation_with(const Congruence& cg) const {
&& Poly_Con_Relation::is_included();
}
- // FIXME: add proper comments to the following.
+ // Find the lower bound for a hyperplane with direction
+ // defined by the congruence.
Linear_Expression le = Linear_Expression(cg);
PPL_DIRTY_TEMP_COEFFICIENT(min_num);
PPL_DIRTY_TEMP_COEFFICIENT(min_den);
bool min_included;
bool bounded_below = minimize(le, min_num, min_den, min_included);
+ // If there is no lower bound, then some of the hyperplanes defined by
+ // the congruence will strictly intersect the shape.
if (!bounded_below)
return Poly_Con_Relation::strictly_intersects();
- PPL_DIRTY_TEMP_COEFFICIENT(value);
- value = min_num / min_den;
- const Coefficient& modulus = cg.modulus();
+ // TODO: Consider adding a max_and_min() method, performing both
+ // maximization and minimization so as to possibly exploit
+ // incrementality of the MIP solver.
+
+ // Find the upper bound for a hyperplane with direction
+ // defined by the congruence.
+ PPL_DIRTY_TEMP_COEFFICIENT(max_num);
+ PPL_DIRTY_TEMP_COEFFICIENT(max_den);
+ bool max_included;
+ bool bounded_above = maximize(le, max_num, max_den, max_included);
+
+ // If there is no upper bound, then some of the hyperplanes defined by
+ // the congruence will strictly intersect the shape.
+ if (!bounded_above)
+ return Poly_Con_Relation::strictly_intersects();
+
PPL_DIRTY_TEMP_COEFFICIENT(signed_distance);
- signed_distance = value % modulus;
- value -= signed_distance;
- if (value * min_den < min_num)
- value += modulus;
- Constraint c(le == value);
- return relation_with(c);
+
+ // Find the position value for the hyperplane that satisfies the congruence
+ // and is above the lower bound for the shape.
+ PPL_DIRTY_TEMP_COEFFICIENT(min_value);
+ min_value = min_num / min_den;
+ const Coefficient& modulus = cg.modulus();
+ signed_distance = min_value % modulus;
+ min_value -= signed_distance;
+ if (min_value * min_den < min_num)
+ min_value += modulus;
+
+ // Find the position value for the hyperplane that satisfies the congruence
+ // and is below the upper bound for the shape.
+ PPL_DIRTY_TEMP_COEFFICIENT(max_value);
+ max_value = max_num / max_den;
+ signed_distance = max_value % modulus;
+ max_value += signed_distance;
+ if (max_value * max_den > max_num)
+ max_value -= modulus;
+
+ // If the upper bound value is less than the lower bound value,
+ // then there is an empty intersection with the congruence;
+ // otherwise it will strictly intersect.
+ if (max_value < min_value)
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::strictly_intersects();
}
diff --git a/src/Octagonal_Shape.templates.hh b/src/Octagonal_Shape.templates.hh
index de6bab5..4d46ac7 100644
--- a/src/Octagonal_Shape.templates.hh
+++ b/src/Octagonal_Shape.templates.hh
@@ -1214,29 +1214,63 @@ Octagonal_Shape<T>::relation_with(const Congruence& cg) const {
&& Poly_Con_Relation::is_included();
}
- // FIXME: the following code has to be checked and improved.
- // Add comment to explain what we are doing and why.
+ // Find the lower bound for a hyperplane with direction
+ // defined by the congruence.
Linear_Expression le = Linear_Expression(cg);
PPL_DIRTY_TEMP_COEFFICIENT(min_num);
PPL_DIRTY_TEMP_COEFFICIENT(min_den);
bool min_included;
bool bounded_below = minimize(le, min_num, min_den, min_included);
+ // If there is no lower bound, then some of the hyperplanes defined by
+ // the congruence will strictly intersect the shape.
if (!bounded_below)
return Poly_Con_Relation::strictly_intersects();
- // FIXME: specify rounding mode.
- PPL_DIRTY_TEMP_COEFFICIENT(value);
- value = min_num / min_den;
+ // TODO: Consider adding a max_and_min() method, performing both
+ // maximization and minimization so as to possibly exploit
+ // incrementality of the MIP solver.
+
+ // Find the upper bound for a hyperplane with direction
+ // defined by the congruence.
+ PPL_DIRTY_TEMP_COEFFICIENT(max_num);
+ PPL_DIRTY_TEMP_COEFFICIENT(max_den);
+ bool max_included;
+ bool bounded_above = maximize(le, max_num, max_den, max_included);
+
+ // If there is no upper bound, then some of the hyperplanes defined by
+ // the congruence will strictly intersect the shape.
+ if (!bounded_above)
+ return Poly_Con_Relation::strictly_intersects();
- const Coefficient& modulus = cg.modulus();
PPL_DIRTY_TEMP_COEFFICIENT(signed_distance);
- signed_distance = value % modulus;
- value -= signed_distance;
- if (value * min_den < min_num)
- value += modulus;
- Constraint c(le == value);
- return relation_with(c);
+
+ // Find the position value for the hyperplane that satisfies the congruence
+ // and is above the lower bound for the shape.
+ PPL_DIRTY_TEMP_COEFFICIENT(min_value);
+ min_value = min_num / min_den;
+ const Coefficient& modulus = cg.modulus();
+ signed_distance = min_value % modulus;
+ min_value -= signed_distance;
+ if (min_value * min_den < min_num)
+ min_value += modulus;
+
+ // Find the position value for the hyperplane that satisfies the congruence
+ // and is below the upper bound for the shape.
+ PPL_DIRTY_TEMP_COEFFICIENT(max_value);
+ max_value = max_num / max_den;
+ signed_distance = max_value % modulus;
+ max_value += signed_distance;
+ if (max_value * max_den > max_num)
+ max_value -= modulus;
+
+ // If the upper bound value is less than the lower bound value,
+ // then there is an empty intersection with the congruence;
+ // otherwise it will strictly intersect.
+ if (max_value < min_value)
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::strictly_intersects();
}
template <typename T>
More information about the PPL-devel
mailing list