
Module: ppl/ppl Branch: floating_point Commit: 2407bd5aa082844784918b237282e7cf3ed94f61 URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=2407bd5aa0828...
Author: Fabio Bossi bossi@cs.unipr.it Date: Wed Sep 29 14:00:23 2010 +0200
Implemented export_interval_constraints.
---
src/BD_Shape.defs.hh | 33 +++++++++++++++++++++++++++++++++ src/BD_Shape.templates.hh | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 0 deletions(-)
diff --git a/src/BD_Shape.defs.hh b/src/BD_Shape.defs.hh index 3413c35..0ad832c 100644 --- a/src/BD_Shape.defs.hh +++ b/src/BD_Shape.defs.hh @@ -1037,6 +1037,39 @@ public: const Linear_Form< Interval<T, Interval_Info> >& left, const Linear_Form< Interval<T, Interval_Info> >& right);
+ //! Applies to \p dest the interval constraints embedded in \p *this. + /*! + \param dest + The object to which the constraints will be added. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with \p dest. + + The template type parameter U must provide the following methods. + \code + dimension_type space_dimension() const + \endcode + returns the space dimension of the object. + \code + void set_empty() + \endcode + sets the object to an empty object. + \code + bool restrict_lower(dimension_type dim, const T& lb) + \endcode + restricts the object by applying the lower bound \p lb to the space + dimension \p dim and returns <CODE>false</CODE> if and only if the + object becomes empty. + \code + bool restrict_upper(dimension_type dim, const T& ub) + \endcode + restricts the object by applying the upper bound \p ub to the space + dimension \p dim and returns <CODE>false</CODE> if and only if the + object becomes empty. + */ + template <typename U> + void export_interval_constraints(U& dest) const; + /*! \brief Computes the \ref Cylindrification "cylindrification" of \p *this with respect to space dimension \p var, assigning the result to \p *this. diff --git a/src/BD_Shape.templates.hh b/src/BD_Shape.templates.hh index bbb5e1b..57e0672 100644 --- a/src/BD_Shape.templates.hh +++ b/src/BD_Shape.templates.hh @@ -4479,6 +4479,44 @@ void BD_Shape<T>::refine_with_linear_form_inequality( } // end of refine_with_linear_form_inequality
template <typename T> +template <typename U> +void +BD_Shape<T> +::export_interval_constraints(U& dest) const { + const dimension_type space_dim = space_dimension(); + if (space_dim > dest.space_dimension()) + throw std::invalid_argument( + "BD_Shape<T>::export_interval_constraints"); + + // Expose all the interval constraints. + shortest_path_closure_assign(); + + if (is_empty()) { + dest.set_empty(); + PPL_ASSERT(OK()); + return; + } + + PPL_DIRTY_TEMP(N, tmp); + const DB_Row<N>& dbm_0 = dbm[0]; + for (dimension_type i = space_dim; i-- > 0; ) { + // Set the upper bound. + const N& u = dbm_0[i+1]; + if (!is_plus_infinity(u)) + dest.restrict_upper(i, u.raw_value()); + + // Set the lower bound. + const N& negated_l = dbm[i+1][0]; + if (!is_plus_infinity(negated_l)) { + neg_assign_r(tmp, negated_l, ROUND_DOWN); + dest.restrict_lower(i, negated_l.raw_value()); + } + } + + PPL_ASSERT(OK()); +} + +template <typename T> template <typename Interval_Info> void BD_Shape<T>::left_inhomogeneous_refine(const dimension_type& right_t,