BetaTest.php 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095
  1. <?php
  2. namespace MathPHP\Tests\Probability\Distribution\Continuous;
  3. use MathPHP\Exception;
  4. use MathPHP\Probability\Distribution\Continuous\Beta;
  5. class BetaTest extends \PHPUnit\Framework\TestCase
  6. {
  7. /**
  8. * @test pdf
  9. * @dataProvider dataProviderForPdf
  10. * @param float $x
  11. * @param float $α
  12. * @param float $β
  13. * @param float $expected_pdf
  14. */
  15. public function testPdf(float $x, float $α, float $β, float $expected_pdf)
  16. {
  17. // Given
  18. $beta = new Beta($α, $β);
  19. // When
  20. $pdf = $beta->pdf($x);
  21. // Then
  22. $this->assertEqualsWithDelta($expected_pdf, $pdf, 0.0000001);
  23. }
  24. /**
  25. * @return array [x, α, β, pdf]
  26. * Generated with http://keisan.casio.com/exec/system/1180573226
  27. */
  28. public function dataProviderForPdf(): array
  29. {
  30. return [
  31. [0, 1, 1, 1],
  32. [0.01, 1, 1, 1],
  33. [0.15, 1, 1, 1],
  34. [0.81, 1, 1, 1],
  35. [0.99, 1, 1, 1],
  36. [1, 1, 1, 1],
  37. [0, 2, 3, 0],
  38. [0.01, 2, 3, 0.117612],
  39. [0.02, 2, 3, 0.230496],
  40. [0.03, 2, 3, 0.338724],
  41. [0.04, 2, 3, 0.442368],
  42. [0.05, 2, 3, 0.5415],
  43. [0.06, 2, 3, 0.636192],
  44. [0.07, 2, 3, 0.726516],
  45. [0.08, 2, 3, 0.812544],
  46. [0.09, 2, 3, 0.894348],
  47. [0.1, 2, 3, 0.972],
  48. [0.11, 2, 3, 1.045572],
  49. [0.12, 2, 3, 1.115136],
  50. [0.13, 2, 3, 1.180764],
  51. [0.14, 2, 3, 1.242528],
  52. [0.15, 2, 3, 1.3005],
  53. [0.16, 2, 3, 1.354752],
  54. [0.17, 2, 3, 1.405356],
  55. [0.18, 2, 3, 1.452384],
  56. [0.19, 2, 3, 1.495908],
  57. [0.2, 2, 3, 1.536],
  58. [0.21, 2, 3, 1.572732],
  59. [0.22, 2, 3, 1.606176],
  60. [0.23, 2, 3, 1.636404],
  61. [0.24, 2, 3, 1.663488],
  62. [0.25, 2, 3, 1.6875],
  63. [0.26, 2, 3, 1.708512],
  64. [0.27, 2, 3, 1.726596],
  65. [0.28, 2, 3, 1.741824],
  66. [0.29, 2, 3, 1.754268],
  67. [0.3, 2, 3, 1.764],
  68. [0.31, 2, 3, 1.771092],
  69. [0.32, 2, 3, 1.775616],
  70. [0.33, 2, 3, 1.777644],
  71. [0.34, 2, 3, 1.777248],
  72. [0.35, 2, 3, 1.7745],
  73. [0.36, 2, 3, 1.769472],
  74. [0.37, 2, 3, 1.762236],
  75. [0.38, 2, 3, 1.752864],
  76. [0.39, 2, 3, 1.741428],
  77. [0.4, 2, 3, 1.728],
  78. [0.41, 2, 3, 1.712652],
  79. [0.42, 2, 3, 1.695456],
  80. [0.43, 2, 3, 1.676484],
  81. [0.44, 2, 3, 1.655808],
  82. [0.45, 2, 3, 1.6335],
  83. [0.46, 2, 3, 1.609632],
  84. [0.47, 2, 3, 1.584276],
  85. [0.48, 2, 3, 1.557504],
  86. [0.49, 2, 3, 1.529388],
  87. [0.5, 2, 3, 1.5],
  88. [0.51, 2, 3, 1.469412],
  89. [0.52, 2, 3, 1.437696],
  90. [0.53, 2, 3, 1.404924],
  91. [0.54, 2, 3, 1.371168],
  92. [0.55, 2, 3, 1.3365],
  93. [0.56, 2, 3, 1.300992],
  94. [0.57, 2, 3, 1.264716],
  95. [0.58, 2, 3, 1.227744],
  96. [0.59, 2, 3, 1.190148],
  97. [0.6, 2, 3, 1.152],
  98. [0.61, 2, 3, 1.113372],
  99. [0.62, 2, 3, 1.074336],
  100. [0.63, 2, 3, 1.034964],
  101. [0.64, 2, 3, 0.995328],
  102. [0.65, 2, 3, 0.9555],
  103. [0.66, 2, 3, 0.915552],
  104. [0.67, 2, 3, 0.875556],
  105. [0.68, 2, 3, 0.835584],
  106. [0.69, 2, 3, 0.795708],
  107. [0.7, 2, 3, 0.756],
  108. [0.71, 2, 3, 0.716532],
  109. [0.72, 2, 3, 0.677376],
  110. [0.73, 2, 3, 0.638604],
  111. [0.74, 2, 3, 0.600288],
  112. [0.75, 2, 3, 0.5625],
  113. [0.76, 2, 3, 0.525312],
  114. [0.77, 2, 3, 0.488796],
  115. [0.78, 2, 3, 0.453024],
  116. [0.79, 2, 3, 0.418068],
  117. [0.8, 2, 3, 0.384],
  118. [0.81, 2, 3, 0.350892],
  119. [0.82, 2, 3, 0.318816],
  120. [0.83, 2, 3, 0.287844],
  121. [0.84, 2, 3, 0.258048],
  122. [0.85, 2, 3, 0.2295],
  123. [0.86, 2, 3, 0.202272],
  124. [0.87, 2, 3, 0.176436],
  125. [0.88, 2, 3, 0.152064],
  126. [0.89, 2, 3, 0.129228],
  127. [0.9, 2, 3, 0.108],
  128. [0.91, 2, 3, 0.088452],
  129. [0.92, 2, 3, 0.070656],
  130. [0.93, 2, 3, 0.054684],
  131. [0.94, 2, 3, 0.040608],
  132. [0.95, 2, 3, 0.0285],
  133. [0.96, 2, 3, 0.018432],
  134. [0.97, 2, 3, 0.010476],
  135. [0.98, 2, 3, 0.004704],
  136. [0.99, 2, 3, 0.001188],
  137. [1, 2, 3, 0],
  138. [0, 5.3, 4.1, 0],
  139. [0.01, 5.3, 4.1, 8.992682837E-7],
  140. [0.02, 5.3, 4.1, 1.716524432E-5],
  141. [0.03, 5.3, 4.1, 9.506790967E-5],
  142. [0.04, 5.3, 4.1, 3.17189614E-4],
  143. [0.05, 5.3, 4.1, 8.01556921E-4],
  144. [0.06, 5.3, 4.1, 0.0016988964],
  145. [0.07, 5.3, 4.1, 0.003188885207],
  146. [0.08, 5.3, 4.1, 0.005475822755],
  147. [0.09, 5.3, 4.1, 0.008783978823],
  148. [0.1, 5.3, 4.1, 0.01335278796],
  149. [0.11, 5.3, 4.1, 0.01943201066],
  150. [0.12, 5.3, 4.1, 0.02727695046],
  151. [0.13, 5.3, 4.1, 0.03714379479],
  152. [0.14, 5.3, 4.1, 0.04928513217],
  153. [0.15, 5.3, 4.1, 0.06394568691],
  154. [0.16, 5.3, 4.1, 0.08135830378],
  155. [0.17, 5.3, 4.1, 0.1017402081],
  156. [0.18, 5.3, 4.1, 0.125289561],
  157. [0.19, 5.3, 4.1, 0.1521823254],
  158. [0.2, 5.3, 4.1, 0.182569453],
  159. [0.21, 5.3, 4.1, 0.2165744019],
  160. [0.22, 5.3, 4.1, 0.254290988],
  161. [0.23, 5.3, 4.1, 0.2957815744],
  162. [0.24, 5.3, 4.1, 0.3410755976],
  163. [0.25, 5.3, 4.1, 0.3901684309],
  164. [0.26, 5.3, 4.1, 0.4430205794],
  165. [0.27, 5.3, 4.1, 0.4995572033],
  166. [0.28, 5.3, 4.1, 0.5596679626],
  167. [0.29, 5.3, 4.1, 0.6232071758],
  168. [0.3, 5.3, 4.1, 0.6899942834],
  169. [0.31, 5.3, 4.1, 0.7598146065],
  170. [0.32, 5.3, 4.1, 0.8324203897],
  171. [0.33, 5.3, 4.1, 0.9075321165],
  172. [0.34, 5.3, 4.1, 0.9848400846],
  173. [0.35, 5.3, 4.1, 1.064006227],
  174. [0.36, 5.3, 4.1, 1.144666166],
  175. [0.37, 5.3, 4.1, 1.226431482],
  176. [0.38, 5.3, 4.1, 1.30889219],
  177. [0.39, 5.3, 4.1, 1.391619392],
  178. [0.4, 5.3, 4.1, 1.474168111],
  179. [0.41, 5.3, 4.1, 1.55608026],
  180. [0.42, 5.3, 4.1, 1.636887763],
  181. [0.43, 5.3, 4.1, 1.716115781],
  182. [0.44, 5.3, 4.1, 1.793286033],
  183. [0.45, 5.3, 4.1, 1.867920206],
  184. [0.46, 5.3, 4.1, 1.939543413],
  185. [0.47, 5.3, 4.1, 2.007687699],
  186. [0.48, 5.3, 4.1, 2.071895558],
  187. [0.49, 5.3, 4.1, 2.131723453],
  188. [0.5, 5.3, 4.1, 2.186745318],
  189. [0.51, 5.3, 4.1, 2.23655601],
  190. [0.52, 5.3, 4.1, 2.2807747],
  191. [0.53, 5.3, 4.1, 2.319048184],
  192. [0.54, 5.3, 4.1, 2.351054078],
  193. [0.55, 5.3, 4.1, 2.376503897],
  194. [0.56, 5.3, 4.1, 2.395145972],
  195. [0.57, 5.3, 4.1, 2.406768202],
  196. [0.58, 5.3, 4.1, 2.411200616],
  197. [0.59, 5.3, 4.1, 2.408317709],
  198. [0.6, 5.3, 4.1, 2.398040553],
  199. [0.61, 5.3, 4.1, 2.380338635],
  200. [0.62, 5.3, 4.1, 2.355231427],
  201. [0.63, 5.3, 4.1, 2.322789641],
  202. [0.64, 5.3, 4.1, 2.283136168],
  203. [0.65, 5.3, 4.1, 2.236446659],
  204. [0.66, 5.3, 4.1, 2.182949752],
  205. [0.67, 5.3, 4.1, 2.122926892],
  206. [0.68, 5.3, 4.1, 2.056711757],
  207. [0.69, 5.3, 4.1, 1.984689236],
  208. [0.7, 5.3, 4.1, 1.907293967],
  209. [0.71, 5.3, 4.1, 1.825008394],
  210. [0.72, 5.3, 4.1, 1.73836034],
  211. [0.73, 5.3, 4.1, 1.647920061],
  212. [0.74, 5.3, 4.1, 1.554296779],
  213. [0.75, 5.3, 4.1, 1.458134658],
  214. [0.76, 5.3, 4.1, 1.360108233],
  215. [0.77, 5.3, 4.1, 1.260917242],
  216. [0.78, 5.3, 4.1, 1.16128088],
  217. [0.79, 5.3, 4.1, 1.061931442],
  218. [0.8, 5.3, 4.1, 0.96360735],
  219. [0.81, 5.3, 4.1, 0.8670455576],
  220. [0.82, 5.3, 4.1, 0.7729733206],
  221. [0.83, 5.3, 4.1, 0.6820993361],
  222. [0.84, 5.3, 4.1, 0.5951042469],
  223. [0.85, 5.3, 4.1, 0.5126305178],
  224. [0.86, 5.3, 4.1, 0.4352716926],
  225. [0.87, 5.3, 4.1, 0.3635610522],
  226. [0.88, 5.3, 4.1, 0.2979596986],
  227. [0.89, 5.3, 4.1, 0.2388441045],
  228. [0.9, 5.3, 4.1, 0.1864931841],
  229. [0.91, 5.3, 4.1, 0.1410749612],
  230. [0.92, 5.3, 4.1, 0.1026329449],
  231. [0.93, 5.3, 4.1, 0.07107236645],
  232. [0.94, 5.3, 4.1, 0.04614650559],
  233. [0.95, 5.3, 4.1, 0.0274434489],
  234. [0.96, 5.3, 4.1, 0.01437382816],
  235. [0.97, 5.3, 4.1, 0.006160479551],
  236. [0.98, 5.3, 4.1, 0.001831830498],
  237. [0.99, 5.3, 4.1, 2.231780662E-4],
  238. [1, 5.3, 4.1, 0],
  239. [0, 3, 2, 0],
  240. [0.01, 3, 2, 0.001188],
  241. [0.15, 3, 2, 0.2295],
  242. [0.81, 3, 2, 1.495908],
  243. [0.99, 3, 2, 0.117612],
  244. [1, 3, 2, 0],
  245. [0, 10, 50, 0],
  246. [0.01, 10, 50, 3.8395492E-7],
  247. [0.15, 10, 50, 8.404355],
  248. [0.81, 10, 50, 3.3949479E-26],
  249. [0.99, 10, 50, 5.739479E-87],
  250. [1, 10, 50, 0],
  251. ];
  252. }
  253. /**
  254. * @test Constructor throws an Exception\OutOfBoundsException if alpha or beta is less than or equal to zero
  255. * @dataProvider dataProviderForPdfAlphaBetaOutOfBoundsException
  256. * @param float $α
  257. * @param float $β
  258. */
  259. public function testConstructorExceptionAlphaBetaLessThanEqualZero(float $α, float $β)
  260. {
  261. // Then
  262. $this->expectException(Exception\OutOfBoundsException::class);
  263. // When
  264. new Beta($α, $β);
  265. }
  266. /**
  267. * @return array [α, β]
  268. */
  269. public function dataProviderForPdfAlphaBetaOutOfBoundsException(): array
  270. {
  271. return [
  272. [1, -3],
  273. [1, -2],
  274. [1, -1],
  275. [1, 0],
  276. [-3, 1],
  277. [-2, 1],
  278. [-1, 1],
  279. [0, 1],
  280. ];
  281. }
  282. /**
  283. * @test pdf throws an Exception\OutOfBoundsException if the support x is less than 0 or greater than 1
  284. * @dataProvider dataProviderForPdfSupportOutOfBoundsException
  285. * @param float $x
  286. */
  287. public function testPdfExceptionXOutOfBounds(float $x)
  288. {
  289. // Given
  290. [$α, $β] = [1, 1];
  291. $beta = new Beta($α, $β);
  292. // Then
  293. $this->expectException(Exception\OutOfBoundsException::class);
  294. // When
  295. $beta->pdf($x);
  296. }
  297. /**
  298. * @return array
  299. */
  300. public function dataProviderForPdfSupportOutOfBoundsException(): array
  301. {
  302. return [
  303. [-3],
  304. [-2],
  305. [-1],
  306. [-0.01],
  307. [1.01],
  308. [2],
  309. [3],
  310. ];
  311. }
  312. /**
  313. * @test cdf
  314. * @dataProvider dataProviderForCdf
  315. * @param float $x
  316. * @param float $α
  317. * @param float $β
  318. * @param float $expected_cdf
  319. */
  320. public function testCdf($x, $α, $β, $expected_cdf)
  321. {
  322. // Given
  323. $beta = new Beta($α, $β);
  324. // When
  325. $cdf = $beta->cdf($x);
  326. // Then
  327. $this->assertEqualsWithDelta($expected_cdf, $cdf, 0.000001);
  328. }
  329. /**
  330. * @return array [x, α, β, cdf]
  331. * Generated with http://keisan.casio.com/exec/system/1180573226
  332. */
  333. public function dataProviderForCdf()
  334. {
  335. return [
  336. [0, 1, 1, 0],
  337. [0.01, 1, 1, 0.01],
  338. [0.02, 1, 1, 0.02],
  339. [0.03, 1, 1, 0.03],
  340. [0.04, 1, 1, 0.04],
  341. [0.05, 1, 1, 0.05],
  342. [0.06, 1, 1, 0.06],
  343. [0.07, 1, 1, 0.07],
  344. [0.08, 1, 1, 0.08],
  345. [0.09, 1, 1, 0.09],
  346. [0.1, 1, 1, 0.1],
  347. [0.11, 1, 1, 0.11],
  348. [0.12, 1, 1, 0.12],
  349. [0.13, 1, 1, 0.13],
  350. [0.14, 1, 1, 0.14],
  351. [0.15, 1, 1, 0.15],
  352. [0.16, 1, 1, 0.16],
  353. [0.17, 1, 1, 0.17],
  354. [0.18, 1, 1, 0.18],
  355. [0.19, 1, 1, 0.19],
  356. [0.2, 1, 1, 0.2],
  357. [0.21, 1, 1, 0.21],
  358. [0.22, 1, 1, 0.22],
  359. [0.23, 1, 1, 0.23],
  360. [0.24, 1, 1, 0.24],
  361. [0.25, 1, 1, 0.25],
  362. [0.26, 1, 1, 0.26],
  363. [0.27, 1, 1, 0.27],
  364. [0.28, 1, 1, 0.28],
  365. [0.29, 1, 1, 0.29],
  366. [0.3, 1, 1, 0.3],
  367. [0.31, 1, 1, 0.31],
  368. [0.32, 1, 1, 0.32],
  369. [0.33, 1, 1, 0.33],
  370. [0.34, 1, 1, 0.34],
  371. [0.35, 1, 1, 0.35],
  372. [0.36, 1, 1, 0.36],
  373. [0.37, 1, 1, 0.37],
  374. [0.38, 1, 1, 0.38],
  375. [0.39, 1, 1, 0.39],
  376. [0.4, 1, 1, 0.4],
  377. [0.41, 1, 1, 0.41],
  378. [0.42, 1, 1, 0.42],
  379. [0.43, 1, 1, 0.43],
  380. [0.44, 1, 1, 0.44],
  381. [0.45, 1, 1, 0.45],
  382. [0.46, 1, 1, 0.46],
  383. [0.47, 1, 1, 0.47],
  384. [0.48, 1, 1, 0.48],
  385. [0.49, 1, 1, 0.49],
  386. [0.5, 1, 1, 0.5],
  387. [0.51, 1, 1, 0.51],
  388. [0.52, 1, 1, 0.52],
  389. [0.53, 1, 1, 0.53],
  390. [0.54, 1, 1, 0.54],
  391. [0.55, 1, 1, 0.55],
  392. [0.56, 1, 1, 0.56],
  393. [0.57, 1, 1, 0.57],
  394. [0.58, 1, 1, 0.58],
  395. [0.59, 1, 1, 0.59],
  396. [0.6, 1, 1, 0.6],
  397. [0.61, 1, 1, 0.61],
  398. [0.62, 1, 1, 0.62],
  399. [0.63, 1, 1, 0.63],
  400. [0.64, 1, 1, 0.64],
  401. [0.65, 1, 1, 0.65],
  402. [0.66, 1, 1, 0.66],
  403. [0.67, 1, 1, 0.67],
  404. [0.68, 1, 1, 0.68],
  405. [0.69, 1, 1, 0.69],
  406. [0.7, 1, 1, 0.7],
  407. [0.71, 1, 1, 0.71],
  408. [0.72, 1, 1, 0.72],
  409. [0.73, 1, 1, 0.73],
  410. [0.74, 1, 1, 0.74],
  411. [0.75, 1, 1, 0.75],
  412. [0.76, 1, 1, 0.76],
  413. [0.77, 1, 1, 0.77],
  414. [0.78, 1, 1, 0.78],
  415. [0.79, 1, 1, 0.79],
  416. [0.8, 1, 1, 0.8],
  417. [0.81, 1, 1, 0.81],
  418. [0.82, 1, 1, 0.82],
  419. [0.83, 1, 1, 0.83],
  420. [0.84, 1, 1, 0.84],
  421. [0.85, 1, 1, 0.85],
  422. [0.86, 1, 1, 0.86],
  423. [0.87, 1, 1, 0.87],
  424. [0.88, 1, 1, 0.88],
  425. [0.89, 1, 1, 0.89],
  426. [0.9, 1, 1, 0.9],
  427. [0.91, 1, 1, 0.91],
  428. [0.92, 1, 1, 0.92],
  429. [0.93, 1, 1, 0.93],
  430. [0.94, 1, 1, 0.94],
  431. [0.95, 1, 1, 0.95],
  432. [0.96, 1, 1, 0.96],
  433. [0.97, 1, 1, 0.97],
  434. [0.98, 1, 1, 0.98],
  435. [0.99, 1, 1, 0.99],
  436. [1, 1, 1, 1],
  437. [0, 2, 3, 0],
  438. [0.01, 2, 3, 5.9203E-4],
  439. [0.02, 2, 3, 0.00233648],
  440. [0.03, 2, 3, 0.00518643],
  441. [0.04, 2, 3, 0.00909568],
  442. [0.05, 2, 3, 0.01401875],
  443. [0.06, 2, 3, 0.01991088],
  444. [0.07, 2, 3, 0.02672803],
  445. [0.08, 2, 3, 0.03442688],
  446. [0.09, 2, 3, 0.04296483],
  447. [0.1, 2, 3, 0.0523],
  448. [0.11, 2, 3, 0.06239123],
  449. [0.12, 2, 3, 0.07319808],
  450. [0.13, 2, 3, 0.08468083],
  451. [0.14, 2, 3, 0.09680048],
  452. [0.15, 2, 3, 0.10951875],
  453. [0.16, 2, 3, 0.12279808],
  454. [0.17, 2, 3, 0.13660163],
  455. [0.18, 2, 3, 0.15089328],
  456. [0.19, 2, 3, 0.16563763],
  457. [0.2, 2, 3, 0.1808],
  458. [0.21, 2, 3, 0.19634643],
  459. [0.22, 2, 3, 0.21224368],
  460. [0.23, 2, 3, 0.22845923],
  461. [0.24, 2, 3, 0.24496128],
  462. [0.25, 2, 3, 0.26171875],
  463. [0.26, 2, 3, 0.27870128],
  464. [0.27, 2, 3, 0.29587923],
  465. [0.28, 2, 3, 0.31322368],
  466. [0.29, 2, 3, 0.33070643],
  467. [0.3, 2, 3, 0.3483],
  468. [0.31, 2, 3, 0.36597763],
  469. [0.32, 2, 3, 0.38371328],
  470. [0.33, 2, 3, 0.40148163],
  471. [0.34, 2, 3, 0.41925808],
  472. [0.35, 2, 3, 0.43701875],
  473. [0.36, 2, 3, 0.45474048],
  474. [0.37, 2, 3, 0.47240083],
  475. [0.38, 2, 3, 0.48997808],
  476. [0.39, 2, 3, 0.50745123],
  477. [0.4, 2, 3, 0.5248],
  478. [0.41, 2, 3, 0.54200483],
  479. [0.42, 2, 3, 0.55904688],
  480. [0.43, 2, 3, 0.57590803],
  481. [0.44, 2, 3, 0.59257088],
  482. [0.45, 2, 3, 0.60901875],
  483. [0.46, 2, 3, 0.62523568],
  484. [0.47, 2, 3, 0.64120643],
  485. [0.48, 2, 3, 0.65691648],
  486. [0.49, 2, 3, 0.67235203],
  487. [0.5, 2, 3, 0.6875],
  488. [0.51, 2, 3, 0.70234803],
  489. [0.52, 2, 3, 0.71688448],
  490. [0.53, 2, 3, 0.73109843],
  491. [0.54, 2, 3, 0.74497968],
  492. [0.55, 2, 3, 0.75851875],
  493. [0.56, 2, 3, 0.77170688],
  494. [0.57, 2, 3, 0.78453603],
  495. [0.58, 2, 3, 0.79699888],
  496. [0.59, 2, 3, 0.80908883],
  497. [0.6, 2, 3, 0.8208],
  498. [0.61, 2, 3, 0.83212723],
  499. [0.62, 2, 3, 0.84306608],
  500. [0.63, 2, 3, 0.85361283],
  501. [0.64, 2, 3, 0.86376448],
  502. [0.65, 2, 3, 0.87351875],
  503. [0.66, 2, 3, 0.88287408],
  504. [0.67, 2, 3, 0.89182963],
  505. [0.68, 2, 3, 0.90038528],
  506. [0.69, 2, 3, 0.90854163],
  507. [0.7, 2, 3, 0.9163],
  508. [0.71, 2, 3, 0.92366243],
  509. [0.72, 2, 3, 0.93063168],
  510. [0.73, 2, 3, 0.93721123],
  511. [0.74, 2, 3, 0.94340528],
  512. [0.75, 2, 3, 0.94921875],
  513. [0.76, 2, 3, 0.95465728],
  514. [0.77, 2, 3, 0.95972723],
  515. [0.78, 2, 3, 0.96443568],
  516. [0.79, 2, 3, 0.96879043],
  517. [0.8, 2, 3, 0.9728],
  518. [0.81, 2, 3, 0.97647363],
  519. [0.82, 2, 3, 0.97982128],
  520. [0.83, 2, 3, 0.98285363],
  521. [0.84, 2, 3, 0.98558208],
  522. [0.85, 2, 3, 0.98801875],
  523. [0.86, 2, 3, 0.99017648],
  524. [0.87, 2, 3, 0.99206883],
  525. [0.88, 2, 3, 0.99371008],
  526. [0.89, 2, 3, 0.99511523],
  527. [0.9, 2, 3, 0.9963],
  528. [0.91, 2, 3, 0.99728083],
  529. [0.92, 2, 3, 0.99807488],
  530. [0.93, 2, 3, 0.99870003],
  531. [0.94, 2, 3, 0.99917488],
  532. [0.95, 2, 3, 0.99951875],
  533. [0.96, 2, 3, 0.99975168],
  534. [0.97, 2, 3, 0.99989443],
  535. [0.98, 2, 3, 0.99996848],
  536. [0.99, 2, 3, 0.99999603],
  537. [1, 2, 3, 1],
  538. [0, 3, 2, 0],
  539. [0.01, 3, 2, 3.97E-6],
  540. [0.02, 3, 2, 3.152E-5],
  541. [0.03, 3, 2, 1.0557E-4],
  542. [0.04, 3, 2, 2.4832E-4],
  543. [0.05, 3, 2, 4.8125E-4],
  544. [0.06, 3, 2, 8.2512E-4],
  545. [0.07, 3, 2, 0.00129997],
  546. [0.08, 3, 2, 0.00192512],
  547. [0.09, 3, 2, 0.00271917],
  548. [0.1, 3, 2, 0.0037],
  549. [0.11, 3, 2, 0.00488477],
  550. [0.12, 3, 2, 0.00628992],
  551. [0.13, 3, 2, 0.00793117],
  552. [0.14, 3, 2, 0.00982352],
  553. [0.15, 3, 2, 0.01198125],
  554. [0.16, 3, 2, 0.01441792],
  555. [0.17, 3, 2, 0.01714637],
  556. [0.18, 3, 2, 0.02017872],
  557. [0.19, 3, 2, 0.02352637],
  558. [0.2, 3, 2, 0.0272],
  559. [0.21, 3, 2, 0.03120957],
  560. [0.22, 3, 2, 0.03556432],
  561. [0.23, 3, 2, 0.04027277],
  562. [0.24, 3, 2, 0.04534272],
  563. [0.25, 3, 2, 0.05078125],
  564. [0.26, 3, 2, 0.05659472],
  565. [0.27, 3, 2, 0.06278877],
  566. [0.28, 3, 2, 0.06936832],
  567. [0.29, 3, 2, 0.07633757],
  568. [0.3, 3, 2, 0.0837],
  569. [0.31, 3, 2, 0.09145837],
  570. [0.32, 3, 2, 0.09961472],
  571. [0.33, 3, 2, 0.10817037],
  572. [0.34, 3, 2, 0.11712592],
  573. [0.35, 3, 2, 0.12648125],
  574. [0.36, 3, 2, 0.13623552],
  575. [0.37, 3, 2, 0.14638717],
  576. [0.38, 3, 2, 0.15693392],
  577. [0.39, 3, 2, 0.16787277],
  578. [0.4, 3, 2, 0.1792],
  579. [0.41, 3, 2, 0.19091117],
  580. [0.42, 3, 2, 0.20300112],
  581. [0.43, 3, 2, 0.21546397],
  582. [0.44, 3, 2, 0.22829312],
  583. [0.45, 3, 2, 0.24148125],
  584. [0.46, 3, 2, 0.25502032],
  585. [0.47, 3, 2, 0.26890157],
  586. [0.48, 3, 2, 0.28311552],
  587. [0.49, 3, 2, 0.29765197],
  588. [0.5, 3, 2, 0.3125],
  589. [0.51, 3, 2, 0.32764797],
  590. [0.52, 3, 2, 0.34308352],
  591. [0.53, 3, 2, 0.35879357],
  592. [0.54, 3, 2, 0.37476432],
  593. [0.55, 3, 2, 0.39098125],
  594. [0.56, 3, 2, 0.40742912],
  595. [0.57, 3, 2, 0.42409197],
  596. [0.58, 3, 2, 0.44095312],
  597. [0.59, 3, 2, 0.45799517],
  598. [0.6, 3, 2, 0.4752],
  599. [0.61, 3, 2, 0.49254877],
  600. [0.62, 3, 2, 0.51002192],
  601. [0.63, 3, 2, 0.52759917],
  602. [0.64, 3, 2, 0.54525952],
  603. [0.65, 3, 2, 0.56298125],
  604. [0.66, 3, 2, 0.58074192],
  605. [0.67, 3, 2, 0.59851837],
  606. [0.68, 3, 2, 0.61628672],
  607. [0.69, 3, 2, 0.63402237],
  608. [0.7, 3, 2, 0.6517],
  609. [0.71, 3, 2, 0.66929357],
  610. [0.72, 3, 2, 0.68677632],
  611. [0.73, 3, 2, 0.70412077],
  612. [0.74, 3, 2, 0.72129872],
  613. [0.75, 3, 2, 0.73828125],
  614. [0.76, 3, 2, 0.75503872],
  615. [0.77, 3, 2, 0.77154077],
  616. [0.78, 3, 2, 0.78775632],
  617. [0.79, 3, 2, 0.80365357],
  618. [0.8, 3, 2, 0.8192],
  619. [0.81, 3, 2, 0.83436237],
  620. [0.82, 3, 2, 0.84910672],
  621. [0.83, 3, 2, 0.86339837],
  622. [0.84, 3, 2, 0.87720192],
  623. [0.85, 3, 2, 0.89048125],
  624. [0.86, 3, 2, 0.90319952],
  625. [0.87, 3, 2, 0.91531917],
  626. [0.88, 3, 2, 0.92680192],
  627. [0.89, 3, 2, 0.93760877],
  628. [0.9, 3, 2, 0.9477],
  629. [0.91, 3, 2, 0.95703517],
  630. [0.92, 3, 2, 0.96557312],
  631. [0.93, 3, 2, 0.97327197],
  632. [0.94, 3, 2, 0.98008912],
  633. [0.95, 3, 2, 0.98598125],
  634. [0.96, 3, 2, 0.99090432],
  635. [0.97, 3, 2, 0.99481357],
  636. [0.98, 3, 2, 0.99766352],
  637. [0.99, 3, 2, 0.99940797],
  638. [1, 3, 2, 1],
  639. [0, 10, 50, 0],
  640. [0.01, 10, 50, 4.019555174E-10],
  641. [0.02, 10, 50, 2.627230725E-7],
  642. [0.03, 10, 50, 9.649195527E-6],
  643. [0.04, 10, 50, 1.089160184E-4],
  644. [0.05, 10, 50, 6.436109147E-4],
  645. [0.06, 10, 50, 0.002524554335],
  646. [0.07, 10, 50, 0.007461626373],
  647. [0.08, 10, 50, 0.01792659751],
  648. [0.09, 10, 50, 0.03676911366],
  649. [0.1, 10, 50, 0.06658944558],
  650. [0.11, 10, 50, 0.109084124],
  651. [0.12, 10, 50, 0.1645800247],
  652. [0.13, 10, 50, 0.2318848964],
  653. [0.14, 10, 50, 0.3084655888],
  654. [0.15, 10, 50, 0.3908704946],
  655. [0.16, 10, 50, 0.4752657543],
  656. [0.17, 10, 50, 0.5579559892],
  657. [0.18, 10, 50, 0.6357944535],
  658. [0.19, 10, 50, 0.7064347707],
  659. [0.2, 10, 50, 0.7684204704],
  660. [0.21, 10, 50, 0.8211398301],
  661. [0.22, 10, 50, 0.8646892754],
  662. [0.23, 10, 50, 0.8996908182],
  663. [0.24, 10, 50, 0.9271020689],
  664. [0.25, 10, 50, 0.9480459701],
  665. [0.26, 10, 50, 0.9636753835],
  666. [0.27, 10, 50, 0.9750774712],
  667. [0.28, 10, 50, 0.9832155754],
  668. [0.29, 10, 50, 0.9889021129],
  669. [0.3, 10, 50, 0.9927943681],
  670. [0.31, 10, 50, 0.9954052423],
  671. [0.32, 10, 50, 0.9971222339],
  672. [0.33, 10, 50, 0.9982295758],
  673. [0.34, 10, 50, 0.9989301123],
  674. [0.35, 10, 50, 0.9993649151],
  675. [0.36, 10, 50, 0.9996297151],
  676. [0.37, 10, 50, 0.9997879625],
  677. [0.38, 10, 50, 0.9998807638],
  678. [0.39, 10, 50, 0.9999341655],
  679. [0.4, 10, 50, 0.9999643168],
  680. [0.41, 10, 50, 0.9999810182],
  681. [0.42, 10, 50, 0.9999900926],
  682. [0.43, 10, 50, 0.9999949278],
  683. [0.44, 10, 50, 0.9999974537],
  684. [0.45, 10, 50, 0.9999987471],
  685. [0.46, 10, 50, 0.999999396],
  686. [0.47, 10, 50, 0.9999997149],
  687. [0.48, 10, 50, 0.9999998682],
  688. [0.49, 10, 50, 0.9999999404],
  689. [0.5, 10, 50, 0.9999999737],
  690. [0.51, 10, 50, 0.9999999886],
  691. [0.52, 10, 50, 0.9999999952],
  692. [0.53, 10, 50, 0.999999998],
  693. [0.54, 10, 50, 0.9999999992],
  694. [0.55, 10, 50, 0.9999999997],
  695. [0.56, 10, 50, 0.9999999999],
  696. [0.57, 10, 50, 1],
  697. [0.58, 10, 50, 1],
  698. [0.59, 10, 50, 1],
  699. [0.6, 10, 50, 1],
  700. [0.61, 10, 50, 1],
  701. [0.62, 10, 50, 1],
  702. [0.63, 10, 50, 1],
  703. [0.64, 10, 50, 1],
  704. [0.65, 10, 50, 1],
  705. [0.66, 10, 50, 1],
  706. [0.67, 10, 50, 1],
  707. [0.68, 10, 50, 1],
  708. [0.69, 10, 50, 1],
  709. [0.7, 10, 50, 1],
  710. [0.71, 10, 50, 1],
  711. [0.72, 10, 50, 1],
  712. [0.73, 10, 50, 1],
  713. [0.74, 10, 50, 1],
  714. [0.75, 10, 50, 1],
  715. [0.76, 10, 50, 1],
  716. [0.77, 10, 50, 1],
  717. [0.78, 10, 50, 1],
  718. [0.79, 10, 50, 1],
  719. [0.8, 10, 50, 1],
  720. [0.81, 10, 50, 1],
  721. [0.82, 10, 50, 1],
  722. [0.83, 10, 50, 1],
  723. [0.84, 10, 50, 1],
  724. [0.85, 10, 50, 1],
  725. [0.86, 10, 50, 1],
  726. [0.87, 10, 50, 1],
  727. [0.88, 10, 50, 1],
  728. [0.89, 10, 50, 1],
  729. [0.9, 10, 50, 1],
  730. [0.91, 10, 50, 1],
  731. [0.92, 10, 50, 1],
  732. [0.93, 10, 50, 1],
  733. [0.94, 10, 50, 1],
  734. [0.95, 10, 50, 1],
  735. [0.96, 10, 50, 1],
  736. [0.97, 10, 50, 1],
  737. [0.98, 10, 50, 1],
  738. [0.99, 10, 50, 1],
  739. [1, 10, 50, 1],
  740. ];
  741. }
  742. /**
  743. * @test mean
  744. * @dataProvider dataProviderForMean
  745. * @param float $α
  746. * @param float $β
  747. * @param float $μ
  748. */
  749. public function testMean(float $α, float $β, float $μ)
  750. {
  751. // Given
  752. $beta = new Beta($α, $β);
  753. // When
  754. $mean = $beta->mean();
  755. // Then
  756. $this->assertEqualsWithDelta($μ, $mean, 0.000001);
  757. }
  758. /**
  759. * @return array [α, β, μ]
  760. */
  761. public function dataProviderForMean(): array
  762. {
  763. return [
  764. [1, 1, 0.5],
  765. [1, 2, 0.33333333],
  766. [2, 1, 0.66666666],
  767. ];
  768. }
  769. /**
  770. * @test median
  771. * @dataProvider dataProviderForMedian
  772. * @param float $α
  773. * @param float $β
  774. * @param float $expected
  775. */
  776. public function testMedian(float $α, float $β, float $expected)
  777. {
  778. // Given
  779. $beta = new Beta($α, $β);
  780. // When
  781. $median = $beta->median();
  782. // Then
  783. $this->assertEqualsWithDelta($expected, $median, 0.000001);
  784. }
  785. /**
  786. * Data generated with calculator: https://captaincalculator.com/math/statistics/beta-distribution-calculator/
  787. * @return array [α, β, μ]
  788. */
  789. public function dataProviderForMedian(): array
  790. {
  791. return [
  792. // α == β
  793. [1, 1, 0.5],
  794. [2, 2, 0.5],
  795. [3, 3, 0.5],
  796. // α == 1, β > 0
  797. [1, 0.1, 0.99902344],
  798. [1, 0.5, 0.75],
  799. [1, 2, 0.29289322],
  800. [1, 3, 0.20629947],
  801. [1, 4, 0.15910358],
  802. [1, 5, 0.12944944],
  803. // β == 1, α > 0
  804. [0.1, 1, 0.00097656],
  805. [0.5, 1, 0.25],
  806. [2, 1, 0.70710678],
  807. [3, 1, 0.79370053],
  808. [4, 1, 0.84089642],
  809. [5, 1, 0.87055056],
  810. // α == 3, β == 2
  811. [3, 2, 0.61427243],
  812. // α == 2, β == 3
  813. [2, 3, 0.38572757],
  814. ];
  815. }
  816. /**
  817. * @test median when it is approximated
  818. * @dataProvider dataProviderForMedianApproximation
  819. * @param float $α
  820. * @param float $β
  821. * @param float $expected
  822. * @param float $expectedError
  823. */
  824. public function testMedianApproximation(float $α, float $β, float $expected, float $expectedError)
  825. {
  826. // Given
  827. $beta = new Beta($α, $β);
  828. // When
  829. $median = $beta->median();
  830. // Then
  831. $ε = \abs($expected - $median);
  832. $η = $ε / $expected;
  833. $this->assertLessThan($expectedError, $η);
  834. }
  835. /**
  836. * Data generated with calculator: https://captaincalculator.com/math/statistics/beta-distribution-calculator/
  837. * @return array [α, β, μ]
  838. */
  839. public function dataProviderForMedianApproximation(): array
  840. {
  841. return [
  842. // α ≥ 2 and β ≥ 2 the error it is less than 1%
  843. [2, 4, 0.31381017, 0.01],
  844. [4, 2, 0.68618983, 0.01],
  845. [4, 5, 0.4401552, 0.01],
  846. [7, 4, 0.64490003, 0.01],
  847. // α, β ≥ 1 the error is less than 4%
  848. [1.8, 1.1, 0.6513904, 0.04],
  849. [1.4, 1.3, 0.52366548, 0.04],
  850. ];
  851. }
  852. /**
  853. * @test mode
  854. * @dataProvider dataProviderForMode
  855. * @param float $α
  856. * @param float $β
  857. * @param float $expected
  858. */
  859. public function testMode(float $α, float $β, float $expected)
  860. {
  861. // Given
  862. $beta = new Beta($α, $β);
  863. // When
  864. $mode = $beta->mode();
  865. // Then
  866. $this->assertEqualsWithDelta($expected, $mode, 0.000001);
  867. }
  868. /**
  869. * Data generated with calculator: https://captaincalculator.com/math/statistics/beta-distribution-calculator/
  870. * @return array [α, β, μ]
  871. */
  872. public function dataProviderForMode(): array
  873. {
  874. return [
  875. [1, 2, 0],
  876. [1, 3, 0],
  877. [2, 1, 1],
  878. [3, 1, 1],
  879. [2, 2, 0.5],
  880. [4, 5, 0.42857143],
  881. [7, 4, 0.66666667],
  882. ];
  883. }
  884. /**
  885. * @test variance
  886. * @dataProvider dataProviderForVariance
  887. * @param float $α
  888. * @param float $β
  889. * @param float $expected
  890. */
  891. public function testVariance(float $α, float $β, float $expected)
  892. {
  893. // Given
  894. $beta = new Beta($α, $β);
  895. // When
  896. $variance = $beta->variance();
  897. // Then
  898. $this->assertEqualsWithDelta($expected, $variance, 0.000001);
  899. }
  900. /**
  901. * Data generated with calculator: https://captaincalculator.com/math/statistics/beta-distribution-calculator/
  902. * @return array [α, β, var]
  903. */
  904. public function dataProviderForVariance(): array
  905. {
  906. return [
  907. [1, 2, 0.05555556],
  908. [1, 3, 0.0375],
  909. [2, 1, 0.05555556],
  910. [3, 1, 0.0375],
  911. [2, 2, 0.05],
  912. [4, 5, 0.02469136],
  913. [7, 4, 0.01928375],
  914. ];
  915. }
  916. /**
  917. * @test inverse
  918. * @dataProvider dataProviderForInverse
  919. * @param float $α
  920. * @param float $β
  921. * @param float $x
  922. * @param float $expected_inverse
  923. * @throws \Exception
  924. */
  925. public function testInverse(float $α, float $β, float $x, float $expected_inverse)
  926. {
  927. // Given
  928. $beta = new Beta($α, $β);
  929. // When
  930. $inverse = $beta->inverse($x);
  931. // Then
  932. $this->assertEqualsWithDelta($expected_inverse, $inverse, 0.0000001);
  933. }
  934. /**
  935. * @return array [α, β, x, inverse]
  936. * Generated with R (stats) qbeta(x, α, β)
  937. */
  938. public function dataProviderForInverse(): array
  939. {
  940. return [
  941. [1, 1, 0, 0],
  942. [1, 1, 0.01, 0.01],
  943. [1, 1, 0.1, 0.1],
  944. [1, 1, 0.2, 0.2],
  945. [1, 1, 0.3, 0.3],
  946. [1, 1, 0.4, 0.4],
  947. [1, 1, 0.5, 0.5],
  948. [1, 1, 0.6, 0.6],
  949. [1, 1, 0.7, 0.7],
  950. [1, 1, 0.8, 0.8],
  951. [1, 1, 0.9, 0.9],
  952. [1, 1, 0.99, 0.99],
  953. [1, 1, 1, 1],
  954. [2, 1, 0, 0],
  955. [2, 1, 0.01, 0.1],
  956. [2, 1, 0.1, 0.3162278],
  957. [2, 1, 0.2, 0.4472136],
  958. [2, 1, 0.3, 0.5477226],
  959. [2, 1, 0.4, 0.6324555],
  960. [2, 1, 0.5, 0.7071068],
  961. [2, 1, 0.6, 0.7745967],
  962. [2, 1, 0.7, 0.83666],
  963. [2, 1, 0.8, 0.8944272],
  964. [2, 1, 0.9, 0.9486833],
  965. [2, 1, 0.99, 0.9949874],
  966. [2, 1, 1, 1],
  967. [1, 2, 0, 0],
  968. [1, 2, 0.01, 0.005012563],
  969. [1, 2, 0.1, 0.0513167],
  970. [1, 2, 0.2, 0.1055728],
  971. [1, 2, 0.3, 0.16334],
  972. [1, 2, 0.4, 0.2254033],
  973. [1, 2, 0.5, 0.2928932],
  974. [1, 2, 0.6, 0.3675445],
  975. [1, 2, 0.7, 0.4522774],
  976. [1, 2, 0.8, 0.5527864],
  977. [1, 2, 0.9, 0.6837722],
  978. [1, 2, 0.99, 0.9],
  979. [1, 2, 1, 1],
  980. [2, 3, 0, 0],
  981. [2, 3, 0.01, 0.04199864],
  982. [2, 3, 0.1, 0.1425593],
  983. [2, 3, 0.2, 0.2123171],
  984. [2, 3, 0.3, 0.2723839],
  985. [2, 3, 0.4, 0.3291665],
  986. [2, 3, 0.5, 0.3857276],
  987. [2, 3, 0.6, 0.4445],
  988. [2, 3, 0.7, 0.5084048],
  989. [2, 3, 0.8, 0.5824536],
  990. [2, 3, 0.9, 0.6795394],
  991. [2, 3, 0.99, 0.8591325],
  992. [2, 3, 1, 1],
  993. [4, 5, 0.2, 0.3032258],
  994. [10, 5, 0.01, 0.3725653],
  995. [10, 5, 0.5, 0.6742488],
  996. [10, 5, 0.99, 0.8980714],
  997. ];
  998. }
  999. /**
  1000. * @test inverse throws an exception if it fails to converge on a guess within the tolerance
  1001. * @throws Exception\MathException
  1002. */
  1003. public function testInverseFailToConvergeException()
  1004. {
  1005. // Given
  1006. [$α, $β, $x] = [2, 5, 0.6];
  1007. $tolerance = 1.0e-15;
  1008. $max_iterations = 2;
  1009. $beta = new Beta($α, $β);
  1010. // Then
  1011. $this->expectException(Exception\MathException::class);
  1012. // When
  1013. $inverse = $beta->inverse($x, $tolerance, $max_iterations);
  1014. }
  1015. /**
  1016. * @test rand
  1017. */
  1018. public function testRand()
  1019. {
  1020. foreach (\range(1, 10) as $α) {
  1021. foreach (\range(1, 10) as $β) {
  1022. // Given
  1023. $beta = new Beta($α, $β);
  1024. foreach (\range(1, 3) as $_) {
  1025. // When
  1026. $random = $beta->rand();
  1027. // Then
  1028. $this->assertTrue(\is_numeric($random));
  1029. }
  1030. }
  1031. }
  1032. }
  1033. }