eval.pass.cpp 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. //===----------------------------------------------------------------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is dual licensed under the MIT and the University of Illinois Open
  6. // Source Licenses. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // REQUIRES: long_tests
  11. // <random>
  12. // template<class IntType = int>
  13. // class negative_binomial_distribution
  14. // template<class _URNG> result_type operator()(_URNG& g);
  15. #include <random>
  16. #include <numeric>
  17. #include <vector>
  18. #include <cassert>
  19. template <class T>
  20. inline
  21. T
  22. sqr(T x)
  23. {
  24. return x * x;
  25. }
  26. void
  27. test1()
  28. {
  29. typedef std::negative_binomial_distribution<> D;
  30. typedef std::minstd_rand G;
  31. G g;
  32. D d(5, .25);
  33. const int N = 1000000;
  34. std::vector<D::result_type> u;
  35. for (int i = 0; i < N; ++i)
  36. {
  37. D::result_type v = d(g);
  38. assert(d.min() <= v && v <= d.max());
  39. u.push_back(v);
  40. }
  41. double mean = std::accumulate(u.begin(), u.end(),
  42. double(0)) / u.size();
  43. double var = 0;
  44. double skew = 0;
  45. double kurtosis = 0;
  46. for (unsigned i = 0; i < u.size(); ++i)
  47. {
  48. double dbl = (u[i] - mean);
  49. double d2 = sqr(dbl);
  50. var += d2;
  51. skew += dbl * d2;
  52. kurtosis += d2 * d2;
  53. }
  54. var /= u.size();
  55. double dev = std::sqrt(var);
  56. skew /= u.size() * dev * var;
  57. kurtosis /= u.size() * var * var;
  58. kurtosis -= 3;
  59. double x_mean = d.k() * (1 - d.p()) / d.p();
  60. double x_var = x_mean / d.p();
  61. double x_skew = (2 - d.p()) / std::sqrt(d.k() * (1 - d.p()));
  62. double x_kurtosis = 6. / d.k() + sqr(d.p()) / (d.k() * (1 - d.p()));
  63. assert(std::abs((mean - x_mean) / x_mean) < 0.01);
  64. assert(std::abs((var - x_var) / x_var) < 0.01);
  65. assert(std::abs((skew - x_skew) / x_skew) < 0.01);
  66. assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.02);
  67. }
  68. void
  69. test2()
  70. {
  71. typedef std::negative_binomial_distribution<> D;
  72. typedef std::mt19937 G;
  73. G g;
  74. D d(30, .03125);
  75. const int N = 1000000;
  76. std::vector<D::result_type> u;
  77. for (int i = 0; i < N; ++i)
  78. {
  79. D::result_type v = d(g);
  80. assert(d.min() <= v && v <= d.max());
  81. u.push_back(v);
  82. }
  83. double mean = std::accumulate(u.begin(), u.end(),
  84. double(0)) / u.size();
  85. double var = 0;
  86. double skew = 0;
  87. double kurtosis = 0;
  88. for (unsigned i = 0; i < u.size(); ++i)
  89. {
  90. double dbl = (u[i] - mean);
  91. double d2 = sqr(dbl);
  92. var += d2;
  93. skew += dbl * d2;
  94. kurtosis += d2 * d2;
  95. }
  96. var /= u.size();
  97. double dev = std::sqrt(var);
  98. skew /= u.size() * dev * var;
  99. kurtosis /= u.size() * var * var;
  100. kurtosis -= 3;
  101. double x_mean = d.k() * (1 - d.p()) / d.p();
  102. double x_var = x_mean / d.p();
  103. double x_skew = (2 - d.p()) / std::sqrt(d.k() * (1 - d.p()));
  104. double x_kurtosis = 6. / d.k() + sqr(d.p()) / (d.k() * (1 - d.p()));
  105. assert(std::abs((mean - x_mean) / x_mean) < 0.01);
  106. assert(std::abs((var - x_var) / x_var) < 0.01);
  107. assert(std::abs((skew - x_skew) / x_skew) < 0.01);
  108. assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
  109. }
  110. void
  111. test3()
  112. {
  113. typedef std::negative_binomial_distribution<> D;
  114. typedef std::mt19937 G;
  115. G g;
  116. D d(40, .25);
  117. const int N = 1000000;
  118. std::vector<D::result_type> u;
  119. for (int i = 0; i < N; ++i)
  120. {
  121. D::result_type v = d(g);
  122. assert(d.min() <= v && v <= d.max());
  123. u.push_back(v);
  124. }
  125. double mean = std::accumulate(u.begin(), u.end(),
  126. double(0)) / u.size();
  127. double var = 0;
  128. double skew = 0;
  129. double kurtosis = 0;
  130. for (unsigned i = 0; i < u.size(); ++i)
  131. {
  132. double dbl = (u[i] - mean);
  133. double d2 = sqr(dbl);
  134. var += d2;
  135. skew += dbl * d2;
  136. kurtosis += d2 * d2;
  137. }
  138. var /= u.size();
  139. double dev = std::sqrt(var);
  140. skew /= u.size() * dev * var;
  141. kurtosis /= u.size() * var * var;
  142. kurtosis -= 3;
  143. double x_mean = d.k() * (1 - d.p()) / d.p();
  144. double x_var = x_mean / d.p();
  145. double x_skew = (2 - d.p()) / std::sqrt(d.k() * (1 - d.p()));
  146. double x_kurtosis = 6. / d.k() + sqr(d.p()) / (d.k() * (1 - d.p()));
  147. assert(std::abs((mean - x_mean) / x_mean) < 0.01);
  148. assert(std::abs((var - x_var) / x_var) < 0.01);
  149. assert(std::abs((skew - x_skew) / x_skew) < 0.01);
  150. assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.03);
  151. }
  152. void
  153. test4()
  154. {
  155. typedef std::negative_binomial_distribution<> D;
  156. typedef std::mt19937 G;
  157. G g;
  158. D d(40, 1);
  159. const int N = 1000;
  160. std::vector<D::result_type> u;
  161. for (int i = 0; i < N; ++i)
  162. {
  163. D::result_type v = d(g);
  164. assert(d.min() <= v && v <= d.max());
  165. u.push_back(v);
  166. }
  167. double mean = std::accumulate(u.begin(), u.end(),
  168. double(0)) / u.size();
  169. double var = 0;
  170. double skew = 0;
  171. double kurtosis = 0;
  172. for (unsigned i = 0; i < u.size(); ++i)
  173. {
  174. double dbl = (u[i] - mean);
  175. double d2 = sqr(dbl);
  176. var += d2;
  177. skew += dbl * d2;
  178. kurtosis += d2 * d2;
  179. }
  180. var /= u.size();
  181. double dev = std::sqrt(var);
  182. skew /= u.size() * dev * var;
  183. kurtosis /= u.size() * var * var;
  184. kurtosis -= 3;
  185. double x_mean = d.k() * (1 - d.p()) / d.p();
  186. double x_var = x_mean / d.p();
  187. // double x_skew = (2 - d.p()) / std::sqrt(d.k() * (1 - d.p()));
  188. // double x_kurtosis = 6. / d.k() + sqr(d.p()) / (d.k() * (1 - d.p()));
  189. assert(mean == x_mean);
  190. assert(var == x_var);
  191. }
  192. void
  193. test5()
  194. {
  195. typedef std::negative_binomial_distribution<> D;
  196. typedef std::mt19937 G;
  197. G g;
  198. D d(400, 0.5);
  199. const int N = 1000000;
  200. std::vector<D::result_type> u;
  201. for (int i = 0; i < N; ++i)
  202. {
  203. D::result_type v = d(g);
  204. assert(d.min() <= v && v <= d.max());
  205. u.push_back(v);
  206. }
  207. double mean = std::accumulate(u.begin(), u.end(),
  208. double(0)) / u.size();
  209. double var = 0;
  210. double skew = 0;
  211. double kurtosis = 0;
  212. for (unsigned i = 0; i < u.size(); ++i)
  213. {
  214. double dbl = (u[i] - mean);
  215. double d2 = sqr(dbl);
  216. var += d2;
  217. skew += dbl * d2;
  218. kurtosis += d2 * d2;
  219. }
  220. var /= u.size();
  221. double dev = std::sqrt(var);
  222. skew /= u.size() * dev * var;
  223. kurtosis /= u.size() * var * var;
  224. kurtosis -= 3;
  225. double x_mean = d.k() * (1 - d.p()) / d.p();
  226. double x_var = x_mean / d.p();
  227. double x_skew = (2 - d.p()) / std::sqrt(d.k() * (1 - d.p()));
  228. double x_kurtosis = 6. / d.k() + sqr(d.p()) / (d.k() * (1 - d.p()));
  229. assert(std::abs((mean - x_mean) / x_mean) < 0.01);
  230. assert(std::abs((var - x_var) / x_var) < 0.01);
  231. assert(std::abs((skew - x_skew) / x_skew) < 0.04);
  232. assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.05);
  233. }
  234. void
  235. test6()
  236. {
  237. typedef std::negative_binomial_distribution<> D;
  238. typedef std::mt19937 G;
  239. G g;
  240. D d(1, 0.05);
  241. const int N = 1000000;
  242. std::vector<D::result_type> u;
  243. for (int i = 0; i < N; ++i)
  244. {
  245. D::result_type v = d(g);
  246. assert(d.min() <= v && v <= d.max());
  247. u.push_back(v);
  248. }
  249. double mean = std::accumulate(u.begin(), u.end(),
  250. double(0)) / u.size();
  251. double var = 0;
  252. double skew = 0;
  253. double kurtosis = 0;
  254. for (unsigned i = 0; i < u.size(); ++i)
  255. {
  256. double dbl = (u[i] - mean);
  257. double d2 = sqr(dbl);
  258. var += d2;
  259. skew += dbl * d2;
  260. kurtosis += d2 * d2;
  261. }
  262. var /= u.size();
  263. double dev = std::sqrt(var);
  264. skew /= u.size() * dev * var;
  265. kurtosis /= u.size() * var * var;
  266. kurtosis -= 3;
  267. double x_mean = d.k() * (1 - d.p()) / d.p();
  268. double x_var = x_mean / d.p();
  269. double x_skew = (2 - d.p()) / std::sqrt(d.k() * (1 - d.p()));
  270. double x_kurtosis = 6. / d.k() + sqr(d.p()) / (d.k() * (1 - d.p()));
  271. assert(std::abs((mean - x_mean) / x_mean) < 0.01);
  272. assert(std::abs((var - x_var) / x_var) < 0.01);
  273. assert(std::abs((skew - x_skew) / x_skew) < 0.01);
  274. assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.03);
  275. }
  276. int main()
  277. {
  278. test1();
  279. test2();
  280. test3();
  281. test4();
  282. test5();
  283. test6();
  284. }