3 #include <boost/test/unit_test.hpp> 12 double t_interpolate(
double x_a,
double x_b,
double y_a,
double s,
double q) {
13 return x_a + (q - y_a) * (x_b - x_a) / s;
16 int t_interpolate(
int x_a,
int x_b,
double y_a,
double s,
double q) {
17 return int(std::floor(x_a + (q - y_a) * (x_b - x_a) / s));
22 typedef T sample_type;
24 static sample_type
const min;
25 static sample_type
const max;
27 sample_type histogram_min()
const {
30 sample_type histogram_max()
const {
33 sample_type theoretical_min()
const {
34 return std::numeric_limits<int>::min();
36 sample_type theoretical_max()
const {
37 return std::numeric_limits<int>::max();
39 std::size_t sample2bin(sample_type x)
const {
40 if (x < min or x > max) {
41 throw std::invalid_argument(
"Invalid sample value in sample2bin()");
43 return static_cast<std::size_t
>(x - min);
45 sample_type bin2sample(std::size_t i)
const {
48 sample_type interpolate(
49 sample_type x_a, sample_type x_b,
double y_a,
double s,
double q)
const {
50 return t_interpolate(x_a, x_b, y_a, s, q);
55 T
const test_binning<T>::min = 20;
57 T
const test_binning<T>::max = 30;
68 BOOST_CHECK_EQUAL(h.nsamples(), 0);
69 BOOST_CHECK_EQUAL(h.underflow_count(), 0);
70 BOOST_CHECK_EQUAL(h.overflow_count(), 0);
79 BOOST_CHECK_EQUAL(h.nsamples(), 1);
80 BOOST_CHECK_EQUAL(h.underflow_count(), 1);
81 BOOST_CHECK_EQUAL(h.overflow_count(), 0);
82 BOOST_CHECK_EQUAL(h.observed_min(), 10);
83 BOOST_CHECK_EQUAL(h.observed_max(), 10);
88 BOOST_CHECK_EQUAL(h.nsamples(), 4);
89 BOOST_CHECK_EQUAL(h.underflow_count(), 4);
90 BOOST_CHECK_EQUAL(h.overflow_count(), 0);
91 BOOST_CHECK_EQUAL(h.observed_min(), 5);
92 BOOST_CHECK_EQUAL(h.observed_max(), 10);
94 h.weighted_sample(5, 2);
95 BOOST_CHECK_EQUAL(h.nsamples(), 6);
96 BOOST_CHECK_EQUAL(h.underflow_count(), 6);
97 BOOST_CHECK_EQUAL(h.overflow_count(), 0);
98 BOOST_CHECK_EQUAL(h.observed_min(), 5);
99 BOOST_CHECK_EQUAL(h.observed_max(), 10);
101 h.weighted_sample(50, 0);
102 BOOST_CHECK_EQUAL(h.nsamples(), 6);
103 BOOST_CHECK_EQUAL(h.underflow_count(), 6);
104 BOOST_CHECK_EQUAL(h.overflow_count(), 0);
105 BOOST_CHECK_EQUAL(h.observed_min(), 5);
106 BOOST_CHECK_EQUAL(h.observed_max(), 10);
115 BOOST_CHECK_EQUAL(h.nsamples(), 1);
116 BOOST_CHECK_EQUAL(h.underflow_count(), 0);
117 BOOST_CHECK_EQUAL(h.overflow_count(), 1);
118 BOOST_CHECK_EQUAL(h.observed_min(), 40);
119 BOOST_CHECK_EQUAL(h.observed_max(), 40);
124 BOOST_CHECK_EQUAL(h.nsamples(), 4);
125 BOOST_CHECK_EQUAL(h.underflow_count(), 0);
126 BOOST_CHECK_EQUAL(h.overflow_count(), 4);
127 BOOST_CHECK_EQUAL(h.observed_min(), 40);
128 BOOST_CHECK_EQUAL(h.observed_max(), 45);
130 h.weighted_sample(45, 2);
131 BOOST_CHECK_EQUAL(h.nsamples(), 6);
132 BOOST_CHECK_EQUAL(h.underflow_count(), 0);
133 BOOST_CHECK_EQUAL(h.overflow_count(), 6);
134 BOOST_CHECK_EQUAL(h.observed_min(), 40);
135 BOOST_CHECK_EQUAL(h.observed_max(), 45);
143 BOOST_CHECK_THROW(h.estimated_mean(), std::invalid_argument);
148 BOOST_CHECK_EQUAL(h.estimated_mean(), 25);
153 BOOST_CHECK_EQUAL(h.estimated_mean(), 26);
164 BOOST_CHECK_EQUAL(h.estimated_mean(), 10);
175 BOOST_CHECK_EQUAL(h.estimated_mean(), 35);
185 h.weighted_sample(20, 3);
187 BOOST_CHECK_EQUAL(h.estimated_mean(), 20);
195 BOOST_CHECK_THROW(h.estimated_quantile(0.0), std::invalid_argument);
198 BOOST_CHECK_EQUAL(h.estimated_quantile(0.0), 20);
199 BOOST_CHECK_EQUAL(h.estimated_quantile(0.5), 20);
200 BOOST_CHECK_EQUAL(h.estimated_quantile(1.0), 21);
202 BOOST_CHECK_THROW(h.estimated_quantile(-1.0), std::invalid_argument);
203 BOOST_CHECK_THROW(h.estimated_quantile(2.00), std::invalid_argument);
207 BOOST_CHECK_EQUAL(h.estimated_quantile(0.0), 20);
208 BOOST_CHECK_EQUAL(h.estimated_quantile(0.5), 21);
209 BOOST_CHECK_EQUAL(h.estimated_quantile(1.0), 23);
217 BOOST_CHECK_EQUAL(h.estimated_quantile(0.00), 20);
218 BOOST_CHECK_EQUAL(h.estimated_quantile(0.25), 22);
219 BOOST_CHECK_EQUAL(h.estimated_quantile(0.50), 24);
220 BOOST_CHECK_EQUAL(h.estimated_quantile(0.75), 26);
221 BOOST_CHECK_EQUAL(h.estimated_quantile(1.00), 29);
231 BOOST_CHECK_THROW(h.estimated_quantile(0), std::invalid_argument);
234 double eps = 100 * std::numeric_limits<double>::epsilon();
235 BOOST_CHECK_CLOSE(h.estimated_quantile(0.00), 20.00, eps);
236 BOOST_CHECK_CLOSE(h.estimated_quantile(0.25), 20.25, eps);
237 BOOST_CHECK_CLOSE(h.estimated_quantile(0.50), 20.50, eps);
238 BOOST_CHECK_CLOSE(h.estimated_quantile(0.75), 20.75, eps);
239 BOOST_CHECK_CLOSE(h.estimated_quantile(1.00), 21.00, eps);
244 BOOST_CHECK_CLOSE(h.estimated_quantile(0.00), 20.0, eps);
245 BOOST_CHECK_CLOSE(h.estimated_quantile(0.25), 21.0, eps);
246 BOOST_CHECK_CLOSE(h.estimated_quantile(0.50), 22.0, eps);
247 BOOST_CHECK_CLOSE(h.estimated_quantile(0.75), 23.0, eps);
248 BOOST_CHECK_CLOSE(h.estimated_quantile(1.00), 24.0, eps);
254 BOOST_CHECK_CLOSE(h.estimated_quantile(0.00), 20.0, eps);
255 BOOST_CHECK_CLOSE(h.estimated_quantile(0.25), 22.0, eps);
256 BOOST_CHECK_CLOSE(h.estimated_quantile(0.50), 24.0, eps);
257 BOOST_CHECK_CLOSE(h.estimated_quantile(0.75), 26.0, eps);
258 BOOST_CHECK_CLOSE(h.estimated_quantile(1.00), 28.0, eps);
264 double eps = 100 * std::numeric_limits<double>::epsilon();
267 BOOST_CHECK_CLOSE(h.estimated_quantile(0.00), 10.0, eps);
268 BOOST_CHECK_CLOSE(h.estimated_quantile(0.25), 12.5, eps);
269 BOOST_CHECK_CLOSE(h.estimated_quantile(0.50), 15.0, eps);
270 BOOST_CHECK_CLOSE(h.estimated_quantile(0.75), 17.5, eps);
271 BOOST_CHECK_CLOSE(h.estimated_quantile(1.00), 20.0, eps);
277 double eps = 100 * std::numeric_limits<double>::epsilon();
280 BOOST_CHECK_CLOSE(h.estimated_quantile(0.00), 30.0, eps);
281 BOOST_CHECK_CLOSE(h.estimated_quantile(0.25), 32.5, eps);
282 BOOST_CHECK_CLOSE(h.estimated_quantile(0.50), 35.0, eps);
283 BOOST_CHECK_CLOSE(h.estimated_quantile(0.75), 37.5, eps);
284 BOOST_CHECK_CLOSE(h.estimated_quantile(1.00), 40.0, eps);
290 double eps = 100 * std::numeric_limits<double>::epsilon();
306 BOOST_CHECK_CLOSE(h.estimated_quantile(0.00), 10.0, eps);
307 BOOST_CHECK_CLOSE(h.estimated_quantile(0.05), 15.0, eps);
308 BOOST_CHECK_CLOSE(h.estimated_quantile(0.10), 20.0, eps);
309 BOOST_CHECK_CLOSE(h.estimated_quantile(0.25), 20.375, eps);
310 BOOST_CHECK_CLOSE(h.estimated_quantile(0.50), 21.0, eps);
311 BOOST_CHECK_CLOSE(h.estimated_quantile(0.90), 26.0, eps);
312 BOOST_CHECK_CLOSE(h.estimated_quantile(0.95), 35.0, eps);
313 BOOST_CHECK_CLOSE(h.estimated_quantile(1.00), 40.0, eps);
void sample(sample_type const &t)
Record a new sample.
A histogram class with controllable binning and range strategy.
BOOST_AUTO_TEST_CASE(histogram_initialization)