]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/accumulators/test/valarray.cpp
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)
8 #include <boost/utility/enable_if.hpp>
9 #include <boost/type_traits/is_floating_point.hpp>
10 #include <boost/test/unit_test.hpp>
11 #include <boost/test/floating_point_comparison.hpp>
12 #include <boost/accumulators/accumulators.hpp>
13 #include <boost/accumulators/numeric/functional/valarray.hpp>
14 #include <boost/accumulators/statistics/stats.hpp>
15 #include <boost/accumulators/statistics/min.hpp>
16 #include <boost/accumulators/statistics/max.hpp>
17 #include <boost/accumulators/statistics/mean.hpp>
18 #include <boost/accumulators/statistics/weighted_mean.hpp>
20 using namespace boost
;
21 using namespace unit_test
;
22 using namespace accumulators
;
25 typename
boost::enable_if
<is_floating_point
<T
> >::type
is_equal_or_close(T
const &left
, T
const &right
)
27 BOOST_CHECK_CLOSE(left
, right
, 1e-5);
31 typename
boost::disable_if
<is_floating_point
<T
> >::type
is_equal_or_close(T
const &left
, T
const &right
)
33 BOOST_CHECK_EQUAL(left
, right
);
37 void is_equal(std::valarray
<T
> const &left
, std::valarray
<T
> const &right
)
39 BOOST_CHECK_EQUAL(left
.size(), right
.size());
40 if(left
.size() == right
.size())
42 for(std::size_t i
= 0; i
< left
.size(); ++i
)
44 is_equal_or_close(left
[i
], right
[i
]);
52 inline std::ostream
&operator <<(std::ostream
&sout
, std::valarray
<T
> const &arr
)
55 for(std::size_t i
= 0; i
< arr
.size(); ++i
)
57 sout
<< arr
[i
] << ',';
59 sout
<< ')' << std::endl
;
64 ///////////////////////////////////////////////////////////////////////////////
69 typedef std::valarray
<int> sample_t
;
73 accumulator_set
<sample_t
, stats
<tag::sum
> > acc(sample
= sample_t(0,3));
79 is_equal(sample_t(6,3), sum(acc
));
84 int s1
[] = {1,2,3}, s2
[] = {0,3,4}, s3
[] = {2,1,4}, min_res
[] = {0,1,3}, max_res
[] = {2,3,4};
85 accumulator_set
<sample_t
, stats
<tag::min
, tag::max
> > acc(sample
= sample_t(0,3));
91 is_equal(sample_t(min_res
,3), (min
)(acc
));
92 is_equal(sample_t(max_res
,3), (max
)(acc
));
95 // test mean(lazy) and mean(immediate)
97 accumulator_set
<sample_t
, stats
<tag::mean
> > acc(sample
= sample_t(0,3));
100 is_equal(std::valarray
<double>(1., 3), mean(acc
));
101 BOOST_CHECK_EQUAL(1u, count(acc
));
102 is_equal(sample_t(1, 3), sum(acc
));
105 is_equal(std::valarray
<double>(0.5, 3), mean(acc
));
106 BOOST_CHECK_EQUAL(2u, count(acc
));
107 is_equal(sample_t(1, 3), sum(acc
));
110 is_equal(std::valarray
<double>(1., 3), mean(acc
));
111 BOOST_CHECK_EQUAL(3u, count(acc
));
112 is_equal(sample_t(3, 3), sum(acc
));
115 accumulator_set
<sample_t
, stats
<tag::mean(immediate
)> > acc2(sample
= sample_t(0,3));
118 is_equal(std::valarray
<double>(1., 3), mean(acc2
));
119 BOOST_CHECK_EQUAL(1u, count(acc2
));
122 is_equal(std::valarray
<double>(0.5, 3), mean(acc2
));
123 BOOST_CHECK_EQUAL(2u, count(acc2
));
126 is_equal(std::valarray
<double>(1., 3), mean(acc2
));
127 BOOST_CHECK_EQUAL(3u, count(acc2
));
130 // test weighted_mean
132 accumulator_set
<sample_t
, stats
<tag::weighted_mean
>, int> acc(sample
= sample_t(0,3));
134 acc(sample_t(10,3), weight
= 2); // 20
135 BOOST_CHECK_EQUAL(2, sum_of_weights(acc
)); //
137 acc(sample_t(6,3), weight
= 3); // 18
138 BOOST_CHECK_EQUAL(5, sum_of_weights(acc
)); //
140 acc(sample_t(4,3), weight
= 4); // 16
141 BOOST_CHECK_EQUAL(9, sum_of_weights(acc
)); //
143 acc(sample_t(6,3), weight
= 5); //+ 30
144 BOOST_CHECK_EQUAL(14, sum_of_weights(acc
)); //
147 is_equal(std::valarray
<double>(6.,3), weighted_mean(acc
));
150 accumulator_set
<sample_t
, stats
<tag::weighted_mean(immediate
)>, int> acc2(sample
= sample_t(0,3));
152 acc2(sample_t(10,3), weight
= 2); // 20
153 BOOST_CHECK_EQUAL(2, sum_of_weights(acc2
)); //
155 acc2(sample_t(6,3), weight
= 3); // 18
156 BOOST_CHECK_EQUAL(5, sum_of_weights(acc2
)); //
158 acc2(sample_t(4,3), weight
= 4); // 16
159 BOOST_CHECK_EQUAL(9, sum_of_weights(acc2
)); //
161 acc2(sample_t(6,3), weight
= 5); //+ 30
162 BOOST_CHECK_EQUAL(14, sum_of_weights(acc2
));//
165 is_equal(std::valarray
<double>(6.,3), weighted_mean(acc2
));
170 ///////////////////////////////////////////////////////////////////////////////
171 // init_unit_test_suite
173 test_suite
* init_unit_test_suite( int argc
, char* argv
[] )
175 test_suite
*test
= BOOST_TEST_SUITE("valarray test");
177 test
->add(BOOST_TEST_CASE(&test_stat
));