xrpld
Loading...
Searching...
No Matches
Histogram.h
1#pragma once
2
3#include <cassert>
4#include <cmath>
5#include <cstddef>
6#include <functional>
7#include <map>
8
9namespace xrpl::test::csf {
10
21template <class T, class Compare = std::less<T>>
23{
24 // TODO: Consider logarithmic bins around expected median if this becomes
25 // unscalable
28
29public:
33 void
34 insert(T const& s)
35 {
36 ++counts_[s];
37 ++samples_;
38 }
39
43 [[nodiscard]] std::size_t
44 size() const
45 {
46 return samples_;
47 }
48
52 [[nodiscard]] std::size_t
53 numBins() const
54 {
55 return counts_.size();
56 }
57
61 [[nodiscard]] T
62 minValue() const
63 {
64 return counts_.empty() ? T{} : counts_.begin()->first;
65 }
66
70 [[nodiscard]] T
71 maxValue() const
72 {
73 return counts_.empty() ? T{} : counts_.rbegin()->first;
74 }
75
79 [[nodiscard]] T
80 avg() const
81 {
82 T tmp{};
83 if (samples_ == 0)
84 return tmp;
85 // Since counts are sorted, shouldn't need to worry much about numerical
86 // error
87 for (auto const& [bin, count] : counts_)
88 {
89 tmp += bin * count;
90 }
91 return tmp / samples_;
92 }
93
101 [[nodiscard]] T
102 percentile(float p) const
103 {
104 assert(p >= 0 && p <= 1);
105 std::size_t const pos = std::round(p * samples_);
106
107 if (counts_.empty())
108 return T{};
109
110 auto it = counts_.begin();
111 std::size_t cumsum = it->second;
112 while (it != counts_.end() && cumsum < pos)
113 {
114 ++it;
115 cumsum += it->second;
116 }
117 return it->first;
118 }
119};
120
121} // namespace xrpl::test::csf
Basic histogram.
Definition Histogram.h:23
std::size_t numBins() const
The number of distinct samples (bins).
Definition Histogram.h:53
T percentile(float p) const
Calculate the given percentile of the distribution.
Definition Histogram.h:102
T maxValue() const
Maximum observed value.
Definition Histogram.h:71
T avg() const
Histogram average.
Definition Histogram.h:80
std::map< SimTime::duration, std::size_t, std::less< SimTime::duration > > counts_
Definition Histogram.h:26
T minValue() const
Minimum observed value.
Definition Histogram.h:62
std::size_t size() const
The number of samples.
Definition Histogram.h:44
void insert(T const &s)
Insert an sample.
Definition Histogram.h:34
T round(T... args)