test_discrete_distribution.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. /* test_discrete_distribution.cpp
  2. *
  3. * Copyright Steven Watanabe 2010
  4. * Distributed under the Boost Software License, Version 1.0. (See
  5. * accompanying file LICENSE_1_0.txt or copy at
  6. * http://www.boost.org/LICENSE_1_0.txt)
  7. *
  8. * $Id$
  9. *
  10. */
  11. #include <boost/random/discrete_distribution.hpp>
  12. #include <boost/random/linear_congruential.hpp>
  13. #include <boost/assign/list_of.hpp>
  14. #include <sstream>
  15. #include <vector>
  16. #include "concepts.hpp"
  17. #define BOOST_TEST_MAIN
  18. #include <boost/test/unit_test.hpp>
  19. using boost::random::test::RandomNumberDistribution;
  20. using boost::random::discrete_distribution;
  21. BOOST_CONCEPT_ASSERT((RandomNumberDistribution< discrete_distribution<> >));
  22. struct gen {
  23. double operator()(double arg) {
  24. if(arg < 100) return 100;
  25. else if(arg < 103) return 1;
  26. else if(arg < 107) return 2;
  27. else if(arg < 111) return 1;
  28. else if(arg < 114) return 4;
  29. else return 100;
  30. }
  31. };
  32. #define CHECK_PROBABILITIES(actual, expected) \
  33. do { \
  34. std::vector<double> _actual = (actual); \
  35. std::vector<double> _expected = (expected); \
  36. BOOST_CHECK_EQUAL_COLLECTIONS( \
  37. _actual.begin(), _actual.end(), \
  38. _expected.begin(), _expected.end()); \
  39. } while(false)
  40. using boost::assign::list_of;
  41. BOOST_AUTO_TEST_CASE(test_constructors) {
  42. boost::random::discrete_distribution<> dist;
  43. CHECK_PROBABILITIES(dist.probabilities(), list_of(1.0));
  44. #ifndef BOOST_NO_CXX11_HDR_INITIALIZER_LIST
  45. boost::random::discrete_distribution<> dist_il = { 1, 2, 1, 4 };
  46. CHECK_PROBABILITIES(dist_il.probabilities(), list_of(.125)(.25)(.125)(.5));
  47. #endif
  48. std::vector<double> probs = boost::assign::list_of(1.0)(2.0)(1.0)(4.0);
  49. boost::random::discrete_distribution<> dist_r(probs);
  50. CHECK_PROBABILITIES(dist_r.probabilities(), list_of(.125)(.25)(.125)(.5));
  51. boost::random::discrete_distribution<> dist_it(probs.begin(), probs.end());
  52. CHECK_PROBABILITIES(dist_it.probabilities(), list_of(.125)(.25)(.125)(.5));
  53. boost::random::discrete_distribution<> dist_fun(4, 99, 115, gen());
  54. CHECK_PROBABILITIES(dist_fun.probabilities(), list_of(.125)(.25)(.125)(.5));
  55. boost::random::discrete_distribution<> copy(dist);
  56. BOOST_CHECK_EQUAL(dist, copy);
  57. boost::random::discrete_distribution<> copy_r(dist_r);
  58. BOOST_CHECK_EQUAL(dist_r, copy_r);
  59. boost::random::discrete_distribution<> notpow2(3, 99, 111, gen());
  60. BOOST_REQUIRE_EQUAL(notpow2.probabilities().size(), 3u);
  61. BOOST_CHECK_CLOSE_FRACTION(notpow2.probabilities()[0], 0.25, 0.00000000001);
  62. BOOST_CHECK_CLOSE_FRACTION(notpow2.probabilities()[1], 0.50, 0.00000000001);
  63. BOOST_CHECK_CLOSE_FRACTION(notpow2.probabilities()[2], 0.25, 0.00000000001);
  64. boost::random::discrete_distribution<> copy_notpow2(notpow2);
  65. BOOST_CHECK_EQUAL(notpow2, copy_notpow2);
  66. }
  67. BOOST_AUTO_TEST_CASE(test_param) {
  68. std::vector<double> probs = boost::assign::list_of(1.0)(2.0)(1.0)(4.0);
  69. boost::random::discrete_distribution<> dist(probs);
  70. boost::random::discrete_distribution<>::param_type param = dist.param();
  71. CHECK_PROBABILITIES(param.probabilities(), list_of(.125)(.25)(.125)(.5));
  72. boost::random::discrete_distribution<> copy1(param);
  73. BOOST_CHECK_EQUAL(dist, copy1);
  74. boost::random::discrete_distribution<> copy2;
  75. copy2.param(param);
  76. BOOST_CHECK_EQUAL(dist, copy2);
  77. boost::random::discrete_distribution<>::param_type param_copy = param;
  78. BOOST_CHECK_EQUAL(param, param_copy);
  79. BOOST_CHECK(param == param_copy);
  80. BOOST_CHECK(!(param != param_copy));
  81. boost::random::discrete_distribution<>::param_type param_default;
  82. CHECK_PROBABILITIES(param_default.probabilities(), list_of(1.0));
  83. BOOST_CHECK(param != param_default);
  84. BOOST_CHECK(!(param == param_default));
  85. #ifndef BOOST_NO_CXX11_HDR_INITIALIZER_LIST
  86. boost::random::discrete_distribution<>::param_type
  87. parm_il = { 1, 2, 1, 4 };
  88. CHECK_PROBABILITIES(parm_il.probabilities(), list_of(.125)(.25)(.125)(.5));
  89. #endif
  90. boost::random::discrete_distribution<>::param_type parm_r(probs);
  91. CHECK_PROBABILITIES(parm_r.probabilities(), list_of(.125)(.25)(.125)(.5));
  92. boost::random::discrete_distribution<>::param_type
  93. parm_it(probs.begin(), probs.end());
  94. CHECK_PROBABILITIES(parm_it.probabilities(), list_of(.125)(.25)(.125)(.5));
  95. boost::random::discrete_distribution<>::param_type
  96. parm_fun(4, 99, 115, gen());
  97. CHECK_PROBABILITIES(parm_fun.probabilities(), list_of(.125)(.25)(.125)(.5));
  98. }
  99. BOOST_AUTO_TEST_CASE(test_min_max) {
  100. std::vector<double> probs = boost::assign::list_of(1.0)(2.0)(1.0);
  101. boost::random::discrete_distribution<> dist;
  102. BOOST_CHECK_EQUAL((dist.min)(), 0);
  103. BOOST_CHECK_EQUAL((dist.max)(), 0);
  104. boost::random::discrete_distribution<> dist_r(probs);
  105. BOOST_CHECK_EQUAL((dist_r.min)(), 0);
  106. BOOST_CHECK_EQUAL((dist_r.max)(), 2);
  107. }
  108. BOOST_AUTO_TEST_CASE(test_comparison) {
  109. std::vector<double> probs = boost::assign::list_of(1.0)(2.0)(1.0)(4.0);
  110. boost::random::discrete_distribution<> dist;
  111. boost::random::discrete_distribution<> dist_copy(dist);
  112. boost::random::discrete_distribution<> dist_r(probs);
  113. boost::random::discrete_distribution<> dist_r_copy(dist_r);
  114. BOOST_CHECK(dist == dist_copy);
  115. BOOST_CHECK(!(dist != dist_copy));
  116. BOOST_CHECK(dist_r == dist_r_copy);
  117. BOOST_CHECK(!(dist_r != dist_r_copy));
  118. BOOST_CHECK(dist != dist_r);
  119. BOOST_CHECK(!(dist == dist_r));
  120. }
  121. BOOST_AUTO_TEST_CASE(test_streaming) {
  122. std::vector<double> probs = boost::assign::list_of(1.0)(2.0)(1.0)(4.0);
  123. boost::random::discrete_distribution<> dist(probs);
  124. std::stringstream stream;
  125. stream << dist;
  126. boost::random::discrete_distribution<> restored_dist;
  127. stream >> restored_dist;
  128. BOOST_CHECK_EQUAL(dist, restored_dist);
  129. }
  130. BOOST_AUTO_TEST_CASE(test_generation) {
  131. std::vector<double> probs = boost::assign::list_of(0.0)(1.0);
  132. boost::minstd_rand0 gen;
  133. boost::random::discrete_distribution<> dist;
  134. boost::random::discrete_distribution<> dist_r(probs);
  135. for(int i = 0; i < 10; ++i) {
  136. int value = dist(gen);
  137. BOOST_CHECK_EQUAL(value, 0);
  138. int value_r = dist_r(gen);
  139. BOOST_CHECK_EQUAL(value_r, 1);
  140. int value_param = dist_r(gen, dist.param());
  141. BOOST_CHECK_EQUAL(value_param, 0);
  142. int value_r_param = dist(gen, dist_r.param());
  143. BOOST_CHECK_EQUAL(value_r_param, 1);
  144. }
  145. }