valarray.cpp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  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. #include <iostream>
  6. #include <valarray>
  7. #include <boost/utility/enable_if.hpp>
  8. #include <boost/type_traits/is_floating_point.hpp>
  9. #include <boost/test/unit_test.hpp>
  10. #include <boost/test/floating_point_comparison.hpp>
  11. #include <boost/accumulators/accumulators.hpp>
  12. #include <boost/accumulators/numeric/functional/valarray.hpp>
  13. #include <boost/accumulators/statistics/stats.hpp>
  14. #include <boost/accumulators/statistics/min.hpp>
  15. #include <boost/accumulators/statistics/max.hpp>
  16. #include <boost/accumulators/statistics/mean.hpp>
  17. #include <boost/accumulators/statistics/weighted_mean.hpp>
  18. using namespace boost;
  19. using namespace unit_test;
  20. using namespace accumulators;
  21. template<typename T>
  22. typename boost::enable_if<is_floating_point<T> >::type is_equal_or_close(T const &left, T const &right)
  23. {
  24. BOOST_CHECK_CLOSE(left, right, 1e-5);
  25. }
  26. template<typename T>
  27. typename boost::disable_if<is_floating_point<T> >::type is_equal_or_close(T const &left, T const &right)
  28. {
  29. BOOST_CHECK_EQUAL(left, right);
  30. }
  31. template<typename T>
  32. void is_equal(std::valarray<T> const &left, std::valarray<T> const &right)
  33. {
  34. BOOST_CHECK_EQUAL(left.size(), right.size());
  35. if(left.size() == right.size())
  36. {
  37. for(std::size_t i = 0; i < left.size(); ++i)
  38. {
  39. is_equal_or_close(left[i], right[i]);
  40. }
  41. }
  42. }
  43. namespace std
  44. {
  45. template<typename T>
  46. inline std::ostream &operator <<(std::ostream &sout, std::valarray<T> const &arr)
  47. {
  48. sout << '(';
  49. for(std::size_t i = 0; i < arr.size(); ++i)
  50. {
  51. sout << arr[i] << ',';
  52. }
  53. sout << ')' << std::endl;
  54. return sout;
  55. }
  56. }
  57. ///////////////////////////////////////////////////////////////////////////////
  58. // test_stat
  59. //
  60. void test_stat()
  61. {
  62. typedef std::valarray<int> sample_t;
  63. // test sum
  64. {
  65. accumulator_set<sample_t, stats<tag::sum> > acc(sample = sample_t(0,3));
  66. acc(sample_t(1,3));
  67. acc(sample_t(2,3));
  68. acc(sample_t(3,3));
  69. is_equal(sample_t(6,3), sum(acc));
  70. }
  71. // test min and max
  72. {
  73. int s1[] = {1,2,3}, s2[] = {0,3,4}, s3[] = {2,1,4}, min_res[] = {0,1,3}, max_res[] = {2,3,4};
  74. accumulator_set<sample_t, stats<tag::min, tag::max> > acc(sample = sample_t(0,3));
  75. acc(sample_t(s1,3));
  76. acc(sample_t(s2,3));
  77. acc(sample_t(s3,3));
  78. is_equal(sample_t(min_res,3), (min)(acc));
  79. is_equal(sample_t(max_res,3), (max)(acc));
  80. }
  81. // test mean(lazy) and mean(immediate)
  82. {
  83. accumulator_set<sample_t, stats<tag::mean> > acc(sample = sample_t(0,3));
  84. acc(sample_t(1,3));
  85. is_equal(std::valarray<double>(1., 3), mean(acc));
  86. BOOST_CHECK_EQUAL(1u, count(acc));
  87. is_equal(sample_t(1, 3), sum(acc));
  88. acc(sample_t(0,3));
  89. is_equal(std::valarray<double>(0.5, 3), mean(acc));
  90. BOOST_CHECK_EQUAL(2u, count(acc));
  91. is_equal(sample_t(1, 3), sum(acc));
  92. acc(sample_t(2,3));
  93. is_equal(std::valarray<double>(1., 3), mean(acc));
  94. BOOST_CHECK_EQUAL(3u, count(acc));
  95. is_equal(sample_t(3, 3), sum(acc));
  96. accumulator_set<sample_t, stats<tag::mean(immediate)> > acc2(sample = sample_t(0,3));
  97. acc2(sample_t(1,3));
  98. is_equal(std::valarray<double>(1., 3), mean(acc2));
  99. BOOST_CHECK_EQUAL(1u, count(acc2));
  100. acc2(sample_t(0,3));
  101. is_equal(std::valarray<double>(0.5, 3), mean(acc2));
  102. BOOST_CHECK_EQUAL(2u, count(acc2));
  103. acc2(sample_t(2,3));
  104. is_equal(std::valarray<double>(1., 3), mean(acc2));
  105. BOOST_CHECK_EQUAL(3u, count(acc2));
  106. }
  107. // test weighted_mean
  108. {
  109. accumulator_set<sample_t, stats<tag::weighted_mean>, int> acc(sample = sample_t(0,3));
  110. acc(sample_t(10,3), weight = 2); // 20
  111. BOOST_CHECK_EQUAL(2, sum_of_weights(acc)); //
  112. //
  113. acc(sample_t(6,3), weight = 3); // 18
  114. BOOST_CHECK_EQUAL(5, sum_of_weights(acc)); //
  115. //
  116. acc(sample_t(4,3), weight = 4); // 16
  117. BOOST_CHECK_EQUAL(9, sum_of_weights(acc)); //
  118. //
  119. acc(sample_t(6,3), weight = 5); //+ 30
  120. BOOST_CHECK_EQUAL(14, sum_of_weights(acc)); //
  121. //= 84 / 14 = 6
  122. is_equal(std::valarray<double>(6.,3), weighted_mean(acc));
  123. accumulator_set<sample_t, stats<tag::weighted_mean(immediate)>, int> acc2(sample = sample_t(0,3));
  124. acc2(sample_t(10,3), weight = 2); // 20
  125. BOOST_CHECK_EQUAL(2, sum_of_weights(acc2)); //
  126. //
  127. acc2(sample_t(6,3), weight = 3); // 18
  128. BOOST_CHECK_EQUAL(5, sum_of_weights(acc2)); //
  129. //
  130. acc2(sample_t(4,3), weight = 4); // 16
  131. BOOST_CHECK_EQUAL(9, sum_of_weights(acc2)); //
  132. //
  133. acc2(sample_t(6,3), weight = 5); //+ 30
  134. BOOST_CHECK_EQUAL(14, sum_of_weights(acc2));//
  135. //= 84 / 14 = 6
  136. is_equal(std::valarray<double>(6.,3), weighted_mean(acc2));
  137. }
  138. }
  139. ///////////////////////////////////////////////////////////////////////////////
  140. // init_unit_test_suite
  141. //
  142. test_suite* init_unit_test_suite( int argc, char* argv[] )
  143. {
  144. test_suite *test = BOOST_TEST_SUITE("valarray test");
  145. test->add(BOOST_TEST_CASE(&test_stat));
  146. return test;
  147. }