
Module: ppl/ppl Branch: master Commit: ca8d1bde6507d75322f7855f61ca2c24c0a6f4e6 URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=ca8d1bde6507d...
Author: Fabio Bossi bossi@cs.unipr.it Date: Mon May 9 18:47:30 2011 +0200
Improved the documentation and removed an useless function.
---
src/Interval.defs.hh | 5 -- src/Interval.inlines.hh | 11 ----- src/Linear_Form.defs.hh | 71 +++++++++++++++--------------- src/Linear_Form.templates.hh | 6 +- tests/Concrete_Expression/linearform1.cc | 20 ++++++++ 5 files changed, 59 insertions(+), 54 deletions(-)
diff --git a/src/Interval.defs.hh b/src/Interval.defs.hh index 9d0d241..a9d8ffd 100644 --- a/src/Interval.defs.hh +++ b/src/Interval.defs.hh @@ -56,11 +56,6 @@ struct Is_Singleton : public Is_Native_Or_Checked<T> {}; template <typename T> struct Is_Interval : public Is_Same_Or_Derived<Interval_Base, T> {};
-// FIXME: This has been added as a workaraound. -template <typename From> -typename Enable_If<Is_Interval<From>::value, I_Result>::type -neg_assign(From& x); - //! A generic, not necessarily closed, possibly restricted interval. /*! \ingroup PPL_CXX_interface The class template type parameter \p Boundary represents the type diff --git a/src/Interval.inlines.hh b/src/Interval.inlines.hh index a6936a1..2fdba70 100644 --- a/src/Interval.inlines.hh +++ b/src/Interval.inlines.hh @@ -26,17 +26,6 @@ site: http://www.cs.unipr.it/ppl/ . */
namespace Parma_Polyhedra_Library {
-template <typename From> -typename Enable_If<Is_Interval<From>::value, I_Result>::type -neg_assign(From& x) { - // FIXME: Avoid the creation of a temporary. - From y; - typename Enable_If<Is_Interval<From>::value, I_Result>::type res = - y.neg_assign(x); - x = y; - return res; -} - template <typename Boundary, typename Info> inline memory_size_type Interval<Boundary, Info>::external_memory_in_bytes() const { diff --git a/src/Linear_Form.defs.hh b/src/Linear_Form.defs.hh index 0316301..658fdc2 100644 --- a/src/Linear_Form.defs.hh +++ b/src/Linear_Form.defs.hh @@ -212,9 +212,9 @@ void swap(Parma_Polyhedra_Library::Linear_Form<C>& x,
} // namespace std
-//! A linear form. +//! A linear form with interval coefficients. /*! \ingroup PPL_CXX_interface - An object of the class Linear_Form represents the linear form + An object of the class Linear_Form represents the interval linear form \f[ \sum_{i=0}^{n-1} a_i x_i + b \f] @@ -222,43 +222,44 @@ void swap(Parma_Polyhedra_Library::Linear_Form<C>& x, each \f$a_i\f$ is the coefficient of the \f$i\f$-th variable \f$x_i\f$ and \f$b\f$ is the inhomogeneous term. - The coefficiens and the inhomogeneous terms of the linear form - are element of the template parameter \p C. - - \par How to build a linear form. - - A full set of functions is defined to provide a convenient interface - for building complex linear forms starting from simpler ones - and from objects of the classes Variable and \p C: - available operators include unary negation, - binary addition and subtraction, - as well as multiplication by a Coefficient. - The space dimension of a linear form is defined as the maximum - space dimension of the arguments used to build it: - in particular, the space dimension of a Variable <CODE>x</CODE> - is defined as <CODE>x.id()+1</CODE>, - whereas all the objects of the class \p C have space dimension zero. - - FIXME: the following needs rewriting. + The coefficients and the inhomogeneous term of the linear form + have the template parameter \p C as their type. \p C must be the + type of an Interval. + + \par How to build a linear form. + A full set of functions is defined in order to provide a convenient + interface for building complex linear forms starting from simpler ones + and from objects of the classes Variable and \p C. Available operators + include binary addition and subtraction, as well as multiplication and + division by a coefficient. + The space dimension of a linear form is defined as + the highest variable dimension among variables that have a nonzero + coefficient in the linear form, or zero if no such variable exists. + The space dimension for each variable \f$x_i\f$ is given by \f$i + 1\f$.
\par Example - The following code builds the linear form \f$4x - 2y - z + 14\f$, - having space dimension \f$3\f$: - \code - Linear_Form e = 4*x - 2*y - z + 14; - \endcode - Another way to build the same linear form is: + Given the type \p T of an Interval with floating point coefficients (though + any integral type may also be used), the following code builds the interval + linear form \f$lf = x_5 - x_2 + 1\f$ with space dimension 6: \code - Linear_Form e1 = 4*x; - Linear_Form e2 = 2*y; - Linear_Form e3 = z; - Linear_Form e = Linear_Form(14); - e += e1 - e2 - e3; + Variable x5(5); + Variable x2(2); + T x5_coefficient; + x5_coefficient.lower() = 2.0; + x5_coefficient.upper() = 3.0; + T inhomogeneous_term; + inhomogeneous_term.lower() = 4.0; + inhomogeneous_term.upper() = 8.0; + Linear_Form<T> lf(x2); + lf = -lf; + lf += Linear_Form<T>(x2); + Linear_Form<T> lx5(x5); + lx5 *= x5_coefficient; + lf += lx5; \endcode - Note that \p e1, \p e2 and \p e3 have space dimension 1, 2 and 3, - respectively; also, in the fourth line of code, \p e is created - with space dimension zero and then extended to space dimension 3 - in the fifth line. + Note that \p lx5 is created with space dimension 6, while \p lf is created + with space dimension 0 and then extended first to space dimension 2 when x2 + is subtracted and finally to space dimension 6 when lx5 is added. */ template <typename C> class Parma_Polyhedra_Library::Linear_Form { diff --git a/src/Linear_Form.templates.hh b/src/Linear_Form.templates.hh index 1dffd6e..0621ff5 100644 --- a/src/Linear_Form.templates.hh +++ b/src/Linear_Form.templates.hh @@ -148,7 +148,7 @@ Linear_Form<C> operator-(const Linear_Form<C>& f) { Linear_Form<C> r(f); for (dimension_type i = f.size(); i-- > 0; ) - neg_assign(r[i]); + r[i].neg_assign(r[i]); return r; }
@@ -230,7 +230,7 @@ Linear_Form<C> operator-(const C& n, const Linear_Form<C>& f) { Linear_Form<C> r(f); for (dimension_type i = f.size(); i-- > 0; ) - neg_assign(r[i]); + r[i].neg_assign(r[i]); r[0] += n; return r; } @@ -356,7 +356,7 @@ template <typename C> void Linear_Form<C>::negate() { for (dimension_type i = vec.size(); i-- > 0; ) - neg_assign(vec[i]); + vec[i].neg_assign(vec[i]); return; }
diff --git a/tests/Concrete_Expression/linearform1.cc b/tests/Concrete_Expression/linearform1.cc index d89a656..0ac4381 100644 --- a/tests/Concrete_Expression/linearform1.cc +++ b/tests/Concrete_Expression/linearform1.cc @@ -307,6 +307,25 @@ test09() { return ok1 && ok2 && ok3; }
+bool +test10() { + Variable x5(5); + Variable x2(2); + FP_Interval x5_coefficient; + x5_coefficient.lower() = 2.0; + x5_coefficient.upper() = 3.0; + FP_Interval inhomogeneous_term; + inhomogeneous_term.lower() = 4.0; + inhomogeneous_term.upper() = 8.0; + FP_Linear_Form lf(x2); + lf = -lf; + lf += FP_Linear_Form(x2); + FP_Linear_Form lx5(x5); + lx5 *= x5_coefficient; + lf += lx5; + return lf.space_dimension() == 6; +} + } // namespace
BEGIN_MAIN @@ -319,4 +338,5 @@ BEGIN_MAIN DO_TEST(test07); DO_TEST(test08); DO_TEST(test09); + DO_TEST(test10); END_MAIN