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