sum_kahan.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. // (C) Copyright Gaetano Mendola 2010, Simon West 2011.
  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 <boost/test/unit_test.hpp>
  6. #include <boost/accumulators/accumulators.hpp>
  7. #include <boost/accumulators/statistics/stats.hpp>
  8. #include <boost/accumulators/statistics/sum_kahan.hpp>
  9. #include <boost/accumulators/statistics/variates/covariate.hpp>
  10. #include <sstream>
  11. #include <boost/archive/text_oarchive.hpp>
  12. #include <boost/archive/text_iarchive.hpp>
  13. using namespace boost;
  14. using namespace unit_test;
  15. using namespace accumulators;
  16. ///////////////////////////////////////////////////////////////////////////////
  17. // test_sum_kahan
  18. //
  19. void test_sum_kahan()
  20. {
  21. accumulator_set<float, stats<tag::sum_kahan> > acc;
  22. BOOST_CHECK_EQUAL(0.0f, sum_kahan(acc));
  23. for (size_t i = 0; i < 1e6; ++i) {
  24. acc(1e-6f);
  25. }
  26. BOOST_CHECK_EQUAL(1.0f, sum_kahan(acc));
  27. }
  28. ///////////////////////////////////////////////////////////////////////////////
  29. // test_sum_of_weights_kahan
  30. //
  31. void test_sum_of_weights_kahan()
  32. {
  33. accumulator_set<float, stats<tag::sum_of_weights_kahan>, float > acc;
  34. BOOST_CHECK_EQUAL(0.0f, sum_of_weights_kahan(acc));
  35. for (size_t i = 0; i < 1e6; ++i) {
  36. acc(0, weight = 1e-6f);
  37. }
  38. BOOST_CHECK_EQUAL(1.0f, sum_of_weights_kahan(acc));
  39. }
  40. ///////////////////////////////////////////////////////////////////////////////
  41. // test_sum_of_variates_kahan
  42. //
  43. void test_sum_of_variates_kahan()
  44. {
  45. accumulator_set<
  46. float,
  47. stats<tag::sum_of_variates_kahan<float, tag::covariate1> >,
  48. float
  49. >
  50. acc;
  51. BOOST_CHECK_EQUAL(0.0f, sum_of_variates_kahan(acc));
  52. for (size_t i = 0; i < 1e6; ++i) {
  53. acc(0, covariate1 = 1e-6f);
  54. }
  55. BOOST_CHECK_EQUAL(1.0f, sum_of_variates_kahan(acc));
  56. }
  57. ///////////////////////////////////////////////////////////////////////////////
  58. // test_persistency
  59. //
  60. void test_persistency()
  61. {
  62. std::stringstream ss;
  63. {
  64. accumulator_set<
  65. float,
  66. stats<tag::sum_of_variates_kahan<float, tag::covariate1> >,
  67. float
  68. >
  69. acc;
  70. BOOST_CHECK_EQUAL(0.0f, sum_of_variates_kahan(acc));
  71. for (size_t i = 0; i < 1e6; ++i) {
  72. acc(0, covariate1 = 1e-6f);
  73. }
  74. BOOST_CHECK_EQUAL(1.0f, sum_of_variates_kahan(acc));
  75. boost::archive::text_oarchive oa(ss);
  76. acc.serialize(oa, 0);
  77. }
  78. accumulator_set<
  79. float,
  80. stats<tag::sum_of_variates_kahan<float, tag::covariate1> >,
  81. float
  82. >
  83. acc;
  84. boost::archive::text_iarchive ia(ss);
  85. acc.serialize(ia, 0);
  86. BOOST_CHECK_EQUAL(1.0f, sum_of_variates_kahan(acc));
  87. }
  88. ///////////////////////////////////////////////////////////////////////////////
  89. // init_unit_test_suite
  90. //
  91. test_suite* init_unit_test_suite( int argc, char* argv[] )
  92. {
  93. test_suite *test = BOOST_TEST_SUITE("sum kahan tests");
  94. test->add(BOOST_TEST_CASE(&test_sum_kahan));
  95. test->add(BOOST_TEST_CASE(&test_sum_of_weights_kahan));
  96. test->add(BOOST_TEST_CASE(&test_sum_of_variates_kahan));
  97. test->add(BOOST_TEST_CASE(&test_persistency));
  98. return test;
  99. }