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 reset();
00045 }
00046
00047 void
00048 operator()(const T& val)
00049 {
00050 if (! valued())
00051 min_ = max_ = val;
00052 else if (val < min_)
00053 min_ = val;
00054 else if (val > max_)
00055 max_ = val;
00056 ++count_;
00057 }
00058
00059 void
00060 reset()
00061 {
00062 count_ = 0;
00063 }
00064
00066 bool
00067 valued() const
00068 {
00069 return count_;
00070 }
00071
00073 size_t
00074 count() const
00075 {
00076 return count_;
00077 }
00078
00080 const T
00081 min() const
00082 {
00083 assertion(valued());
00084 return min_;
00085 }
00087 const T
00088 max() const
00089 {
00090 assertion(valued());
00091 return max_;
00092 }
00093
00094 protected:
00095 size_t count_;
00096 T min_;
00097 T max_;
00098 };
00099
00101 template< class T, class C = ntg::float_s >
00102 struct f_moments : f_minmax<T>
00103 {
00104 typedef f_minmax<T> super;
00105
00106 void
00107 operator()(const T& val)
00108 {
00109 if (! this->valued())
00110 {
00111 sum1_ = ntg_zero_val(C);
00112 sum2_ = ntg_zero_val(C);
00113 }
00114 else
00115 {
00116 sum1_ += val;
00117 sum2_ += C(val) * val;
00118 }
00119 super::operator()(val);
00120 }
00121
00123 const C
00124 mean() const
00125 {
00126 assertion(this->valued());
00127 return sum1_ / C(this->count());
00128 }
00130 const C
00131 variance() const
00132 {
00133 assertion(this->valued());
00134 return sum2_ / C(this->count()) - mean() * mean();
00135 }
00136
00137 protected:
00138 C sum1_;
00139 C sum2_;
00140 };
00141
00142 }
00143
00144 }
00145
00146 #endif // ! OLENA_STAT_HISTOGRAM_HH