1 // Copyright 2015-2018 Hans Dembinski
2 //
3 // Distributed under the Boost Software License, Version 1.0.
4 // (See accompanying file LICENSE_1_0.txt
5 // or copy at http://www.boost.org/LICENSE_1_0.txt)
6
7 #include <boost/core/lightweight_test.hpp>
8 #include <boost/histogram/accumulators/mean.hpp>
9 #include <boost/histogram/accumulators/ostream.hpp>
10 #include <boost/histogram/weight.hpp>
11 #include <sstream>
12 #include "is_close.hpp"
13 #include "throw_exception.hpp"
14 #include "utility_str.hpp"
15
16 using namespace boost::histogram;
17 using namespace std::literals;
18
main()19 int main() {
20 using m_t = accumulators::mean<double>;
21 m_t a;
22 BOOST_TEST_EQ(a.count(), 0);
23 BOOST_TEST_EQ(a, m_t{});
24
25 a(4);
26 a(7);
27 a(13);
28 a(16);
29
30 BOOST_TEST_EQ(a.count(), 4);
31 BOOST_TEST_EQ(a.value(), 10);
32 BOOST_TEST_EQ(a.variance(), 30);
33
34 BOOST_TEST_EQ(str(a), "mean(4, 10, 30)"s);
35 BOOST_TEST_EQ(str(a, 20, false), " mean(4, 10, 30)"s);
36 BOOST_TEST_EQ(str(a, 20, true), "mean(4, 10, 30) "s);
37
38 m_t b;
39 b(1e8 + 4);
40 b(1e8 + 7);
41 b(1e8 + 13);
42 b(1e8 + 16);
43
44 BOOST_TEST_EQ(b.count(), 4);
45 BOOST_TEST_EQ(b.value(), 1e8 + 10);
46 BOOST_TEST_EQ(b.variance(), 30);
47
48 auto c = a;
49 c += a; // same as feeding all samples twice
50
51 BOOST_TEST_EQ(c.count(), 8);
52 BOOST_TEST_EQ(c.value(), 10);
53 BOOST_TEST_IS_CLOSE(c.variance(), 25.714, 1e-3);
54
55 // also same as feeding all samples twice
56 m_t d;
57 d(weight(2), 4);
58 d(weight(2), 7);
59 d(weight(2), 13);
60 d(weight(2), 16);
61
62 BOOST_TEST_EQ(d, c);
63
64 BOOST_TEST_EQ(m_t() += m_t(), m_t());
65 BOOST_TEST_EQ(m_t(1, 2, 3) += m_t(), m_t(1, 2, 3));
66 BOOST_TEST_EQ(m_t() += m_t(1, 2, 3), m_t(1, 2, 3));
67
68 return boost::report_errors();
69 }
70