]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // (C) Copyright Eric Niebler 2005. |
2 | // Use, modification and distribution are subject to the | |
3 | // Boost Software License, Version 1.0. (See accompanying file | |
4 | // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
5 | ||
6 | #include <boost/test/unit_test.hpp> | |
7 | #include <boost/test/floating_point_comparison.hpp> | |
8 | #include <boost/accumulators/accumulators.hpp> | |
9 | #include <boost/accumulators/statistics/stats.hpp> | |
10 | #include <boost/accumulators/statistics/weighted_mean.hpp> | |
11 | #include <boost/accumulators/statistics/variates/covariate.hpp> | |
12 | ||
13 | using namespace boost; | |
14 | using namespace unit_test; | |
15 | using namespace accumulators; | |
16 | ||
17 | template<typename T> | |
18 | void assert_is_double(T const &) | |
19 | { | |
20 | BOOST_MPL_ASSERT((is_same<T, double>)); | |
21 | } | |
22 | ||
23 | /////////////////////////////////////////////////////////////////////////////// | |
24 | // test_stat | |
25 | // | |
26 | void test_stat() | |
27 | { | |
28 | accumulator_set< | |
29 | int | |
30 | , stats< | |
31 | tag::weighted_mean | |
32 | , tag::mean_of_weights | |
33 | , tag::weighted_mean_of_variates<int, tag::covariate1> | |
34 | > | |
35 | , int | |
36 | > acc, test_acc(sample = 0); | |
37 | ||
38 | acc(1, weight = 2, covariate1 = 3); | |
39 | BOOST_CHECK_CLOSE(1., weighted_mean(acc), 1e-5); | |
40 | BOOST_CHECK_EQUAL(1u, count(acc)); | |
41 | BOOST_CHECK_EQUAL(2, sum(acc)); | |
42 | BOOST_CHECK_CLOSE(2., mean_of_weights(acc), 1e-5); | |
43 | BOOST_CHECK_CLOSE(3., (accumulators::weighted_mean_of_variates<int, tag::covariate1>(acc)), 1e-5); | |
44 | ||
45 | acc(0, weight = 4, covariate1 = 4); | |
46 | BOOST_CHECK_CLOSE(1./3., weighted_mean(acc), 1e-5); | |
47 | BOOST_CHECK_EQUAL(2u, count(acc)); | |
48 | BOOST_CHECK_EQUAL(2, sum(acc)); | |
49 | BOOST_CHECK_CLOSE(3., mean_of_weights(acc), 1e-5); | |
50 | BOOST_CHECK_CLOSE(11./3., (accumulators::weighted_mean_of_variates<int, tag::covariate1>(acc)), 1e-5); | |
51 | ||
52 | acc(2, weight = 9, covariate1 = 8); | |
53 | BOOST_CHECK_CLOSE(4./3., weighted_mean(acc), 1e-5); | |
54 | BOOST_CHECK_EQUAL(3u, count(acc)); | |
55 | BOOST_CHECK_EQUAL(20, sum(acc)); | |
56 | BOOST_CHECK_CLOSE(5., mean_of_weights(acc), 1e-5); | |
57 | BOOST_CHECK_CLOSE(94./15., (accumulators::weighted_mean_of_variates<int, tag::covariate1>(acc)), 1e-5); | |
58 | ||
59 | assert_is_double(mean(acc)); | |
60 | ||
61 | accumulator_set< | |
62 | int | |
63 | , stats< | |
64 | tag::weighted_mean(immediate) | |
65 | , tag::mean_of_weights(immediate) | |
66 | , tag::weighted_mean_of_variates<int, tag::covariate1>(immediate) | |
67 | > | |
68 | , int | |
69 | > acc2, test_acc2(sample = 0); | |
70 | ||
71 | acc2(1, weight = 2, covariate1 = 3); | |
72 | BOOST_CHECK_CLOSE(1., weighted_mean(acc2), 1e-5); | |
73 | BOOST_CHECK_EQUAL(1u, count(acc2)); | |
74 | BOOST_CHECK_CLOSE(2., mean_of_weights(acc2), 1e-5); | |
75 | BOOST_CHECK_CLOSE(3., (accumulators::weighted_mean_of_variates<int, tag::covariate1>(acc2)), 1e-5); | |
76 | ||
77 | acc2(0, weight = 4, covariate1 = 4); | |
78 | BOOST_CHECK_CLOSE(1./3., weighted_mean(acc2), 1e-5); | |
79 | BOOST_CHECK_EQUAL(2u, count(acc2)); | |
80 | BOOST_CHECK_CLOSE(3., mean_of_weights(acc2), 1e-5); | |
81 | BOOST_CHECK_CLOSE(11./3., (accumulators::weighted_mean_of_variates<int, tag::covariate1>(acc2)), 1e-5); | |
82 | ||
83 | acc2(2, weight = 9, covariate1 = 8); | |
84 | BOOST_CHECK_CLOSE(4./3., weighted_mean(acc2), 1e-5); | |
85 | BOOST_CHECK_EQUAL(3u, count(acc2)); | |
86 | BOOST_CHECK_CLOSE(5., mean_of_weights(acc2), 1e-5); | |
87 | BOOST_CHECK_CLOSE(94./15., (accumulators::mean_of_variates<int, tag::covariate1>(acc2)), 1e-5); | |
88 | ||
89 | assert_is_double(mean(acc2)); | |
90 | } | |
91 | ||
92 | /////////////////////////////////////////////////////////////////////////////// | |
93 | // init_unit_test_suite | |
94 | // | |
95 | test_suite* init_unit_test_suite( int argc, char* argv[] ) | |
96 | { | |
97 | test_suite *test = BOOST_TEST_SUITE("weighted_mean test"); | |
98 | ||
99 | test->add(BOOST_TEST_CASE(&test_stat)); | |
100 | ||
101 | return test; | |
102 | } |