diff --git a/cpp/histogram.hpp b/cpp/histogram.hpp new file mode 100644 index 0000000000000000000000000000000000000000..f6e6a02c6a2879d7452f7e60ce601f5c16a6e91c --- /dev/null +++ b/cpp/histogram.hpp @@ -0,0 +1,50 @@ +#pragma once +#include "exports.hpp" +#include +#include + +// Histogram over integers with binsize 1 +class Histogram { + public: + Histogram() : xmin(0) {} + ~Histogram() {} + + void reset() { + frequencies.clear(); + xmin = 0; + } + + void add(int sample) { + if (frequencies.empty()) { + xmin = sample; + frequencies.push_back(1); + return; + } + if (sample < xmin) { + int extra = xmin - sample; + frequencies.insert(frequencies.begin(), extra, 0); + xmin = sample; + frequencies.front()++; + return; + } + if (sample - xmin >= (int)frequencies.size()) { + int extra = sample - xmin - frequencies.size() + 1; + frequencies.insert(frequencies.end(), extra, 0); + frequencies.back()++; + return; + } + frequencies[sample - xmin]++; + } + + // For exports + std::vector> getHistogram() const { + std::vector> histogram; + int i = xmin; + for (auto f : frequencies) + histogram.push_back({i++, f}); + return histogram; + } + + std::vector frequencies; + int xmin; +};