Skip to content

File HyperStats.hpp

File List > analysis > stats > HyperStats.hpp

Go to the documentation of this file

#pragma once

#include <string>
#include <vector>

#include <gtl/btree.hpp>

#include <units/units.hpp>

#include <trace/analysis/stats/RiseSetStats.hpp>
#include <trace/analysis/stats/Stats.hpp>
#include <trace/risesets/RiseSetArray.hpp>
#include <trace/trace.fwd.hpp>
#include <trace/types/IdPair.hpp>
#include <trace/types/enums.hpp>

namespace astrea {
namespace trace {

template <class T = Time>
struct HyperStats {

    HyperStats() = default;

    HyperStats(const std::vector<Stats<T>>& statsVec)
    {
        std::vector<T> minVals;
        std::vector<T> maxVals;
        std::vector<T> avgVals;
        std::vector<std::vector<T>> pctVals;

        const std::size_t statsSize = statsVec.size();
        minVals.reserve(statsSize);
        maxVals.reserve(statsSize);
        avgVals.reserve(statsSize);

        const std::size_t nPercentiles = DEFAULT_PERCENTILES.size();
        pctVals.resize(nPercentiles);
        for (std::size_t ii = 0; ii < nPercentiles; ++ii) {
            pctVals[ii].reserve(statsSize);
        }

        // stats of stats. oh joy
        for (const auto& stats : statsVec) {
            // assume this marks the Stats as empty
            if (stats.percentiles.size() == 0) { continue; }

            minVals.push_back(stats.min);
            maxVals.push_back(stats.max);
            avgVals.push_back(stats.avg);

            for (std::size_t ii = 0; ii < nPercentiles; ++ii) {
                pctVals[ii].push_back(stats.percentiles[ii]);
            }
        }

        min = Stats<T>(minVals);
        max = Stats<T>(maxVals);
        avg = Stats<T>(avgVals);
        for (std::size_t ii = 0; ii < nPercentiles; ++ii) {
            percentiles.push_back(Stats<T>(pctVals[ii]));
        }
    }

    std::vector<std::string> to_string_vector() const
    {
        std::vector<std::string> retval;
        retval.reserve(HyperStats<T>::size());

        const auto minStrVec = min.to_string_vector();
        const auto avgStrVec = avg.to_string_vector();
        const auto maxStrVec = max.to_string_vector();

        retval.insert(retval.end(), minStrVec.begin(), minStrVec.end());
        retval.insert(retval.end(), avgStrVec.begin(), avgStrVec.end());
        retval.insert(retval.end(), maxStrVec.begin(), maxStrVec.end());

        for (const auto& pct : percentiles) {
            const auto pctStrVec = pct.to_string_vector();
            retval.insert(retval.end(), pctStrVec.begin(), pctStrVec.end());
        }

        return retval;
    }

    static constexpr std::size_t size() { return Stats<T>::size() * (3 + DEFAULT_PERCENTILES.size()); }

    Stats<T> min;                      
    Stats<T> max;                      
    Stats<T> avg;                      
    std::vector<Stats<T>> percentiles; 
};

} // namespace trace
} // namespace astrea