Program Listing for File cumulative_statistics.hpp

Return to documentation for file (/tmp/ws/src/ecl_core/ecl_statistics/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_ */