
Module: ppl/ppl Branch: floating_point Commit: 27853708a791db900a1c40ff490f5a5c630f9559 URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=27853708a791d...
Author: Fabio Bossi bossi@cs.unipr.it Date: Tue Sep 15 18:06:23 2009 +0200
Added a first, untested implementation of refine_fp_interval_abstract_store.
---
src/Octagonal_Shape.defs.hh | 5 ++++ src/Octagonal_Shape.templates.hh | 43 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 0 deletions(-)
diff --git a/src/Octagonal_Shape.defs.hh b/src/Octagonal_Shape.defs.hh index 1ed356b..536d9bc 100644 --- a/src/Octagonal_Shape.defs.hh +++ b/src/Octagonal_Shape.defs.hh @@ -47,6 +47,7 @@ site: http://www.cs.unipr.it/ppl/ . */ #include "Interval.types.hh" #include "Linear_Form.types.hh" #include <vector> +#include <map> #include <cstddef> #include <climits> #include <iosfwd> @@ -1696,6 +1697,10 @@ public: */ void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+ template <typename Interval_Info> + void refine_fp_interval_abstract_store( + std::map< dimension_type, Interval<T, Interval_Info> >& store); + //@} // Member Functions that May Modify the Dimension of the Vector Space
PPL_OUTPUT_DECLARATIONS diff --git a/src/Octagonal_Shape.templates.hh b/src/Octagonal_Shape.templates.hh index 46cf817..9251559 100644 --- a/src/Octagonal_Shape.templates.hh +++ b/src/Octagonal_Shape.templates.hh @@ -5231,6 +5231,49 @@ interval_coefficient_upper_bound(const N& var_ub, const N& minus_var_ub, }
template <typename T> +template <typename Interval_Info> +void +Octagonal_Shape<T>:: +refine_fp_interval_abstract_store( + std::map< dimension_type, Interval<T, Interval_Info> >& store) { + + // Check that T is a floating point type. + PPL_ASSERT(!std::numeric_limits<T>::is_exact); + + strong_closure_assign(); + + typedef Interval<T, Interval_Info> FP_Interval_Type; + typedef typename std::map<dimension_type, FP_Interval_Type>::iterator + Map_Iterator; + + PPL_DIRTY_TEMP(N, upper_bound); + Map_Iterator store_end = store.end(); + for (Map_Iterator ite = store.begin(); ite != store_end; ++ite) { + dimension_type curr_var = ite->first; + PPL_ASSERT(curr_var < space_dim); + dimension_type n_curr_var = curr_var * 2; + FP_Interval_Type& curr_int = &(ite->second); + T& lb = curr_int.lower(); + T& ub = curr_int.upper(); + // FIXME: are we sure that ROUND_IGNORE is good? + // Now get the upper bound for curr_var in the octagon. + assign_r(upper_bound, matrix[n_curr_var+1][n_curr_var], ROUND_NOT_NEEDED); + div_2exp_assign_r(upper_bound, upper_bound, 1, ROUND_IGNORE); + + if (upper_bound < ub) + ub = upper_bound; + + // Now get the lower bound for curr_var in the octagon. + neg_assign_r(upper_bound, matrix[n_curr_var][n_curr_var+1], + ROUND_NOT_NEEDED); + div_2exp_assign_r(upper_bound, upper_bound, 1, ROUND_IGNORE); + + if (upper_bound > lb) + lb = upper_bound; + } +} + +template <typename T> void Octagonal_Shape<T>::affine_preimage(const Variable var, const Linear_Expression& expr,