Program Listing for File cumulative_statistics.hpp
↰ Return to documentation for file (include/ecl/statistics/cumulative_statistics.hpp
)
/*****************************************************************************
** Ifdefs
*****************************************************************************/
#ifndef ecl_statistics_CUMULATIVE_STATISTICS_HPP_
#define ecl_statistics_CUMULATIVE_STATISTICS_HPP_
/*****************************************************************************
** Includes
*****************************************************************************/
#include <ecl/mpl.hpp>
#include <ecl/type_traits.hpp>
/*****************************************************************************
** Namespaces
*****************************************************************************/
namespace ecl {
/*****************************************************************************
** Interfaces
*****************************************************************************/
template <typename T, typename Enable = void>
class CumulativeStatistics : public ecl::FailedObject {};
template <typename T>
class CumulativeStatistics<T, typename ecl::enable_if< ecl::is_float<T> >::type> {
public:
CumulativeStatistics(): number_of_data(0.0) {}
void clear() { number_of_data = 0.0; }
void push_back(const T & x)
{
number_of_data++;
if(number_of_data == 1.0)
{
old_mean = new_mean = x;
old_variance = 0.0;
}
else
{
new_mean = old_mean + static_cast<T>(x - old_mean) / static_cast<T>(number_of_data);
new_variance = old_variance + static_cast<T>(x - old_mean) * static_cast<T>(x - new_mean);
old_mean = new_mean;
old_variance = new_variance;
}
}
T size() const { return static_cast<T>(number_of_data); }
T mean() const { return (number_of_data > 0) ? new_mean : 0.0; }
T variance() const { return ((number_of_data > 1) ? new_variance / (number_of_data - 1) : 0.0); }
private:
T number_of_data;
T old_mean, old_variance;
T new_mean, new_variance;
};
/*****************************************************************************
** Trailers
*****************************************************************************/
} // namespace ecl
#endif /* ecl_statistics_CUMULATIVE_STATISTICS_HPP_ */