12 #ifndef SST_CORE_STATAPI_STATHISTOGRAM_H 13 #define SST_CORE_STATAPI_STATHISTOGRAM_H 15 #include "sst/core/sst_types.h" 16 #include "sst/core/statapi/statbase.h" 17 #include "sst/core/statapi/statoutput.h" 18 #include "sst/core/warnmacros.h" 21 namespace Statistics {
37 #define CountType uint64_t 38 #define NumBinsType uint32_t 40 template <
class BinDataType>
44 SST_ELI_DECLARE_STATISTIC_TEMPLATE(
48 SST_ELI_ELEMENT_VERSION(1, 0, 0),
49 "Track distribution of statistic across bins",
53 BaseComponent* comp,
const std::string& statName,
const std::string& statSubId,
Params& statParams) :
58 allowedKeySet.insert(
"minvalue");
59 allowedKeySet.insert(
"binwidth");
60 allowedKeySet.insert(
"numbins");
61 allowedKeySet.insert(
"dumpbinsonoutput");
62 allowedKeySet.insert(
"includeoutofbounds");
66 m_minValue = statParams.
find<BinDataType>(
"minvalue", 0);
67 m_binWidth = statParams.
find<NumBinsType>(
"binwidth", 5000);
68 m_numBins = statParams.
find<NumBinsType>(
"numbins", 100);
69 m_dumpBinsOnOutput = statParams.
find<
bool>(
"dumpbinsonoutput",
true);
70 m_includeOutOfBounds = statParams.
find<
bool>(
"includeoutofbounds",
true);
77 m_itemsBinnedCount = 0;
78 this->setCollectionCount(0);
81 this->setStatisticTypeName(
"Histogram");
96 ser& m_itemsBinnedCount;
98 ser& m_totalSummedSqr;
100 ser& m_dumpBinsOnOutput;
101 ser& m_includeOutOfBounds;
113 if ( value < getBinsMinValue() ) {
117 if ( value > getBinsMaxValue() ) {
124 m_totalSummed += N * value;
125 m_totalSummedSqr += N * (value * value);
128 m_itemsBinnedCount++;
134 double calc1 = (double)value / (
double)m_binWidth;
135 double calc2 = floor(calc1);
136 double calc3 = m_binWidth * calc2;
137 BinDataType bin_start = (BinDataType)calc3;
141 HistoMapItr_t bin_itr = m_binsMap.find(bin_start);
144 if ( bin_itr == m_binsMap.end() ) {
146 m_binsMap.insert(std::pair<BinDataType, CountType>(bin_start, (CountType)N));
150 bin_itr->second += N;
158 NumBinsType getActiveBinCount() {
return m_binsMap.size(); }
161 NumBinsType getNumBins() {
return m_numBins; }
164 NumBinsType getBinWidth() {
return m_binWidth; }
170 CountType getBinCountByBinStart(BinDataType binStartValue)
173 HistoMapItr_t bin_itr = m_binsMap.find(binStartValue);
176 if ( bin_itr == m_binsMap.end() ) {
182 return m_binsMap[binStartValue];
190 BinDataType getBinsMinValue() {
return m_minValue; }
196 BinDataType getBinsMaxValue()
199 return (m_binWidth * m_numBins) + m_minValue - 1;
206 uint64_t getStatCollectionCount()
216 CountType getItemsBinnedCount()
219 return m_itemsBinnedCount;
226 BinDataType getValuesSummed() {
return m_totalSummed; }
232 BinDataType getValuesSquaredSummed() {
return m_totalSummedSqr; }
234 void clearStatisticData()
override 237 m_totalSummedSqr = 0;
240 m_itemsBinnedCount = 0;
242 this->setCollectionCount(0);
245 void registerOutputFields(StatisticFieldsOutput* statOutput)
override 248 m_Fields.push_back(statOutput->registerField<BinDataType>(
"BinsMinValue"));
249 m_Fields.push_back(statOutput->registerField<BinDataType>(
"BinsMaxValue"));
250 m_Fields.push_back(statOutput->registerField<NumBinsType>(
"BinWidth"));
251 m_Fields.push_back(statOutput->registerField<NumBinsType>(
"TotalNumBins"));
252 m_Fields.push_back(statOutput->registerField<BinDataType>(
"Sum"));
253 m_Fields.push_back(statOutput->registerField<BinDataType>(
"SumSQ"));
254 m_Fields.push_back(statOutput->registerField<NumBinsType>(
"NumActiveBins"));
255 m_Fields.push_back(statOutput->registerField<CountType>(
"NumItemsCollected"));
256 m_Fields.push_back(statOutput->registerField<CountType>(
"NumItemsBinned"));
258 if (
true == m_includeOutOfBounds ) {
259 m_Fields.push_back(statOutput->registerField<CountType>(
"NumOutOfBounds-MinValue"));
260 m_Fields.push_back(statOutput->registerField<CountType>(
"NumOutOfBounds-MaxValue"));
264 if (
true == m_dumpBinsOnOutput ) {
268 for ( uint32_t y = 0; y < getNumBins(); y++ ) {
270 binLL = (y * (uint64_t)getBinWidth()) + getBinsMinValue();
271 binUL = binLL + getBinWidth() - 1;
273 std::stringstream ss;
274 ss <<
"Bin" << y <<
":" << binLL <<
"-" << binUL;
275 m_Fields.push_back(statOutput->registerField<CountType>(ss.str().c_str()));
280 void outputStatisticFields(StatisticFieldsOutput* statOutput,
bool UNUSED(EndOfSimFlag))
override 282 StatisticOutput::fieldHandle_t x = 0;
283 statOutput->outputField(m_Fields[x++], getBinsMinValue());
284 statOutput->outputField(m_Fields[x++], getBinsMaxValue());
285 statOutput->outputField(m_Fields[x++], getBinWidth());
286 statOutput->outputField(m_Fields[x++], getNumBins());
287 statOutput->outputField(m_Fields[x++], getValuesSummed());
288 statOutput->outputField(m_Fields[x++], getValuesSquaredSummed());
289 statOutput->outputField(m_Fields[x++], getActiveBinCount());
290 statOutput->outputField(m_Fields[x++], getStatCollectionCount());
291 statOutput->outputField(m_Fields[x++], getItemsBinnedCount());
293 if (
true == m_includeOutOfBounds ) {
294 statOutput->outputField(m_Fields[x++], m_OOBMinCount);
295 statOutput->outputField(m_Fields[x++], m_OOBMaxCount);
299 if (
true == m_dumpBinsOnOutput ) {
300 BinDataType currentBinValue = getBinsMinValue();
301 for ( uint32_t y = 0; y < getNumBins(); y++ ) {
302 statOutput->outputField(m_Fields[x++], getBinCountByBinStart(currentBinValue));
304 currentBinValue += getBinWidth();
312 case StatisticBase::STAT_MODE_COUNT:
313 case StatisticBase::STAT_MODE_PERIODIC:
314 case StatisticBase::STAT_MODE_DUMP_AT_END:
324 typedef std::map<BinDataType, CountType> HistoMap_t;
327 typedef typename HistoMap_t::iterator HistoMapItr_t;
330 BinDataType m_minValue;
333 NumBinsType m_binWidth;
336 NumBinsType m_numBins;
339 CountType m_OOBMinCount;
340 CountType m_OOBMaxCount;
344 CountType m_itemsBinnedCount;
348 BinDataType m_totalSummed;
352 BinDataType m_totalSummedSqr;
355 HistoMap_t m_binsMap;
358 std::vector<StatisticOutput::fieldHandle_t> m_Fields;
359 bool m_dumpBinsOnOutput;
360 bool m_includeOutOfBounds;
366 #endif // SST_CORE_STATAPI_STATHISTOGRAM_H This class is basically a wrapper for objects to declare the order in which their members should be s...
Definition: serializer.h:43
void pushAllowedKeys(const KeySet_t &keys)
Definition: params.cc:226
Holder of data grouped into pre-determined width bins.
Definition: stathistogram.h:41
Forms the template defined base class for statistics gathering within SST.
Definition: elementinfo.h:45
void addData_impl_Ntimes(uint64_t N, BinDataType value) override
Adds a new value to the histogram.
Definition: stathistogram.h:110
void serialize_order(SST::Core::Serialization::serializer &ser) override
Serialization.
Definition: stathistogram.h:88
Main component object for the simulation.
Definition: baseComponent.h:62
StatMode_t
Statistic collection mode.
Definition: statbase.h:49
std::enable_if< not std::is_same< std::string, T >::value, T >::type find(const std::string &k, T default_value, bool &found) const
Find a Parameter value in the set, and return its value as a type T.
Definition: params.h:321
Parameter store.
Definition: params.h:55
std::set< key_type, KeyCompare > KeySet_t
Definition: params.h:233
virtual void serialize_order(SST::Core::Serialization::serializer &ser) override
Serialization.
Definition: statbase.h:389
uint64_t getCollectionCount() const
Return the current collection count.
Definition: statbase.h:137