40class HistogramStatistic :
public Statistic<BinDataType>
43 SST_ELI_DECLARE_STATISTIC_TEMPLATE(
47 SST_ELI_ELEMENT_VERSION(1, 0, 0),
48 "Track distribution of statistic across bins",
62 BaseComponent* comp,
const std::string& statName,
const std::string& statSubId,
Params& statParams) :
66 std::vector<std::string> allowedKeySet;
67 allowedKeySet.push_back(
"minvalue");
68 allowedKeySet.push_back(
"binwidth");
69 allowedKeySet.push_back(
"numbins");
70 allowedKeySet.push_back(
"dumpbinsonoutput");
71 allowedKeySet.push_back(
"includeoutofbounds");
72 statParams.pushAllowedKeys(allowedKeySet);
75 m_minValue = statParams.find<BinDataType>(
"minvalue", 0);
76 m_binWidth = statParams.find<NumBinsType>(
"binwidth", 5000);
77 m_numBins = statParams.find<NumBinsType>(
"numbins", 100);
78 m_dumpBinsOnOutput = statParams.find<
bool>(
"dumpbinsonoutput",
true);
79 m_includeOutOfBounds = statParams.find<
bool>(
"includeoutofbounds",
true);
86 m_itemsBinnedCount = 0;
87 this->setCollectionCount(0);
90 ~HistogramStatistic() {}
92 HistogramStatistic() :
96 virtual const std::string&
getStatTypeName()
const override {
return stat_type_; }
104 SST_SER(m_OOBMinCount);
105 SST_SER(m_OOBMaxCount);
106 SST_SER(m_itemsBinnedCount);
107 SST_SER(m_totalSummed);
108 SST_SER(m_totalSummedSqr);
110 SST_SER(m_dumpBinsOnOutput);
111 SST_SER(m_includeOutOfBounds);
123 if ( value < getBinsMinValue() ) {
127 if ( value > getBinsMaxValue() ) {
134 m_totalSummed += N * value;
135 m_totalSummedSqr += N * (value * value);
138 m_itemsBinnedCount++;
144 double calc1 = (double)value / (
double)m_binWidth;
145 double calc2 = floor(calc1);
146 double calc3 = m_binWidth * calc2;
147 BinDataType bin_start = (BinDataType)calc3;
151 HistoMapItr_t bin_itr = m_binsMap.find(bin_start);
154 if ( bin_itr == m_binsMap.end() ) {
156 m_binsMap.insert(std::pair<BinDataType, CountType>(bin_start, (CountType)N));
160 bin_itr->second += N;
168 NumBinsType getActiveBinCount() {
return m_binsMap.size(); }
171 NumBinsType getNumBins() {
return m_numBins; }
174 NumBinsType getBinWidth() {
return m_binWidth; }
180 CountType getBinCountByBinStart(BinDataType binStartValue)
183 HistoMapItr_t bin_itr = m_binsMap.find(binStartValue);
186 if ( bin_itr == m_binsMap.end() ) {
192 return m_binsMap[binStartValue];
200 BinDataType getBinsMinValue() {
return m_minValue; }
206 BinDataType getBinsMaxValue()
209 return (m_binWidth * m_numBins) + m_minValue - 1;
216 uint64_t getStatCollectionCount()
226 CountType getItemsBinnedCount()
229 return m_itemsBinnedCount;
236 BinDataType getValuesSummed() {
return m_totalSummed; }
242 BinDataType getValuesSquaredSummed() {
return m_totalSummedSqr; }
244 void clearStatisticData()
override
247 m_totalSummedSqr = 0;
250 m_itemsBinnedCount = 0;
252 this->setCollectionCount(0);
255 void registerOutputFields(StatisticFieldsOutput* statOutput)
override
258 m_Fields.push_back(statOutput->registerField<BinDataType>(
"BinsMinValue"));
259 m_Fields.push_back(statOutput->registerField<BinDataType>(
"BinsMaxValue"));
260 m_Fields.push_back(statOutput->registerField<NumBinsType>(
"BinWidth"));
261 m_Fields.push_back(statOutput->registerField<NumBinsType>(
"TotalNumBins"));
262 m_Fields.push_back(statOutput->registerField<BinDataType>(
"Sum"));
263 m_Fields.push_back(statOutput->registerField<BinDataType>(
"SumSQ"));
264 m_Fields.push_back(statOutput->registerField<NumBinsType>(
"NumActiveBins"));
265 m_Fields.push_back(statOutput->registerField<CountType>(
"NumItemsCollected"));
266 m_Fields.push_back(statOutput->registerField<CountType>(
"NumItemsBinned"));
268 if (
true == m_includeOutOfBounds ) {
269 m_Fields.push_back(statOutput->registerField<CountType>(
"NumOutOfBounds-MinValue"));
270 m_Fields.push_back(statOutput->registerField<CountType>(
"NumOutOfBounds-MaxValue"));
274 if (
true == m_dumpBinsOnOutput ) {
278 for ( uint32_t y = 0; y < getNumBins(); y++ ) {
280 binLL = (y * (uint64_t)getBinWidth()) + getBinsMinValue();
281 binUL = binLL + getBinWidth() - 1;
283 std::stringstream ss;
284 ss <<
"Bin" << y <<
":" << binLL <<
"-" << binUL;
285 m_Fields.push_back(statOutput->registerField<CountType>(ss.str().c_str()));
290 void outputStatisticFields(StatisticFieldsOutput* statOutput,
bool UNUSED(EndOfSimFlag))
override
292 StatisticOutput::fieldHandle_t x = 0;
293 statOutput->outputField(m_Fields[x++], getBinsMinValue());
294 statOutput->outputField(m_Fields[x++], getBinsMaxValue());
295 statOutput->outputField(m_Fields[x++], getBinWidth());
296 statOutput->outputField(m_Fields[x++], getNumBins());
297 statOutput->outputField(m_Fields[x++], getValuesSummed());
298 statOutput->outputField(m_Fields[x++], getValuesSquaredSummed());
299 statOutput->outputField(m_Fields[x++], getActiveBinCount());
300 statOutput->outputField(m_Fields[x++], getStatCollectionCount());
301 statOutput->outputField(m_Fields[x++], getItemsBinnedCount());
303 if (
true == m_includeOutOfBounds ) {
304 statOutput->outputField(m_Fields[x++], m_OOBMinCount);
305 statOutput->outputField(m_Fields[x++], m_OOBMaxCount);
309 if (
true == m_dumpBinsOnOutput ) {
310 BinDataType currentBinValue = getBinsMinValue();
311 for ( uint32_t y = 0; y < getNumBins(); y++ ) {
312 statOutput->outputField(m_Fields[x++], getBinCountByBinStart(currentBinValue));
314 currentBinValue += getBinWidth();
322 case StatisticBase::STAT_MODE_COUNT:
323 case StatisticBase::STAT_MODE_PERIODIC:
324 case StatisticBase::STAT_MODE_DUMP_AT_END:
334 using HistoMap_t = std::map<BinDataType, CountType>;
337 using HistoMapItr_t =
typename HistoMap_t::iterator;
340 BinDataType m_minValue;
343 NumBinsType m_binWidth;
346 NumBinsType m_numBins;
349 CountType m_OOBMinCount;
350 CountType m_OOBMaxCount;
354 CountType m_itemsBinnedCount;
358 BinDataType m_totalSummed;
362 BinDataType m_totalSummedSqr;
365 HistoMap_t m_binsMap;
368 std::vector<StatisticOutput::fieldHandle_t> m_Fields;
369 bool m_dumpBinsOnOutput;
370 bool m_includeOutOfBounds;
372 inline static const std::string stat_type_ =
"Histogram";