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 #ifndef OLENA_UTILS_STAT_HH
00029 # define OLENA_UTILS_STAT_HH
00030
00031 # include <oln/basics.hh>
00032 # include <ntg/basics.hh>
00033
00034 namespace oln {
00035
00036 namespace utils {
00037
00039 template< class T >
00040 struct f_minmax : std::unary_function< const T&, void >
00041 {
00042 f_minmax() :
00043
00044
00045 min_(0), max_(0)
00046 {
00047 reset();
00048 }
00049
00050 void
00051 operator()(const T& val)
00052 {
00053 if (! valued())
00054 min_ = max_ = val;
00055 else if (val < min_)
00056 min_ = val;
00057 else if (val > max_)
00058 max_ = val;
00059 ++count_;
00060 }
00061
00062 void
00063 reset()
00064 {
00065 count_ = 0;
00066 }
00067
00069 bool
00070 valued() const
00071 {
00072 return count_;
00073 }
00074
00076 size_t
00077 count() const
00078 {
00079 return count_;
00080 }
00081
00083 const T
00084 min() const
00085 {
00086 assertion(valued());
00087 return min_;
00088 }
00090 const T
00091 max() const
00092 {
00093 assertion(valued());
00094 return max_;
00095 }
00096
00097 protected:
00098 size_t count_;
00099 T min_;
00100 T max_;
00101 };
00102
00104 template< class T, class C = ntg::float_s >
00105 struct f_moments : f_minmax<T>
00106 {
00107 f_moments() :
00108
00109
00110 f_minmax<T>(), sum1_(0), sum2_(0)
00111 {
00112 this->reset();
00113 }
00114
00115 typedef f_minmax<T> super;
00116
00117 void
00118 operator()(const T& val)
00119 {
00120 if (! this->valued())
00121 {
00122 sum1_ = ntg_zero_val(C);
00123 sum2_ = ntg_zero_val(C);
00124 }
00125 else
00126 {
00127 sum1_ += val;
00128 sum2_ += C(val) * val;
00129 }
00130 super::operator()(val);
00131 }
00132
00134 const C
00135 mean() const
00136 {
00137 assertion(this->valued());
00138 return sum1_ / C(this->count());
00139 }
00141 const C
00142 variance() const
00143 {
00144 assertion(this->valued());
00145 return sum2_ / C(this->count()) - mean() * mean();
00146 }
00147
00148 protected:
00149 C sum1_;
00150 C sum2_;
00151 };
00152
00153 }
00154
00155 }
00156
00157 #endif // ! OLENA_STAT_HISTOGRAM_HH