test_hyperexponential_distribution.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467
  1. /* test_hyperexponential_distribution.ipp
  2. *
  3. * Copyright 2014 Marco Guazzone (marco.guazzone@gmail.com)
  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. */
  9. #include <boost/math/tools/precision.hpp>
  10. #include <boost/random/hyperexponential_distribution.hpp>
  11. #include <boost/random/linear_congruential.hpp>
  12. #include <boost/random/lagged_fibonacci.hpp>
  13. #include <boost/assign/list_of.hpp>
  14. #include <limits>
  15. #include <sstream>
  16. #include <vector>
  17. #include "concepts.hpp"
  18. #define BOOST_TEST_MAIN
  19. #include <boost/test/unit_test.hpp>
  20. #define BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(T, actual, expected, tol)\
  21. do { \
  22. std::vector<T> x = (actual); \
  23. std::vector<T> y = (expected); \
  24. BOOST_CHECK_EQUAL( x.size(), y.size() ); \
  25. const std::size_t n = x.size(); \
  26. for (std::size_t i = 0; i < n; ++i) \
  27. { \
  28. BOOST_CHECK_CLOSE( x[i], y[i], tol ); \
  29. } \
  30. } while(false)
  31. namespace /*<unnamed>*/ { namespace detail {
  32. template <typename RealT>
  33. RealT make_tolerance()
  34. {
  35. // Tolerance is 100eps expressed as a percentage (as required by Boost.Build):
  36. return boost::math::tools::epsilon<RealT>() * 100 * 100;
  37. }
  38. }} // Namespace <unnamed>::detail
  39. BOOST_CONCEPT_ASSERT((boost::random::test::RandomNumberDistribution< boost::random::hyperexponential_distribution<> >));
  40. BOOST_AUTO_TEST_CASE( test_constructors )
  41. {
  42. const double tol = detail::make_tolerance<double>();
  43. // Test default ctor
  44. boost::random::hyperexponential_distribution<> dist;
  45. BOOST_CHECK_EQUAL(dist.num_phases(), 1u);
  46. BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, dist.probabilities(), boost::assign::list_of(1.0), tol);
  47. BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, dist.rates(), boost::assign::list_of(1.0), tol);
  48. #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) && !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX)
  49. // Test ctor from initializer_list with probabilities and rates
  50. boost::random::hyperexponential_distribution<> dist_il_p_r = {{1, 2, 3, 4 }, {1, 2, 3, 4}};
  51. BOOST_CHECK_EQUAL(dist_il_p_r.num_phases(), 4u);
  52. BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, dist_il_p_r.probabilities(), boost::assign::list_of(.1)(.2)(.3)(.4), tol);
  53. BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, dist_il_p_r.rates(), boost::assign::list_of(1.)(2.)(3.)(4.), tol);
  54. // Test ctor from initializer_list with rates
  55. boost::random::hyperexponential_distribution<> dist_il_r = {{1, 2, 3, 4}};
  56. BOOST_CHECK_EQUAL(dist_il_r.num_phases(), 4u);
  57. BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, dist_il_r.probabilities(), boost::assign::list_of(.25)(.25)(.25)(.25), tol);
  58. BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, dist_il_r.rates(), boost::assign::list_of(1.)(2.)(3.)(4.), tol);
  59. #endif
  60. const std::vector<double> probs = boost::assign::list_of(0.1)(0.2)(0.3)(0.4);
  61. const std::vector<double> rates = boost::assign::list_of(1.0)(2.0)(3.0)(4.0);
  62. // Test ctor from range
  63. boost::random::hyperexponential_distribution<> dist_r(probs, rates);
  64. BOOST_CHECK_EQUAL(dist_r.num_phases(), 4u);
  65. BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, dist_r.probabilities(), probs, tol);
  66. BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, dist_r.rates(), rates, tol);
  67. // Test ctor from iterators
  68. boost::random::hyperexponential_distribution<> dist_it(probs.begin(), probs.end(), rates.begin(), rates.end());
  69. BOOST_CHECK_EQUAL(dist_it.num_phases(), 4u);
  70. BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, dist_it.probabilities(), probs, tol);
  71. BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, dist_it.rates(), rates, tol);
  72. // Test ctor from rate iterators
  73. boost::random::hyperexponential_distribution<> dist_r_it(rates.begin(), rates.end());
  74. BOOST_CHECK_EQUAL(dist_r_it.num_phases(), 4u);
  75. BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, dist_r_it.probabilities(), boost::assign::list_of(.25)(.25)(.25)(.25), tol);
  76. BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, dist_r_it.rates(), rates, tol);
  77. // Test ctor from rate iterators #2
  78. {
  79. const double rates2[] = {1.0,2.0,3.0,4.0};
  80. boost::random::hyperexponential_distribution<> dist_r_it(rates2, rates2+4);
  81. BOOST_CHECK_EQUAL(dist_r_it.num_phases(), 4u);
  82. BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, dist_r_it.probabilities(), boost::assign::list_of(.25)(.25)(.25)(.25), tol);
  83. BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, dist_r_it.rates(), std::vector<double>(rates2, rates2+4), tol);
  84. }
  85. // Test ctor from rate range
  86. boost::random::hyperexponential_distribution<> dist_r_r(rates);
  87. BOOST_CHECK_EQUAL(dist_r_r.num_phases(), 4u);
  88. BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, dist_r_r.probabilities(), boost::assign::list_of(.25)(.25)(.25)(.25), tol);
  89. BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, dist_r_r.rates(), rates, tol);
  90. // Test copy ctor
  91. boost::random::hyperexponential_distribution<> cp(dist);
  92. BOOST_CHECK_EQUAL(cp, dist);
  93. boost::random::hyperexponential_distribution<> cp_r(dist_r);
  94. BOOST_CHECK_EQUAL(cp_r, dist_r);
  95. }
  96. BOOST_AUTO_TEST_CASE( test_param )
  97. {
  98. const double tol = detail::make_tolerance<double>();
  99. const std::vector<double> probs = boost::assign::list_of(0.1)(0.2)(0.3)(0.4);
  100. const std::vector<double> rates = boost::assign::list_of(1.0)(2.0)(3.0)(4.0);
  101. // Test param getter
  102. boost::random::hyperexponential_distribution<> dist(probs, rates);
  103. boost::random::hyperexponential_distribution<>::param_type param = dist.param();
  104. BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, dist.probabilities(), param.probabilities(), tol);
  105. BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, dist.rates(), param.rates(), tol);
  106. // Test ctor from param
  107. boost::random::hyperexponential_distribution<> cp1(param);
  108. BOOST_CHECK_EQUAL(cp1, dist);
  109. // Test param setter
  110. boost::random::hyperexponential_distribution<> cp2;
  111. cp2.param(param);
  112. BOOST_CHECK_EQUAL(cp2, dist);
  113. // Test param constructors & operators
  114. boost::random::hyperexponential_distribution<>::param_type param_copy = param;
  115. BOOST_CHECK_EQUAL(param, param_copy);
  116. BOOST_CHECK(param == param_copy);
  117. BOOST_CHECK(!(param != param_copy));
  118. boost::random::hyperexponential_distribution<>::param_type param_default;
  119. BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, param_default.probabilities(), boost::assign::list_of(1.0), tol);
  120. BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, param_default.rates(), boost::assign::list_of(1.0), tol);
  121. BOOST_CHECK(param != param_default);
  122. BOOST_CHECK(!(param == param_default));
  123. #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) && !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX)
  124. boost::random::hyperexponential_distribution<>::param_type param_il = {{1, 2, 3, 4 }, {1, 2, 3, 4}};
  125. BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, param_il.probabilities(), boost::assign::list_of(.1)(.2)(.3)(.4), tol);
  126. BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, param_il.rates(), boost::assign::list_of(1.)(2.)(3.)(4.), tol);
  127. #endif
  128. boost::random::hyperexponential_distribution<>::param_type param_r(probs, rates);
  129. BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, param_r.probabilities(), probs, tol);
  130. BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, param_r.rates(), rates, tol);
  131. boost::random::hyperexponential_distribution<>::param_type param_it(probs.begin(), probs.end(), rates.begin(), rates.end());
  132. BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, param_it.probabilities(), probs, tol);
  133. BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, param_it.rates(), rates, tol);
  134. }
  135. BOOST_AUTO_TEST_CASE( test_min_max )
  136. {
  137. //const double tol = detail::make_tolerance<double>();
  138. const std::vector<double> probs = boost::assign::list_of(0.1)(0.2)(0.3)(0.4);
  139. const std::vector<double> rates = boost::assign::list_of(1.0)(2.0)(3.0)(4.0);
  140. boost::random::hyperexponential_distribution<> dist;
  141. BOOST_CHECK_EQUAL((dist.min)(), 0);
  142. BOOST_CHECK_EQUAL((dist.max)(), (std::numeric_limits<double>::infinity)());
  143. boost::random::hyperexponential_distribution<> dist_r(probs, rates);
  144. BOOST_CHECK_EQUAL((dist_r.min)(), 0);
  145. BOOST_CHECK_EQUAL((dist_r.max)(), (std::numeric_limits<double>::infinity)());
  146. }
  147. BOOST_AUTO_TEST_CASE(test_comparison)
  148. {
  149. //const double tol = detail::make_tolerance<double>();
  150. const std::vector<double> probs = boost::assign::list_of(0.1)(0.2)(0.3)(0.4);
  151. const std::vector<double> rates = boost::assign::list_of(1.0)(2.0)(3.0)(4.0);
  152. boost::random::hyperexponential_distribution<> dist;
  153. boost::random::hyperexponential_distribution<> dist_copy(dist);
  154. boost::random::hyperexponential_distribution<> dist_r(probs, rates);
  155. boost::random::hyperexponential_distribution<> dist_r_copy(dist_r);
  156. BOOST_CHECK(dist == dist_copy);
  157. BOOST_CHECK(!(dist != dist_copy));
  158. BOOST_CHECK(dist_r == dist_r_copy);
  159. BOOST_CHECK(!(dist_r != dist_r_copy));
  160. BOOST_CHECK(dist != dist_r);
  161. BOOST_CHECK(!(dist == dist_r));
  162. }
  163. BOOST_AUTO_TEST_CASE( test_streaming )
  164. {
  165. //const double tol = detail::make_tolerance<double>();
  166. const std::vector<double> probs = boost::assign::list_of(0.1)(0.2)(0.3)(0.4);
  167. const std::vector<double> rates = boost::assign::list_of(1.0)(2.0)(3.0)(4.0);
  168. const std::vector<double> empty_vector;
  169. // Test the reading of param_type
  170. // - Test with valid input
  171. {
  172. boost::random::hyperexponential_distribution<>::param_type parm(probs, rates);
  173. std::stringstream ss;
  174. ss << parm;
  175. boost::random::hyperexponential_distribution<>::param_type restored_parm;
  176. ss >> restored_parm;
  177. BOOST_CHECK_EQUAL(parm, restored_parm);
  178. }
  179. // - Test with an empty probability vector and ios_base exceptions disabled
  180. {
  181. std::stringstream ss;
  182. boost::random::detail::print_vector(ss, empty_vector);
  183. ss << ' ';
  184. boost::random::detail::print_vector(ss, rates);
  185. boost::random::hyperexponential_distribution<>::param_type param;
  186. ss >> param;
  187. boost::random::hyperexponential_distribution<>::param_type check_param(std::vector<double>(rates.size(), 1), rates);
  188. BOOST_CHECK_EQUAL(param, check_param);
  189. }
  190. // - Test with an empty rate vector and ios_base exceptions disabled
  191. {
  192. std::stringstream ss;
  193. boost::random::detail::print_vector(ss, probs);
  194. ss << ' ';
  195. boost::random::detail::print_vector(ss, empty_vector);
  196. boost::random::hyperexponential_distribution<>::param_type param;
  197. ss >> param;
  198. boost::random::hyperexponential_distribution<>::param_type check_param(probs, std::vector<double>(probs.size(), 1));
  199. BOOST_CHECK_EQUAL(param, check_param);
  200. }
  201. // - Test with an empty probability and rate vectors and ios_base exceptions disabled
  202. {
  203. std::stringstream ss;
  204. boost::random::detail::print_vector(ss, empty_vector);
  205. ss << ' ';
  206. boost::random::detail::print_vector(ss, empty_vector);
  207. boost::random::hyperexponential_distribution<>::param_type param;
  208. ss >> param;
  209. boost::random::hyperexponential_distribution<>::param_type check_param;
  210. BOOST_CHECK_EQUAL(param, check_param);
  211. }
  212. // - Test with an empty probability vector and ios_base exceptions enabled
  213. {
  214. std::stringstream ss;
  215. boost::random::detail::print_vector(ss, empty_vector);
  216. ss << ' ';
  217. boost::random::detail::print_vector(ss, rates);
  218. boost::random::hyperexponential_distribution<>::param_type param;
  219. ss.exceptions(std::ios_base::failbit);
  220. ss >> param;
  221. boost::random::hyperexponential_distribution<>::param_type check_param(std::vector<double>(rates.size(), 1), rates);
  222. BOOST_CHECK_EQUAL(param, check_param);
  223. }
  224. // - Test with an empty rate vector and ios_base exceptions enabled
  225. {
  226. std::stringstream ss;
  227. boost::random::detail::print_vector(ss, probs);
  228. ss << ' ';
  229. boost::random::detail::print_vector(ss, empty_vector);
  230. boost::random::hyperexponential_distribution<>::param_type param;
  231. ss.exceptions(std::ios_base::failbit);
  232. ss >> param;
  233. boost::random::hyperexponential_distribution<>::param_type check_param(probs, std::vector<double>(probs.size(), 1));
  234. BOOST_CHECK_EQUAL(param, check_param);
  235. }
  236. // - Test with an empty probability and rate vectors and ios_base exceptions enabled
  237. {
  238. std::stringstream ss;
  239. boost::random::detail::print_vector(ss, empty_vector);
  240. ss << ' ';
  241. boost::random::detail::print_vector(ss, empty_vector);
  242. boost::random::hyperexponential_distribution<>::param_type param;
  243. ss.exceptions(std::ios_base::failbit);
  244. ss >> param;
  245. boost::random::hyperexponential_distribution<>::param_type check_param;
  246. BOOST_CHECK_EQUAL(param, check_param);
  247. }
  248. // The the reading of hyperexponential_distribution
  249. // - Test with valid input
  250. {
  251. boost::random::hyperexponential_distribution<> dist(probs, rates);
  252. std::stringstream ss;
  253. ss << dist;
  254. boost::random::hyperexponential_distribution<> restored_dist;
  255. ss >> restored_dist;
  256. BOOST_CHECK_EQUAL(dist, restored_dist);
  257. }
  258. // - Test with an empty probability vector and ios_base exceptions disabled
  259. {
  260. std::stringstream ss;
  261. boost::random::detail::print_vector(ss, empty_vector);
  262. ss << ' ';
  263. boost::random::detail::print_vector(ss, rates);
  264. boost::random::hyperexponential_distribution<> dist;
  265. ss >> dist;
  266. boost::random::hyperexponential_distribution<> check_dist(std::vector<double>(rates.size(), 1), rates);
  267. BOOST_CHECK_EQUAL(dist, check_dist);
  268. }
  269. // - Test with an empty rate vector and ios_base exceptions disabled
  270. {
  271. std::stringstream ss;
  272. boost::random::detail::print_vector(ss, probs);
  273. ss << ' ';
  274. boost::random::detail::print_vector(ss, empty_vector);
  275. boost::random::hyperexponential_distribution<> dist;
  276. ss >> dist;
  277. boost::random::hyperexponential_distribution<> check_dist(probs, std::vector<double>(probs.size(), 1));
  278. BOOST_CHECK_EQUAL(dist, check_dist);
  279. }
  280. // - Test with an empty probability and rate vectors and ios_base exceptions disabled
  281. {
  282. std::stringstream ss;
  283. boost::random::detail::print_vector(ss, empty_vector);
  284. ss << ' ';
  285. boost::random::detail::print_vector(ss, empty_vector);
  286. boost::random::hyperexponential_distribution<> dist;
  287. ss >> dist;
  288. boost::random::hyperexponential_distribution<> check_dist;
  289. BOOST_CHECK_EQUAL(dist, check_dist);
  290. }
  291. // - Test with an empty probability vector and ios_base exceptions enabled
  292. {
  293. std::stringstream ss;
  294. boost::random::detail::print_vector(ss, empty_vector);
  295. ss << ' ';
  296. boost::random::detail::print_vector(ss, rates);
  297. boost::random::hyperexponential_distribution<> dist;
  298. ss.exceptions(std::ios_base::failbit);
  299. ss >> dist;
  300. boost::random::hyperexponential_distribution<> check_dist(std::vector<double>(rates.size(), 1), rates);
  301. BOOST_CHECK_EQUAL(dist, check_dist);
  302. }
  303. // - Test with an empty rate vector and ios_base exceptions enabled
  304. {
  305. std::stringstream ss;
  306. boost::random::detail::print_vector(ss, probs);
  307. ss << ' ';
  308. boost::random::detail::print_vector(ss, empty_vector);
  309. boost::random::hyperexponential_distribution<> dist;
  310. ss.exceptions(std::ios_base::failbit);
  311. ss >> dist;
  312. boost::random::hyperexponential_distribution<> check_dist(probs, std::vector<double>(probs.size(), 1));
  313. BOOST_CHECK_EQUAL(dist, check_dist);
  314. }
  315. // - Test with an empty probability and rate vectors and ios_base exceptions enabled
  316. {
  317. std::stringstream ss;
  318. boost::random::detail::print_vector(ss, empty_vector);
  319. ss << ' ';
  320. boost::random::detail::print_vector(ss, empty_vector);
  321. boost::random::hyperexponential_distribution<> dist;
  322. ss.exceptions(std::ios_base::failbit);
  323. ss >> dist;
  324. boost::random::hyperexponential_distribution<> check_dist;
  325. BOOST_CHECK_EQUAL(dist, check_dist);
  326. }
  327. }
  328. //NOTE: test case commented since normalization check in \c hyperexp_detail::check_probabilities has been currently commented
  329. //BOOST_AUTO_TEST_CASE( test_normalization )
  330. //{
  331. // const double tol = detail::make_tolerance<double>();
  332. //
  333. // const std::vector<double> probs = boost::assign::list_of(1023.0)(1.0);
  334. // const std::vector<double> rates = boost::assign::list_of(1023.0)(1.0);
  335. // const std::vector<double> norm_probs = boost::assign::list_of(1023.0/1024.0)(1.0/1024.0);
  336. //
  337. // boost::random::hyperexponential_distribution<> dist(probs, rates);
  338. // BOOST_CHECK( boost::random::hyperexp_detail::check_params(dist.probabilities(), dist.rates()) );
  339. // BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, dist.probabilities(), norm_probs, tol);
  340. //
  341. // const std::vector<double> probs2 = boost::assign::list_of(1001.0)(1.0);
  342. // const std::vector<double> rates2 = boost::assign::list_of(1001.0)(1.0);
  343. // const std::vector<double> norm_probs2 = boost::assign::list_of(1001.0/1002.0)(1.0/1002.0);
  344. //
  345. // boost::random::hyperexponential_distribution<> dist2(probs2, rates2);
  346. // BOOST_CHECK( boost::random::hyperexp_detail::check_params(dist2.probabilities(), dist2.rates()) );
  347. // BOOST_RANDOM_HYPEREXP_CHECK_CLOSE_COLLECTIONS(double, dist2.probabilities(), norm_probs2, tol);
  348. //}
  349. void use(boost::random::hyperexponential_distribution<>::result_type) {}
  350. BOOST_AUTO_TEST_CASE(test_generation)
  351. {
  352. //const double tol = detail::make_tolerance<double>();
  353. const std::vector<double> probs = boost::assign::list_of(0.1)(0.2)(0.3)(0.4);
  354. const std::vector<double> rates = boost::assign::list_of(1.0)(2.0)(3.0)(4.0);
  355. boost::minstd_rand0 gen;
  356. boost::random::hyperexponential_distribution<> dist;
  357. boost::random::hyperexponential_distribution<> dist_r(probs, rates);
  358. typedef boost::random::hyperexponential_distribution<>::result_type result_type;
  359. for(std::size_t i = 0; i < 10; ++i)
  360. {
  361. const result_type value = dist(gen);
  362. use(value);
  363. BOOST_CHECK_GE(value, static_cast<result_type>(0));
  364. const result_type value_r = dist_r(gen);
  365. use(value_r);
  366. BOOST_CHECK_GE(value_r, static_cast<result_type>(0));
  367. const result_type value_param = dist_r(gen, dist.param());
  368. use(value_param);
  369. BOOST_CHECK_GE(value_param, static_cast<result_type>(0));
  370. const result_type value_r_param = dist(gen, dist_r.param());
  371. use(value_r_param);
  372. BOOST_CHECK_GE(value_r_param, static_cast<result_type>(0));
  373. }
  374. }
  375. BOOST_AUTO_TEST_CASE( test_generation_float )
  376. {
  377. //const double tol = detail::make_tolerance<double>();
  378. const std::vector<double> probs = boost::assign::list_of(0.1)(0.2)(0.3)(0.4);
  379. const std::vector<double> rates = boost::assign::list_of(1.0)(2.0)(3.0)(4.0);
  380. boost::lagged_fibonacci607 gen;
  381. boost::random::hyperexponential_distribution<> dist;
  382. boost::random::hyperexponential_distribution<> dist_r(probs, rates);
  383. typedef boost::random::hyperexponential_distribution<>::result_type result_type;
  384. for(std::size_t i = 0; i < 10; ++i)
  385. {
  386. const result_type value = dist(gen);
  387. use(value);
  388. BOOST_CHECK_GE(value, static_cast<result_type>(0));
  389. const result_type value_r = dist_r(gen);
  390. use(value_r);
  391. BOOST_CHECK_GE(value_r, static_cast<result_type>(0));
  392. const result_type value_param = dist_r(gen, dist.param());
  393. use(value_param);
  394. BOOST_CHECK_GE(value_param, static_cast<result_type>(0));
  395. const result_type value_r_param = dist(gen, dist_r.param());
  396. use(value_r_param);
  397. BOOST_CHECK_GE(value_r_param, static_cast<result_type>(0));
  398. }
  399. }