• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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