00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef _H_SST_CORE_STATS_HISTO
00014 #define _H_SST_CORE_STATS_HISTO
00015
00016 #include <sst/core/output.h>
00017 #include <sst/core/stats/basestats.h>
00018
00019 #include <stdint.h>
00020 #include <map>
00021
00022 using namespace std;
00023
00024 namespace SST {
00025 namespace Statistics {
00026
00027
00028
00029
00030
00031
00032
00033 template<class HistoBinType, class HistoCountType>
00034 class Histogram : public SST::Statistics::BaseStatistic {
00035 public:
00036
00037
00038
00039
00040 Histogram(const std::string name, HistoBinType binW) :
00041 BaseStatistic(name) {
00042
00043 totalSummed = 0;
00044 itemCount = 0;
00045 binWidth = binW;
00046 minVal = 0;
00047 maxVal = 0;
00048 }
00049
00050
00051
00052
00053
00054
00055 Histogram(const char* name, HistoBinType binW) :
00056 BaseStatistic(name) {
00057
00058 totalSummed = 0;
00059 itemCount = 0;
00060 binWidth = binW;
00061 minVal = 0;
00062 maxVal = 0;
00063 }
00064
00065
00066
00067
00068
00069 void add(HistoBinType value) {
00070 if(enabled) {
00071 HistoBinType bin_start = binWidth * (value / binWidth);
00072 histo_itr bin_itr = bins.find(bin_start);
00073
00074 if(bin_itr == bins.end()) {
00075 bins.insert(std::pair<HistoBinType, HistoCountType>(bin_start, (HistoCountType) 1));
00076 } else {
00077 bin_itr->second++;
00078 }
00079
00080 itemCount++;
00081 totalSummed += value;
00082
00083 if(1 == itemCount) {
00084 minVal = bin_start;
00085 maxVal = bin_start;
00086 } else {
00087 minVal = (minVal < bin_start) ? minVal : bin_start;
00088 maxVal = (maxVal > bin_start) ? maxVal : bin_start;
00089 }
00090 }
00091 }
00092
00093
00094
00095
00096 HistoCountType getBinCount() {
00097 return bins.size();
00098 }
00099
00100
00101
00102
00103 HistoBinType getBinWidth() {
00104 return binWidth;
00105 }
00106
00107
00108
00109
00110
00111 HistoCountType getBinCountByBinStart(HistoBinType v) {
00112 histo_itr bin_itr = bins.find(v);
00113
00114 if(bin_itr == bins.end()) {
00115 return (HistoCountType) 0;
00116 } else {
00117 return bins[v];
00118 }
00119 }
00120
00121
00122
00123
00124 HistoBinType getBinStart() {
00125 return minVal;
00126 }
00127
00128
00129
00130
00131 HistoBinType getBinEnd() {
00132 return maxVal + binWidth;
00133 }
00134
00135
00136
00137
00138
00139 HistoCountType getItemCount() {
00140 return itemCount;
00141 }
00142
00143
00144
00145
00146
00147 HistoBinType getValuesSummed() {
00148 return totalSummed;
00149 }
00150
00151
00152
00153
00154 typedef typename std::map<HistoBinType, HistoCountType>::iterator histo_itr;
00155
00156 private:
00157
00158
00159
00160 HistoBinType minVal;
00161
00162
00163
00164 HistoBinType maxVal;
00165
00166
00167
00168 HistoBinType binWidth;
00169
00170
00171
00172
00173 HistoBinType totalSummed;
00174
00175
00176
00177 HistoCountType itemCount;
00178
00179
00180
00181
00182 std::map<HistoBinType, HistoCountType> bins;
00183 };
00184
00185 }
00186 }
00187
00188 #endif