00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __DESCRIPTIVE_STATS_H__
00025 #define __DESCRIPTIVE_STATS_H__
00026 #include <Sequence/ensureFloating.hpp>
00027 #include <boost/static_assert.hpp>
00028 #include <boost/type_traits.hpp>
00029 #include <utility>
00030
00039 namespace Sequence
00040 {
00047 template<typename iterator>
00048 double mean(iterator beg, iterator end);
00049
00056 template<typename iterator>
00057 double variance(iterator beg, iterator end);
00058
00066 template<typename ForwardIterator>
00067 std::pair<double,double> meanAndVar(ForwardIterator beg,
00068 ForwardIterator end);
00069
00094 template< typename T >
00095 class Sums
00096 {
00097 public:
00098 typedef typename ensureFloating<T,T>::type floating_type;
00099
00100 BOOST_STATIC_ASSERT( (boost::is_convertible<T,floating_type>::value) );
00101 private:
00102 T __sum,__sumsq;
00103 unsigned __n;
00104 public:
00105 Sums();
00106 Sums<T> & operator+=(const T &);
00107 Sums<T> & operator+=(const Sums<T> &);
00108 const T & sum() const;
00109 const T & sumSquares() const;
00110 floating_type mean() const;
00111 floating_type variance() const;
00112 };
00113
00114 template<typename T>
00115 const Sums<T> operator+(const Sums<T> & lhs,const Sums<T> & rhs);
00116
00117 template<typename T>
00118 const Sums<T> operator+(const Sums<T> & lhs,const T & rhs);
00119
00120 }
00121 #include <Sequence/bits/descriptiveStats.tcc>
00122 #endif