/** 
 * @file
 * @author (C) 2005 Vassilii Khachaturov <vassilii@tarunz.org>, under GPLv2
 * @brief A trivial statistics accumulator.
 * @version $Id: stats.h,v 1.8 2006/06/05 07:50:18 vassilii Exp $
 */

/// Statistics accumulated over an incrementally-fed dataset
template <typename NUM> class Stats {
	long _n;
	NUM _m1, _m2;

	public:
		Stats() : _n(0), _m1(0), _m2(0) {}

		/// Add a datum
		void add(NUM x)
		{
			long n_1 = _n++;

			_m1 *= n_1;
			_m1 += x;
			_m1 /= _n;

			_m2 *= n_1;
			_m2 += x*x;
			_m2 /= _n;
		}

		long n() const { return _n;} ///< size of the data set
		NUM mean() const { return _m1; } ///< mean
		NUM var() const { return _m2 - _m1*_m1; } ///< variance
};

template <typename NUM>
std::ostream& operator<<(std::ostream& o, Stats<NUM> stats)
{ return o << '(' << stats.mean() << ", " << sqrt(stats.var()) << ')'; }
