00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #if !defined(__STATISTI_H)
00035 #define __STATISTI_H
00036
00037
00038 #include <iostream>
00039
00040 #include <boost/type_traits.hpp>
00041
00042 #include "mcmc++/ratio.h"
00043
00044
00045 namespace keh {
00046
00047
00048
00049 template <bool U, class T>
00050 class Accumulate;
00051
00052
00053
00054
00055
00056
00057 template <class T>
00058 class Accumulate<false, T> {
00059 public:
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071 Accumulate(std::vector<T>& x, double& sum, double& sumsq,
00072 unsigned long& n)
00073 {
00074 sum = sumsq = 0.0;
00075 typedef typename std::vector<T>::const_iterator iter;
00076 iter begin = x.begin();
00077 iter end = x.end();
00078 for (iter i = begin; i != end; ++i) {
00079 double value = **i;
00080 sum += value;
00081 sumsq += sqr(value);
00082 }
00083 n = x.size();
00084 }
00085 private:
00086 static double sqr(const double x) {
00087 return x*x;
00088 }
00089 };
00090
00091
00092
00093 template <class T>
00094 class Accumulate<true, T> {
00095 public:
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107 Accumulate(std::vector<T>& x, double& sum, double& sumsq,
00108 unsigned long& n)
00109 {
00110 n = x.size();
00111 sum = sumsq = 0.0;
00112 typedef typename std::vector<T>::const_iterator iter;
00113 iter end = x.end();
00114 for (iter i = x.begin(); i != end; ++i) {
00115 double value = *i;
00116 sum += value;
00117 sumsq += sqr(value);
00118 }
00119 }
00120 private:
00121 static double sqr(const double x) {
00122 return x*x;
00123 }
00124
00125 };
00126
00127 }
00128
00129 class Statistic {
00130 double sum;
00131 double lsum;
00132 double sumSq;
00133 double lsumSq;
00134 double mean;
00135 double variance;
00136 double stddev;
00137 double cv;
00138 long n;
00139 int dirty;
00140 void CalcMean(void);
00141 void CalcVariance(void);
00142 void CalcStdDev(void) {
00143 stddev = (variance <= 0.0 ? 0.0 : sqrt(variance));
00144 }
00145 void CalcCV(void) {
00146 cv = (mean == 0.0 ? 0.0 : stddev/mean);
00147 }
00148 void CalcAll(void);
00149
00150 public:
00151 Statistic(void);
00152 void Add(double);
00153 void Add(ratio);
00154
00155
00156 long N(void) {
00157 return n;
00158 }
00159
00160
00161 double Sum(void) {
00162 return sum;
00163 }
00164
00165
00166 double SumSq(void) {
00167 return sumSq;
00168 }
00169 double Mean(void);
00170 double Variance(void);
00171 double StdDev(void);
00172 double CV(void);
00173 Statistic& operator +=(double v);
00174 Statistic& operator +=(ratio r);
00175 friend std::ostream& operator <<(std::ostream&, Statistic&);
00176 };
00177
00178 class SimpleStatistic {
00179 public:
00180 SimpleStatistic(void);
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194 template <class T>
00195 SimpleStatistic(std::vector<T>& x) {
00196 keh::Accumulate<boost::is_arithmetic<T>::value, T>
00197 stats(x, sum_, sumsq_, n_);
00198 }
00199 void Add(double x);
00200 double Mean(void) const;
00201 double Variance(void) const;
00202 double StdDev(void) const;
00203 void Clear(void);
00204
00205 private:
00206 double sqr(const double x) const;
00207
00208 double sum_;
00209 double sumsq_;
00210 unsigned long n_;
00211
00212 };
00213
00214 #endif
00215
00216
00217
00218