tail.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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 <boost/foreach.hpp>
  6. #include <boost/test/unit_test.hpp>
  7. #include <boost/accumulators/accumulators.hpp>
  8. #include <boost/accumulators/statistics/stats.hpp>
  9. #include <boost/accumulators/statistics/tail.hpp>
  10. #include <boost/accumulators/statistics/tail_variate.hpp>
  11. #include <boost/accumulators/statistics/variates/covariate.hpp>
  12. using namespace boost;
  13. using namespace unit_test;
  14. using namespace accumulators;
  15. template<typename Range>
  16. void check_tail(Range const &rng, char const *expected)
  17. {
  18. BOOST_FOREACH(int i, rng)
  19. {
  20. if(!*expected)
  21. {
  22. BOOST_CHECK(false);
  23. return;
  24. }
  25. BOOST_CHECK_EQUAL(i, *expected++);
  26. }
  27. BOOST_CHECK(!*expected);
  28. }
  29. ///////////////////////////////////////////////////////////////////////////////
  30. // test_right_tail
  31. //
  32. void test_right_tail()
  33. {
  34. accumulator_set<int, stats<tag::tail_weights<right>, tag::tail_variate<int, tag::covariate1, right> >, int > acc(
  35. right_tail_cache_size = 4
  36. );
  37. acc(010, weight = 2, covariate1 = 3);
  38. check_tail(tail(acc), "\10");
  39. check_tail(tail_variate(acc), "\3");
  40. check_tail(tail_weights(acc), "\2");
  41. acc(020, weight = 7, covariate1 = 1);
  42. check_tail(tail(acc), "\20\10");
  43. check_tail(tail_variate(acc), "\1\3");
  44. check_tail(tail_weights(acc), "\7\2");
  45. acc(014, weight = 6, covariate1 = 4);
  46. check_tail(tail(acc), "\20\14\10");
  47. check_tail(tail_variate(acc), "\1\4\3");
  48. check_tail(tail_weights(acc), "\7\6\2");
  49. acc(030, weight = 4, covariate1 = 5);
  50. check_tail(tail(acc), "\30\20\14\10");
  51. check_tail(tail_variate(acc), "\5\1\4\3");
  52. check_tail(tail_weights(acc), "\4\7\6\2");
  53. acc(001, weight = 1, covariate1 = 9);
  54. check_tail(tail(acc), "\30\20\14\10");
  55. check_tail(tail_variate(acc), "\5\1\4\3");
  56. check_tail(tail_weights(acc), "\4\7\6\2");
  57. acc(011, weight = 3, covariate1 = 7);
  58. check_tail(tail(acc), "\30\20\14\11");
  59. check_tail(tail_variate(acc), "\5\1\4\7");
  60. check_tail(tail_weights(acc), "\4\7\6\3");
  61. }
  62. ///////////////////////////////////////////////////////////////////////////////
  63. // test_left_tail
  64. //
  65. void test_left_tail()
  66. {
  67. accumulator_set<int, stats<tag::tail_weights<left>, tag::tail_variate<int, tag::covariate1, left> >, int > acc(
  68. left_tail_cache_size = 4
  69. );
  70. acc(010, weight = 2, covariate1 = 3);
  71. check_tail(tail(acc), "\10");
  72. check_tail(tail_variate(acc), "\3");
  73. check_tail(tail_weights(acc), "\2");
  74. acc(020, weight = 7, covariate1 = 1);
  75. check_tail(tail(acc), "\10\20");
  76. check_tail(tail_variate(acc), "\3\1");
  77. check_tail(tail_weights(acc), "\2\7");
  78. acc(014, weight = 6, covariate1 = 4);
  79. check_tail(tail(acc), "\10\14\20");
  80. check_tail(tail_variate(acc), "\3\4\1");
  81. check_tail(tail_weights(acc), "\2\6\7");
  82. acc(030, weight = 4, covariate1 = 5);
  83. check_tail(tail(acc), "\10\14\20\30");
  84. check_tail(tail_variate(acc), "\3\4\1\5");
  85. check_tail(tail_weights(acc), "\2\6\7\4");
  86. acc(001, weight = 1, covariate1 = 9);
  87. check_tail(tail(acc), "\1\10\14\20");
  88. check_tail(tail_variate(acc), "\x9\3\4\1");
  89. check_tail(tail_weights(acc), "\1\2\6\7");
  90. acc(011, weight = 3, covariate1 = 7);
  91. check_tail(tail(acc), "\1\10\11\14");
  92. check_tail(tail_variate(acc), "\x9\3\7\4");
  93. check_tail(tail_weights(acc), "\1\2\3\6");
  94. }
  95. ///////////////////////////////////////////////////////////////////////////////
  96. // init_unit_test_suite
  97. //
  98. test_suite* init_unit_test_suite( int argc, char* argv[] )
  99. {
  100. test_suite *test = BOOST_TEST_SUITE("tail test");
  101. test->add(BOOST_TEST_CASE(&test_right_tail));
  102. test->add(BOOST_TEST_CASE(&test_left_tail));
  103. return test;
  104. }