scipy 1.16.2__cp314-cp314t-win_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1530) hide show
  1. scipy/__config__.py +161 -0
  2. scipy/__init__.py +150 -0
  3. scipy/_cyutility.cp314t-win_arm64.lib +0 -0
  4. scipy/_cyutility.cp314t-win_arm64.pyd +0 -0
  5. scipy/_distributor_init.py +18 -0
  6. scipy/_lib/__init__.py +14 -0
  7. scipy/_lib/_array_api.py +931 -0
  8. scipy/_lib/_array_api_compat_vendor.py +9 -0
  9. scipy/_lib/_array_api_no_0d.py +103 -0
  10. scipy/_lib/_bunch.py +229 -0
  11. scipy/_lib/_ccallback.py +251 -0
  12. scipy/_lib/_ccallback_c.cp314t-win_arm64.lib +0 -0
  13. scipy/_lib/_ccallback_c.cp314t-win_arm64.pyd +0 -0
  14. scipy/_lib/_disjoint_set.py +254 -0
  15. scipy/_lib/_docscrape.py +761 -0
  16. scipy/_lib/_elementwise_iterative_method.py +346 -0
  17. scipy/_lib/_fpumode.cp314t-win_arm64.lib +0 -0
  18. scipy/_lib/_fpumode.cp314t-win_arm64.pyd +0 -0
  19. scipy/_lib/_gcutils.py +105 -0
  20. scipy/_lib/_pep440.py +487 -0
  21. scipy/_lib/_sparse.py +41 -0
  22. scipy/_lib/_test_ccallback.cp314t-win_arm64.lib +0 -0
  23. scipy/_lib/_test_ccallback.cp314t-win_arm64.pyd +0 -0
  24. scipy/_lib/_test_deprecation_call.cp314t-win_arm64.lib +0 -0
  25. scipy/_lib/_test_deprecation_call.cp314t-win_arm64.pyd +0 -0
  26. scipy/_lib/_test_deprecation_def.cp314t-win_arm64.lib +0 -0
  27. scipy/_lib/_test_deprecation_def.cp314t-win_arm64.pyd +0 -0
  28. scipy/_lib/_testutils.py +373 -0
  29. scipy/_lib/_threadsafety.py +58 -0
  30. scipy/_lib/_tmpdirs.py +86 -0
  31. scipy/_lib/_uarray/LICENSE +29 -0
  32. scipy/_lib/_uarray/__init__.py +116 -0
  33. scipy/_lib/_uarray/_backend.py +707 -0
  34. scipy/_lib/_uarray/_uarray.cp314t-win_arm64.lib +0 -0
  35. scipy/_lib/_uarray/_uarray.cp314t-win_arm64.pyd +0 -0
  36. scipy/_lib/_util.py +1283 -0
  37. scipy/_lib/array_api_compat/__init__.py +22 -0
  38. scipy/_lib/array_api_compat/_internal.py +59 -0
  39. scipy/_lib/array_api_compat/common/__init__.py +1 -0
  40. scipy/_lib/array_api_compat/common/_aliases.py +727 -0
  41. scipy/_lib/array_api_compat/common/_fft.py +213 -0
  42. scipy/_lib/array_api_compat/common/_helpers.py +1058 -0
  43. scipy/_lib/array_api_compat/common/_linalg.py +232 -0
  44. scipy/_lib/array_api_compat/common/_typing.py +192 -0
  45. scipy/_lib/array_api_compat/cupy/__init__.py +13 -0
  46. scipy/_lib/array_api_compat/cupy/_aliases.py +156 -0
  47. scipy/_lib/array_api_compat/cupy/_info.py +336 -0
  48. scipy/_lib/array_api_compat/cupy/_typing.py +31 -0
  49. scipy/_lib/array_api_compat/cupy/fft.py +36 -0
  50. scipy/_lib/array_api_compat/cupy/linalg.py +49 -0
  51. scipy/_lib/array_api_compat/dask/__init__.py +0 -0
  52. scipy/_lib/array_api_compat/dask/array/__init__.py +12 -0
  53. scipy/_lib/array_api_compat/dask/array/_aliases.py +376 -0
  54. scipy/_lib/array_api_compat/dask/array/_info.py +416 -0
  55. scipy/_lib/array_api_compat/dask/array/fft.py +21 -0
  56. scipy/_lib/array_api_compat/dask/array/linalg.py +72 -0
  57. scipy/_lib/array_api_compat/numpy/__init__.py +28 -0
  58. scipy/_lib/array_api_compat/numpy/_aliases.py +190 -0
  59. scipy/_lib/array_api_compat/numpy/_info.py +366 -0
  60. scipy/_lib/array_api_compat/numpy/_typing.py +30 -0
  61. scipy/_lib/array_api_compat/numpy/fft.py +35 -0
  62. scipy/_lib/array_api_compat/numpy/linalg.py +143 -0
  63. scipy/_lib/array_api_compat/torch/__init__.py +22 -0
  64. scipy/_lib/array_api_compat/torch/_aliases.py +855 -0
  65. scipy/_lib/array_api_compat/torch/_info.py +369 -0
  66. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  67. scipy/_lib/array_api_compat/torch/fft.py +85 -0
  68. scipy/_lib/array_api_compat/torch/linalg.py +121 -0
  69. scipy/_lib/array_api_extra/__init__.py +38 -0
  70. scipy/_lib/array_api_extra/_delegation.py +171 -0
  71. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  72. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  73. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  74. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  75. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  76. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  77. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  78. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  79. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  80. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  81. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  82. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  83. scipy/_lib/array_api_extra/testing.py +359 -0
  84. scipy/_lib/cobyqa/__init__.py +20 -0
  85. scipy/_lib/cobyqa/framework.py +1240 -0
  86. scipy/_lib/cobyqa/main.py +1506 -0
  87. scipy/_lib/cobyqa/models.py +1529 -0
  88. scipy/_lib/cobyqa/problem.py +1296 -0
  89. scipy/_lib/cobyqa/settings.py +132 -0
  90. scipy/_lib/cobyqa/subsolvers/__init__.py +14 -0
  91. scipy/_lib/cobyqa/subsolvers/geometry.py +387 -0
  92. scipy/_lib/cobyqa/subsolvers/optim.py +1203 -0
  93. scipy/_lib/cobyqa/utils/__init__.py +18 -0
  94. scipy/_lib/cobyqa/utils/exceptions.py +22 -0
  95. scipy/_lib/cobyqa/utils/math.py +77 -0
  96. scipy/_lib/cobyqa/utils/versions.py +67 -0
  97. scipy/_lib/decorator.py +399 -0
  98. scipy/_lib/deprecation.py +274 -0
  99. scipy/_lib/doccer.py +366 -0
  100. scipy/_lib/messagestream.cp314t-win_arm64.lib +0 -0
  101. scipy/_lib/messagestream.cp314t-win_arm64.pyd +0 -0
  102. scipy/_lib/pyprima/__init__.py +212 -0
  103. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  104. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  105. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  106. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  107. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  108. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  109. scipy/_lib/pyprima/cobyla/update.py +289 -0
  110. scipy/_lib/pyprima/common/__init__.py +0 -0
  111. scipy/_lib/pyprima/common/_bounds.py +34 -0
  112. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  113. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  114. scipy/_lib/pyprima/common/_project.py +173 -0
  115. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  116. scipy/_lib/pyprima/common/consts.py +47 -0
  117. scipy/_lib/pyprima/common/evaluate.py +99 -0
  118. scipy/_lib/pyprima/common/history.py +38 -0
  119. scipy/_lib/pyprima/common/infos.py +30 -0
  120. scipy/_lib/pyprima/common/linalg.py +435 -0
  121. scipy/_lib/pyprima/common/message.py +290 -0
  122. scipy/_lib/pyprima/common/powalg.py +131 -0
  123. scipy/_lib/pyprima/common/preproc.py +277 -0
  124. scipy/_lib/pyprima/common/present.py +5 -0
  125. scipy/_lib/pyprima/common/ratio.py +54 -0
  126. scipy/_lib/pyprima/common/redrho.py +47 -0
  127. scipy/_lib/pyprima/common/selectx.py +296 -0
  128. scipy/_lib/tests/__init__.py +0 -0
  129. scipy/_lib/tests/test__gcutils.py +110 -0
  130. scipy/_lib/tests/test__pep440.py +67 -0
  131. scipy/_lib/tests/test__testutils.py +32 -0
  132. scipy/_lib/tests/test__threadsafety.py +51 -0
  133. scipy/_lib/tests/test__util.py +641 -0
  134. scipy/_lib/tests/test_array_api.py +322 -0
  135. scipy/_lib/tests/test_bunch.py +169 -0
  136. scipy/_lib/tests/test_ccallback.py +196 -0
  137. scipy/_lib/tests/test_config.py +45 -0
  138. scipy/_lib/tests/test_deprecation.py +10 -0
  139. scipy/_lib/tests/test_doccer.py +143 -0
  140. scipy/_lib/tests/test_import_cycles.py +18 -0
  141. scipy/_lib/tests/test_public_api.py +482 -0
  142. scipy/_lib/tests/test_scipy_version.py +28 -0
  143. scipy/_lib/tests/test_tmpdirs.py +48 -0
  144. scipy/_lib/tests/test_warnings.py +137 -0
  145. scipy/_lib/uarray.py +31 -0
  146. scipy/cluster/__init__.py +31 -0
  147. scipy/cluster/_hierarchy.cp314t-win_arm64.lib +0 -0
  148. scipy/cluster/_hierarchy.cp314t-win_arm64.pyd +0 -0
  149. scipy/cluster/_optimal_leaf_ordering.cp314t-win_arm64.lib +0 -0
  150. scipy/cluster/_optimal_leaf_ordering.cp314t-win_arm64.pyd +0 -0
  151. scipy/cluster/_vq.cp314t-win_arm64.lib +0 -0
  152. scipy/cluster/_vq.cp314t-win_arm64.pyd +0 -0
  153. scipy/cluster/hierarchy.py +4348 -0
  154. scipy/cluster/tests/__init__.py +0 -0
  155. scipy/cluster/tests/hierarchy_test_data.py +145 -0
  156. scipy/cluster/tests/test_disjoint_set.py +202 -0
  157. scipy/cluster/tests/test_hierarchy.py +1238 -0
  158. scipy/cluster/tests/test_vq.py +434 -0
  159. scipy/cluster/vq.py +832 -0
  160. scipy/conftest.py +683 -0
  161. scipy/constants/__init__.py +358 -0
  162. scipy/constants/_codata.py +2266 -0
  163. scipy/constants/_constants.py +369 -0
  164. scipy/constants/codata.py +21 -0
  165. scipy/constants/constants.py +53 -0
  166. scipy/constants/tests/__init__.py +0 -0
  167. scipy/constants/tests/test_codata.py +78 -0
  168. scipy/constants/tests/test_constants.py +83 -0
  169. scipy/datasets/__init__.py +90 -0
  170. scipy/datasets/_download_all.py +71 -0
  171. scipy/datasets/_fetchers.py +225 -0
  172. scipy/datasets/_registry.py +26 -0
  173. scipy/datasets/_utils.py +81 -0
  174. scipy/datasets/tests/__init__.py +0 -0
  175. scipy/datasets/tests/test_data.py +128 -0
  176. scipy/differentiate/__init__.py +27 -0
  177. scipy/differentiate/_differentiate.py +1129 -0
  178. scipy/differentiate/tests/__init__.py +0 -0
  179. scipy/differentiate/tests/test_differentiate.py +694 -0
  180. scipy/fft/__init__.py +114 -0
  181. scipy/fft/_backend.py +196 -0
  182. scipy/fft/_basic.py +1650 -0
  183. scipy/fft/_basic_backend.py +197 -0
  184. scipy/fft/_debug_backends.py +22 -0
  185. scipy/fft/_fftlog.py +223 -0
  186. scipy/fft/_fftlog_backend.py +200 -0
  187. scipy/fft/_helper.py +348 -0
  188. scipy/fft/_pocketfft/LICENSE.md +25 -0
  189. scipy/fft/_pocketfft/__init__.py +9 -0
  190. scipy/fft/_pocketfft/basic.py +251 -0
  191. scipy/fft/_pocketfft/helper.py +249 -0
  192. scipy/fft/_pocketfft/pypocketfft.cp314t-win_arm64.lib +0 -0
  193. scipy/fft/_pocketfft/pypocketfft.cp314t-win_arm64.pyd +0 -0
  194. scipy/fft/_pocketfft/realtransforms.py +109 -0
  195. scipy/fft/_pocketfft/tests/__init__.py +0 -0
  196. scipy/fft/_pocketfft/tests/test_basic.py +1011 -0
  197. scipy/fft/_pocketfft/tests/test_real_transforms.py +505 -0
  198. scipy/fft/_realtransforms.py +706 -0
  199. scipy/fft/_realtransforms_backend.py +63 -0
  200. scipy/fft/tests/__init__.py +0 -0
  201. scipy/fft/tests/mock_backend.py +96 -0
  202. scipy/fft/tests/test_backend.py +98 -0
  203. scipy/fft/tests/test_basic.py +504 -0
  204. scipy/fft/tests/test_fftlog.py +215 -0
  205. scipy/fft/tests/test_helper.py +558 -0
  206. scipy/fft/tests/test_multithreading.py +84 -0
  207. scipy/fft/tests/test_real_transforms.py +247 -0
  208. scipy/fftpack/__init__.py +103 -0
  209. scipy/fftpack/_basic.py +428 -0
  210. scipy/fftpack/_helper.py +115 -0
  211. scipy/fftpack/_pseudo_diffs.py +554 -0
  212. scipy/fftpack/_realtransforms.py +598 -0
  213. scipy/fftpack/basic.py +20 -0
  214. scipy/fftpack/convolve.cp314t-win_arm64.lib +0 -0
  215. scipy/fftpack/convolve.cp314t-win_arm64.pyd +0 -0
  216. scipy/fftpack/helper.py +19 -0
  217. scipy/fftpack/pseudo_diffs.py +22 -0
  218. scipy/fftpack/realtransforms.py +19 -0
  219. scipy/fftpack/tests/__init__.py +0 -0
  220. scipy/fftpack/tests/fftw_double_ref.npz +0 -0
  221. scipy/fftpack/tests/fftw_longdouble_ref.npz +0 -0
  222. scipy/fftpack/tests/fftw_single_ref.npz +0 -0
  223. scipy/fftpack/tests/test.npz +0 -0
  224. scipy/fftpack/tests/test_basic.py +877 -0
  225. scipy/fftpack/tests/test_helper.py +54 -0
  226. scipy/fftpack/tests/test_import.py +33 -0
  227. scipy/fftpack/tests/test_pseudo_diffs.py +388 -0
  228. scipy/fftpack/tests/test_real_transforms.py +836 -0
  229. scipy/integrate/__init__.py +122 -0
  230. scipy/integrate/_bvp.py +1160 -0
  231. scipy/integrate/_cubature.py +729 -0
  232. scipy/integrate/_dop.cp314t-win_arm64.lib +0 -0
  233. scipy/integrate/_dop.cp314t-win_arm64.pyd +0 -0
  234. scipy/integrate/_ivp/__init__.py +8 -0
  235. scipy/integrate/_ivp/base.py +290 -0
  236. scipy/integrate/_ivp/bdf.py +478 -0
  237. scipy/integrate/_ivp/common.py +451 -0
  238. scipy/integrate/_ivp/dop853_coefficients.py +193 -0
  239. scipy/integrate/_ivp/ivp.py +755 -0
  240. scipy/integrate/_ivp/lsoda.py +224 -0
  241. scipy/integrate/_ivp/radau.py +572 -0
  242. scipy/integrate/_ivp/rk.py +601 -0
  243. scipy/integrate/_ivp/tests/__init__.py +0 -0
  244. scipy/integrate/_ivp/tests/test_ivp.py +1287 -0
  245. scipy/integrate/_ivp/tests/test_rk.py +37 -0
  246. scipy/integrate/_lebedev.py +5450 -0
  247. scipy/integrate/_lsoda.cp314t-win_arm64.lib +0 -0
  248. scipy/integrate/_lsoda.cp314t-win_arm64.pyd +0 -0
  249. scipy/integrate/_ode.py +1395 -0
  250. scipy/integrate/_odepack.cp314t-win_arm64.lib +0 -0
  251. scipy/integrate/_odepack.cp314t-win_arm64.pyd +0 -0
  252. scipy/integrate/_odepack_py.py +273 -0
  253. scipy/integrate/_quad_vec.py +674 -0
  254. scipy/integrate/_quadpack.cp314t-win_arm64.lib +0 -0
  255. scipy/integrate/_quadpack.cp314t-win_arm64.pyd +0 -0
  256. scipy/integrate/_quadpack_py.py +1283 -0
  257. scipy/integrate/_quadrature.py +1336 -0
  258. scipy/integrate/_rules/__init__.py +12 -0
  259. scipy/integrate/_rules/_base.py +518 -0
  260. scipy/integrate/_rules/_gauss_kronrod.py +202 -0
  261. scipy/integrate/_rules/_gauss_legendre.py +62 -0
  262. scipy/integrate/_rules/_genz_malik.py +210 -0
  263. scipy/integrate/_tanhsinh.py +1385 -0
  264. scipy/integrate/_test_multivariate.cp314t-win_arm64.lib +0 -0
  265. scipy/integrate/_test_multivariate.cp314t-win_arm64.pyd +0 -0
  266. scipy/integrate/_test_odeint_banded.cp314t-win_arm64.lib +0 -0
  267. scipy/integrate/_test_odeint_banded.cp314t-win_arm64.pyd +0 -0
  268. scipy/integrate/_vode.cp314t-win_arm64.lib +0 -0
  269. scipy/integrate/_vode.cp314t-win_arm64.pyd +0 -0
  270. scipy/integrate/dop.py +15 -0
  271. scipy/integrate/lsoda.py +15 -0
  272. scipy/integrate/odepack.py +17 -0
  273. scipy/integrate/quadpack.py +23 -0
  274. scipy/integrate/tests/__init__.py +0 -0
  275. scipy/integrate/tests/test__quad_vec.py +211 -0
  276. scipy/integrate/tests/test_banded_ode_solvers.py +305 -0
  277. scipy/integrate/tests/test_bvp.py +714 -0
  278. scipy/integrate/tests/test_cubature.py +1375 -0
  279. scipy/integrate/tests/test_integrate.py +840 -0
  280. scipy/integrate/tests/test_odeint_jac.py +74 -0
  281. scipy/integrate/tests/test_quadpack.py +680 -0
  282. scipy/integrate/tests/test_quadrature.py +730 -0
  283. scipy/integrate/tests/test_tanhsinh.py +1171 -0
  284. scipy/integrate/vode.py +15 -0
  285. scipy/interpolate/__init__.py +228 -0
  286. scipy/interpolate/_bary_rational.py +715 -0
  287. scipy/interpolate/_bsplines.py +2469 -0
  288. scipy/interpolate/_cubic.py +973 -0
  289. scipy/interpolate/_dfitpack.cp314t-win_arm64.lib +0 -0
  290. scipy/interpolate/_dfitpack.cp314t-win_arm64.pyd +0 -0
  291. scipy/interpolate/_dierckx.cp314t-win_arm64.lib +0 -0
  292. scipy/interpolate/_dierckx.cp314t-win_arm64.pyd +0 -0
  293. scipy/interpolate/_fitpack.cp314t-win_arm64.lib +0 -0
  294. scipy/interpolate/_fitpack.cp314t-win_arm64.pyd +0 -0
  295. scipy/interpolate/_fitpack2.py +2397 -0
  296. scipy/interpolate/_fitpack_impl.py +811 -0
  297. scipy/interpolate/_fitpack_py.py +898 -0
  298. scipy/interpolate/_fitpack_repro.py +996 -0
  299. scipy/interpolate/_interpnd.cp314t-win_arm64.lib +0 -0
  300. scipy/interpolate/_interpnd.cp314t-win_arm64.pyd +0 -0
  301. scipy/interpolate/_interpolate.py +2266 -0
  302. scipy/interpolate/_ndbspline.py +415 -0
  303. scipy/interpolate/_ndgriddata.py +329 -0
  304. scipy/interpolate/_pade.py +67 -0
  305. scipy/interpolate/_polyint.py +1025 -0
  306. scipy/interpolate/_ppoly.cp314t-win_arm64.lib +0 -0
  307. scipy/interpolate/_ppoly.cp314t-win_arm64.pyd +0 -0
  308. scipy/interpolate/_rbf.py +290 -0
  309. scipy/interpolate/_rbfinterp.py +550 -0
  310. scipy/interpolate/_rbfinterp_pythran.cp314t-win_arm64.lib +0 -0
  311. scipy/interpolate/_rbfinterp_pythran.cp314t-win_arm64.pyd +0 -0
  312. scipy/interpolate/_rgi.py +764 -0
  313. scipy/interpolate/_rgi_cython.cp314t-win_arm64.lib +0 -0
  314. scipy/interpolate/_rgi_cython.cp314t-win_arm64.pyd +0 -0
  315. scipy/interpolate/dfitpack.py +24 -0
  316. scipy/interpolate/fitpack.py +31 -0
  317. scipy/interpolate/fitpack2.py +29 -0
  318. scipy/interpolate/interpnd.py +24 -0
  319. scipy/interpolate/interpolate.py +30 -0
  320. scipy/interpolate/ndgriddata.py +23 -0
  321. scipy/interpolate/polyint.py +24 -0
  322. scipy/interpolate/rbf.py +18 -0
  323. scipy/interpolate/tests/__init__.py +0 -0
  324. scipy/interpolate/tests/data/bug-1310.npz +0 -0
  325. scipy/interpolate/tests/data/estimate_gradients_hang.npy +0 -0
  326. scipy/interpolate/tests/data/gcvspl.npz +0 -0
  327. scipy/interpolate/tests/test_bary_rational.py +368 -0
  328. scipy/interpolate/tests/test_bsplines.py +3754 -0
  329. scipy/interpolate/tests/test_fitpack.py +519 -0
  330. scipy/interpolate/tests/test_fitpack2.py +1431 -0
  331. scipy/interpolate/tests/test_gil.py +64 -0
  332. scipy/interpolate/tests/test_interpnd.py +452 -0
  333. scipy/interpolate/tests/test_interpolate.py +2630 -0
  334. scipy/interpolate/tests/test_ndgriddata.py +308 -0
  335. scipy/interpolate/tests/test_pade.py +107 -0
  336. scipy/interpolate/tests/test_polyint.py +972 -0
  337. scipy/interpolate/tests/test_rbf.py +246 -0
  338. scipy/interpolate/tests/test_rbfinterp.py +534 -0
  339. scipy/interpolate/tests/test_rgi.py +1151 -0
  340. scipy/io/__init__.py +116 -0
  341. scipy/io/_fast_matrix_market/__init__.py +600 -0
  342. scipy/io/_fast_matrix_market/_fmm_core.cp314t-win_arm64.lib +0 -0
  343. scipy/io/_fast_matrix_market/_fmm_core.cp314t-win_arm64.pyd +0 -0
  344. scipy/io/_fortran.py +354 -0
  345. scipy/io/_harwell_boeing/__init__.py +7 -0
  346. scipy/io/_harwell_boeing/_fortran_format_parser.py +316 -0
  347. scipy/io/_harwell_boeing/hb.py +571 -0
  348. scipy/io/_harwell_boeing/tests/__init__.py +0 -0
  349. scipy/io/_harwell_boeing/tests/test_fortran_format.py +74 -0
  350. scipy/io/_harwell_boeing/tests/test_hb.py +70 -0
  351. scipy/io/_idl.py +917 -0
  352. scipy/io/_mmio.py +968 -0
  353. scipy/io/_netcdf.py +1104 -0
  354. scipy/io/_test_fortran.cp314t-win_arm64.lib +0 -0
  355. scipy/io/_test_fortran.cp314t-win_arm64.pyd +0 -0
  356. scipy/io/arff/__init__.py +28 -0
  357. scipy/io/arff/_arffread.py +873 -0
  358. scipy/io/arff/arffread.py +19 -0
  359. scipy/io/arff/tests/__init__.py +0 -0
  360. scipy/io/arff/tests/data/iris.arff +225 -0
  361. scipy/io/arff/tests/data/missing.arff +8 -0
  362. scipy/io/arff/tests/data/nodata.arff +11 -0
  363. scipy/io/arff/tests/data/quoted_nominal.arff +13 -0
  364. scipy/io/arff/tests/data/quoted_nominal_spaces.arff +13 -0
  365. scipy/io/arff/tests/data/test1.arff +10 -0
  366. scipy/io/arff/tests/data/test10.arff +8 -0
  367. scipy/io/arff/tests/data/test11.arff +11 -0
  368. scipy/io/arff/tests/data/test2.arff +15 -0
  369. scipy/io/arff/tests/data/test3.arff +6 -0
  370. scipy/io/arff/tests/data/test4.arff +11 -0
  371. scipy/io/arff/tests/data/test5.arff +26 -0
  372. scipy/io/arff/tests/data/test6.arff +12 -0
  373. scipy/io/arff/tests/data/test7.arff +15 -0
  374. scipy/io/arff/tests/data/test8.arff +12 -0
  375. scipy/io/arff/tests/data/test9.arff +14 -0
  376. scipy/io/arff/tests/test_arffread.py +421 -0
  377. scipy/io/harwell_boeing.py +17 -0
  378. scipy/io/idl.py +17 -0
  379. scipy/io/matlab/__init__.py +66 -0
  380. scipy/io/matlab/_byteordercodes.py +75 -0
  381. scipy/io/matlab/_mio.py +375 -0
  382. scipy/io/matlab/_mio4.py +632 -0
  383. scipy/io/matlab/_mio5.py +901 -0
  384. scipy/io/matlab/_mio5_params.py +281 -0
  385. scipy/io/matlab/_mio5_utils.cp314t-win_arm64.lib +0 -0
  386. scipy/io/matlab/_mio5_utils.cp314t-win_arm64.pyd +0 -0
  387. scipy/io/matlab/_mio_utils.cp314t-win_arm64.lib +0 -0
  388. scipy/io/matlab/_mio_utils.cp314t-win_arm64.pyd +0 -0
  389. scipy/io/matlab/_miobase.py +435 -0
  390. scipy/io/matlab/_streams.cp314t-win_arm64.lib +0 -0
  391. scipy/io/matlab/_streams.cp314t-win_arm64.pyd +0 -0
  392. scipy/io/matlab/byteordercodes.py +17 -0
  393. scipy/io/matlab/mio.py +16 -0
  394. scipy/io/matlab/mio4.py +17 -0
  395. scipy/io/matlab/mio5.py +19 -0
  396. scipy/io/matlab/mio5_params.py +18 -0
  397. scipy/io/matlab/mio5_utils.py +17 -0
  398. scipy/io/matlab/mio_utils.py +17 -0
  399. scipy/io/matlab/miobase.py +16 -0
  400. scipy/io/matlab/streams.py +16 -0
  401. scipy/io/matlab/tests/__init__.py +0 -0
  402. scipy/io/matlab/tests/data/bad_miuint32.mat +0 -0
  403. scipy/io/matlab/tests/data/bad_miutf8_array_name.mat +0 -0
  404. scipy/io/matlab/tests/data/big_endian.mat +0 -0
  405. scipy/io/matlab/tests/data/broken_utf8.mat +0 -0
  406. scipy/io/matlab/tests/data/corrupted_zlib_checksum.mat +0 -0
  407. scipy/io/matlab/tests/data/corrupted_zlib_data.mat +0 -0
  408. scipy/io/matlab/tests/data/debigged_m4.mat +0 -0
  409. scipy/io/matlab/tests/data/japanese_utf8.txt +5 -0
  410. scipy/io/matlab/tests/data/little_endian.mat +0 -0
  411. scipy/io/matlab/tests/data/logical_sparse.mat +0 -0
  412. scipy/io/matlab/tests/data/malformed1.mat +0 -0
  413. scipy/io/matlab/tests/data/miuint32_for_miint32.mat +0 -0
  414. scipy/io/matlab/tests/data/miutf8_array_name.mat +0 -0
  415. scipy/io/matlab/tests/data/nasty_duplicate_fieldnames.mat +0 -0
  416. scipy/io/matlab/tests/data/one_by_zero_char.mat +0 -0
  417. scipy/io/matlab/tests/data/parabola.mat +0 -0
  418. scipy/io/matlab/tests/data/single_empty_string.mat +0 -0
  419. scipy/io/matlab/tests/data/some_functions.mat +0 -0
  420. scipy/io/matlab/tests/data/sqr.mat +0 -0
  421. scipy/io/matlab/tests/data/test3dmatrix_6.1_SOL2.mat +0 -0
  422. scipy/io/matlab/tests/data/test3dmatrix_6.5.1_GLNX86.mat +0 -0
  423. scipy/io/matlab/tests/data/test3dmatrix_7.1_GLNX86.mat +0 -0
  424. scipy/io/matlab/tests/data/test3dmatrix_7.4_GLNX86.mat +0 -0
  425. scipy/io/matlab/tests/data/test_empty_struct.mat +0 -0
  426. scipy/io/matlab/tests/data/test_mat4_le_floats.mat +0 -0
  427. scipy/io/matlab/tests/data/test_skip_variable.mat +0 -0
  428. scipy/io/matlab/tests/data/testbool_8_WIN64.mat +0 -0
  429. scipy/io/matlab/tests/data/testcell_6.1_SOL2.mat +0 -0
  430. scipy/io/matlab/tests/data/testcell_6.5.1_GLNX86.mat +0 -0
  431. scipy/io/matlab/tests/data/testcell_7.1_GLNX86.mat +0 -0
  432. scipy/io/matlab/tests/data/testcell_7.4_GLNX86.mat +0 -0
  433. scipy/io/matlab/tests/data/testcellnest_6.1_SOL2.mat +0 -0
  434. scipy/io/matlab/tests/data/testcellnest_6.5.1_GLNX86.mat +0 -0
  435. scipy/io/matlab/tests/data/testcellnest_7.1_GLNX86.mat +0 -0
  436. scipy/io/matlab/tests/data/testcellnest_7.4_GLNX86.mat +0 -0
  437. scipy/io/matlab/tests/data/testcomplex_4.2c_SOL2.mat +0 -0
  438. scipy/io/matlab/tests/data/testcomplex_6.1_SOL2.mat +0 -0
  439. scipy/io/matlab/tests/data/testcomplex_6.5.1_GLNX86.mat +0 -0
  440. scipy/io/matlab/tests/data/testcomplex_7.1_GLNX86.mat +0 -0
  441. scipy/io/matlab/tests/data/testcomplex_7.4_GLNX86.mat +0 -0
  442. scipy/io/matlab/tests/data/testdouble_4.2c_SOL2.mat +0 -0
  443. scipy/io/matlab/tests/data/testdouble_6.1_SOL2.mat +0 -0
  444. scipy/io/matlab/tests/data/testdouble_6.5.1_GLNX86.mat +0 -0
  445. scipy/io/matlab/tests/data/testdouble_7.1_GLNX86.mat +0 -0
  446. scipy/io/matlab/tests/data/testdouble_7.4_GLNX86.mat +0 -0
  447. scipy/io/matlab/tests/data/testemptycell_5.3_SOL2.mat +0 -0
  448. scipy/io/matlab/tests/data/testemptycell_6.5.1_GLNX86.mat +0 -0
  449. scipy/io/matlab/tests/data/testemptycell_7.1_GLNX86.mat +0 -0
  450. scipy/io/matlab/tests/data/testemptycell_7.4_GLNX86.mat +0 -0
  451. scipy/io/matlab/tests/data/testfunc_7.4_GLNX86.mat +0 -0
  452. scipy/io/matlab/tests/data/testhdf5_7.4_GLNX86.mat +0 -0
  453. scipy/io/matlab/tests/data/testmatrix_4.2c_SOL2.mat +0 -0
  454. scipy/io/matlab/tests/data/testmatrix_6.1_SOL2.mat +0 -0
  455. scipy/io/matlab/tests/data/testmatrix_6.5.1_GLNX86.mat +0 -0
  456. scipy/io/matlab/tests/data/testmatrix_7.1_GLNX86.mat +0 -0
  457. scipy/io/matlab/tests/data/testmatrix_7.4_GLNX86.mat +0 -0
  458. scipy/io/matlab/tests/data/testminus_4.2c_SOL2.mat +0 -0
  459. scipy/io/matlab/tests/data/testminus_6.1_SOL2.mat +0 -0
  460. scipy/io/matlab/tests/data/testminus_6.5.1_GLNX86.mat +0 -0
  461. scipy/io/matlab/tests/data/testminus_7.1_GLNX86.mat +0 -0
  462. scipy/io/matlab/tests/data/testminus_7.4_GLNX86.mat +0 -0
  463. scipy/io/matlab/tests/data/testmulti_4.2c_SOL2.mat +0 -0
  464. scipy/io/matlab/tests/data/testmulti_7.1_GLNX86.mat +0 -0
  465. scipy/io/matlab/tests/data/testmulti_7.4_GLNX86.mat +0 -0
  466. scipy/io/matlab/tests/data/testobject_6.1_SOL2.mat +0 -0
  467. scipy/io/matlab/tests/data/testobject_6.5.1_GLNX86.mat +0 -0
  468. scipy/io/matlab/tests/data/testobject_7.1_GLNX86.mat +0 -0
  469. scipy/io/matlab/tests/data/testobject_7.4_GLNX86.mat +0 -0
  470. scipy/io/matlab/tests/data/testonechar_4.2c_SOL2.mat +0 -0
  471. scipy/io/matlab/tests/data/testonechar_6.1_SOL2.mat +0 -0
  472. scipy/io/matlab/tests/data/testonechar_6.5.1_GLNX86.mat +0 -0
  473. scipy/io/matlab/tests/data/testonechar_7.1_GLNX86.mat +0 -0
  474. scipy/io/matlab/tests/data/testonechar_7.4_GLNX86.mat +0 -0
  475. scipy/io/matlab/tests/data/testscalarcell_7.4_GLNX86.mat +0 -0
  476. scipy/io/matlab/tests/data/testsimplecell.mat +0 -0
  477. scipy/io/matlab/tests/data/testsparse_4.2c_SOL2.mat +0 -0
  478. scipy/io/matlab/tests/data/testsparse_6.1_SOL2.mat +0 -0
  479. scipy/io/matlab/tests/data/testsparse_6.5.1_GLNX86.mat +0 -0
  480. scipy/io/matlab/tests/data/testsparse_7.1_GLNX86.mat +0 -0
  481. scipy/io/matlab/tests/data/testsparse_7.4_GLNX86.mat +0 -0
  482. scipy/io/matlab/tests/data/testsparsecomplex_4.2c_SOL2.mat +0 -0
  483. scipy/io/matlab/tests/data/testsparsecomplex_6.1_SOL2.mat +0 -0
  484. scipy/io/matlab/tests/data/testsparsecomplex_6.5.1_GLNX86.mat +0 -0
  485. scipy/io/matlab/tests/data/testsparsecomplex_7.1_GLNX86.mat +0 -0
  486. scipy/io/matlab/tests/data/testsparsecomplex_7.4_GLNX86.mat +0 -0
  487. scipy/io/matlab/tests/data/testsparsefloat_7.4_GLNX86.mat +0 -0
  488. scipy/io/matlab/tests/data/teststring_4.2c_SOL2.mat +0 -0
  489. scipy/io/matlab/tests/data/teststring_6.1_SOL2.mat +0 -0
  490. scipy/io/matlab/tests/data/teststring_6.5.1_GLNX86.mat +0 -0
  491. scipy/io/matlab/tests/data/teststring_7.1_GLNX86.mat +0 -0
  492. scipy/io/matlab/tests/data/teststring_7.4_GLNX86.mat +0 -0
  493. scipy/io/matlab/tests/data/teststringarray_4.2c_SOL2.mat +0 -0
  494. scipy/io/matlab/tests/data/teststringarray_6.1_SOL2.mat +0 -0
  495. scipy/io/matlab/tests/data/teststringarray_6.5.1_GLNX86.mat +0 -0
  496. scipy/io/matlab/tests/data/teststringarray_7.1_GLNX86.mat +0 -0
  497. scipy/io/matlab/tests/data/teststringarray_7.4_GLNX86.mat +0 -0
  498. scipy/io/matlab/tests/data/teststruct_6.1_SOL2.mat +0 -0
  499. scipy/io/matlab/tests/data/teststruct_6.5.1_GLNX86.mat +0 -0
  500. scipy/io/matlab/tests/data/teststruct_7.1_GLNX86.mat +0 -0
  501. scipy/io/matlab/tests/data/teststruct_7.4_GLNX86.mat +0 -0
  502. scipy/io/matlab/tests/data/teststructarr_6.1_SOL2.mat +0 -0
  503. scipy/io/matlab/tests/data/teststructarr_6.5.1_GLNX86.mat +0 -0
  504. scipy/io/matlab/tests/data/teststructarr_7.1_GLNX86.mat +0 -0
  505. scipy/io/matlab/tests/data/teststructarr_7.4_GLNX86.mat +0 -0
  506. scipy/io/matlab/tests/data/teststructnest_6.1_SOL2.mat +0 -0
  507. scipy/io/matlab/tests/data/teststructnest_6.5.1_GLNX86.mat +0 -0
  508. scipy/io/matlab/tests/data/teststructnest_7.1_GLNX86.mat +0 -0
  509. scipy/io/matlab/tests/data/teststructnest_7.4_GLNX86.mat +0 -0
  510. scipy/io/matlab/tests/data/testunicode_7.1_GLNX86.mat +0 -0
  511. scipy/io/matlab/tests/data/testunicode_7.4_GLNX86.mat +0 -0
  512. scipy/io/matlab/tests/data/testvec_4_GLNX86.mat +0 -0
  513. scipy/io/matlab/tests/test_byteordercodes.py +29 -0
  514. scipy/io/matlab/tests/test_mio.py +1399 -0
  515. scipy/io/matlab/tests/test_mio5_utils.py +179 -0
  516. scipy/io/matlab/tests/test_mio_funcs.py +51 -0
  517. scipy/io/matlab/tests/test_mio_utils.py +45 -0
  518. scipy/io/matlab/tests/test_miobase.py +32 -0
  519. scipy/io/matlab/tests/test_pathological.py +33 -0
  520. scipy/io/matlab/tests/test_streams.py +241 -0
  521. scipy/io/mmio.py +17 -0
  522. scipy/io/netcdf.py +17 -0
  523. scipy/io/tests/__init__.py +0 -0
  524. scipy/io/tests/data/Transparent Busy.ani +0 -0
  525. scipy/io/tests/data/array_float32_1d.sav +0 -0
  526. scipy/io/tests/data/array_float32_2d.sav +0 -0
  527. scipy/io/tests/data/array_float32_3d.sav +0 -0
  528. scipy/io/tests/data/array_float32_4d.sav +0 -0
  529. scipy/io/tests/data/array_float32_5d.sav +0 -0
  530. scipy/io/tests/data/array_float32_6d.sav +0 -0
  531. scipy/io/tests/data/array_float32_7d.sav +0 -0
  532. scipy/io/tests/data/array_float32_8d.sav +0 -0
  533. scipy/io/tests/data/array_float32_pointer_1d.sav +0 -0
  534. scipy/io/tests/data/array_float32_pointer_2d.sav +0 -0
  535. scipy/io/tests/data/array_float32_pointer_3d.sav +0 -0
  536. scipy/io/tests/data/array_float32_pointer_4d.sav +0 -0
  537. scipy/io/tests/data/array_float32_pointer_5d.sav +0 -0
  538. scipy/io/tests/data/array_float32_pointer_6d.sav +0 -0
  539. scipy/io/tests/data/array_float32_pointer_7d.sav +0 -0
  540. scipy/io/tests/data/array_float32_pointer_8d.sav +0 -0
  541. scipy/io/tests/data/example_1.nc +0 -0
  542. scipy/io/tests/data/example_2.nc +0 -0
  543. scipy/io/tests/data/example_3_maskedvals.nc +0 -0
  544. scipy/io/tests/data/fortran-3x3d-2i.dat +0 -0
  545. scipy/io/tests/data/fortran-mixed.dat +0 -0
  546. scipy/io/tests/data/fortran-sf8-11x1x10.dat +0 -0
  547. scipy/io/tests/data/fortran-sf8-15x10x22.dat +0 -0
  548. scipy/io/tests/data/fortran-sf8-1x1x1.dat +0 -0
  549. scipy/io/tests/data/fortran-sf8-1x1x5.dat +0 -0
  550. scipy/io/tests/data/fortran-sf8-1x1x7.dat +0 -0
  551. scipy/io/tests/data/fortran-sf8-1x3x5.dat +0 -0
  552. scipy/io/tests/data/fortran-si4-11x1x10.dat +0 -0
  553. scipy/io/tests/data/fortran-si4-15x10x22.dat +0 -0
  554. scipy/io/tests/data/fortran-si4-1x1x1.dat +0 -0
  555. scipy/io/tests/data/fortran-si4-1x1x5.dat +0 -0
  556. scipy/io/tests/data/fortran-si4-1x1x7.dat +0 -0
  557. scipy/io/tests/data/fortran-si4-1x3x5.dat +0 -0
  558. scipy/io/tests/data/invalid_pointer.sav +0 -0
  559. scipy/io/tests/data/null_pointer.sav +0 -0
  560. scipy/io/tests/data/scalar_byte.sav +0 -0
  561. scipy/io/tests/data/scalar_byte_descr.sav +0 -0
  562. scipy/io/tests/data/scalar_complex32.sav +0 -0
  563. scipy/io/tests/data/scalar_complex64.sav +0 -0
  564. scipy/io/tests/data/scalar_float32.sav +0 -0
  565. scipy/io/tests/data/scalar_float64.sav +0 -0
  566. scipy/io/tests/data/scalar_heap_pointer.sav +0 -0
  567. scipy/io/tests/data/scalar_int16.sav +0 -0
  568. scipy/io/tests/data/scalar_int32.sav +0 -0
  569. scipy/io/tests/data/scalar_int64.sav +0 -0
  570. scipy/io/tests/data/scalar_string.sav +0 -0
  571. scipy/io/tests/data/scalar_uint16.sav +0 -0
  572. scipy/io/tests/data/scalar_uint32.sav +0 -0
  573. scipy/io/tests/data/scalar_uint64.sav +0 -0
  574. scipy/io/tests/data/struct_arrays.sav +0 -0
  575. scipy/io/tests/data/struct_arrays_byte_idl80.sav +0 -0
  576. scipy/io/tests/data/struct_arrays_replicated.sav +0 -0
  577. scipy/io/tests/data/struct_arrays_replicated_3d.sav +0 -0
  578. scipy/io/tests/data/struct_inherit.sav +0 -0
  579. scipy/io/tests/data/struct_pointer_arrays.sav +0 -0
  580. scipy/io/tests/data/struct_pointer_arrays_replicated.sav +0 -0
  581. scipy/io/tests/data/struct_pointer_arrays_replicated_3d.sav +0 -0
  582. scipy/io/tests/data/struct_pointers.sav +0 -0
  583. scipy/io/tests/data/struct_pointers_replicated.sav +0 -0
  584. scipy/io/tests/data/struct_pointers_replicated_3d.sav +0 -0
  585. scipy/io/tests/data/struct_scalars.sav +0 -0
  586. scipy/io/tests/data/struct_scalars_replicated.sav +0 -0
  587. scipy/io/tests/data/struct_scalars_replicated_3d.sav +0 -0
  588. scipy/io/tests/data/test-1234Hz-le-1ch-10S-20bit-extra.wav +0 -0
  589. scipy/io/tests/data/test-44100Hz-2ch-32bit-float-be.wav +0 -0
  590. scipy/io/tests/data/test-44100Hz-2ch-32bit-float-le.wav +0 -0
  591. scipy/io/tests/data/test-44100Hz-be-1ch-4bytes.wav +0 -0
  592. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-early-eof-no-data.wav +0 -0
  593. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-early-eof.wav +0 -0
  594. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-incomplete-chunk.wav +0 -0
  595. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-rf64.wav +0 -0
  596. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes.wav +0 -0
  597. scipy/io/tests/data/test-48000Hz-2ch-64bit-float-le-wavex.wav +0 -0
  598. scipy/io/tests/data/test-8000Hz-be-3ch-5S-24bit.wav +0 -0
  599. scipy/io/tests/data/test-8000Hz-le-1ch-1byte-ulaw.wav +0 -0
  600. scipy/io/tests/data/test-8000Hz-le-2ch-1byteu.wav +0 -0
  601. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit-inconsistent.wav +0 -0
  602. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit-rf64.wav +0 -0
  603. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit.wav +0 -0
  604. scipy/io/tests/data/test-8000Hz-le-3ch-5S-36bit.wav +0 -0
  605. scipy/io/tests/data/test-8000Hz-le-3ch-5S-45bit.wav +0 -0
  606. scipy/io/tests/data/test-8000Hz-le-3ch-5S-53bit.wav +0 -0
  607. scipy/io/tests/data/test-8000Hz-le-3ch-5S-64bit.wav +0 -0
  608. scipy/io/tests/data/test-8000Hz-le-4ch-9S-12bit.wav +0 -0
  609. scipy/io/tests/data/test-8000Hz-le-5ch-9S-5bit.wav +0 -0
  610. scipy/io/tests/data/various_compressed.sav +0 -0
  611. scipy/io/tests/test_fortran.py +264 -0
  612. scipy/io/tests/test_idl.py +483 -0
  613. scipy/io/tests/test_mmio.py +831 -0
  614. scipy/io/tests/test_netcdf.py +550 -0
  615. scipy/io/tests/test_paths.py +93 -0
  616. scipy/io/tests/test_wavfile.py +501 -0
  617. scipy/io/wavfile.py +938 -0
  618. scipy/linalg/__init__.pxd +1 -0
  619. scipy/linalg/__init__.py +236 -0
  620. scipy/linalg/_basic.py +2146 -0
  621. scipy/linalg/_blas_subroutines.h +164 -0
  622. scipy/linalg/_cythonized_array_utils.cp314t-win_arm64.lib +0 -0
  623. scipy/linalg/_cythonized_array_utils.cp314t-win_arm64.pyd +0 -0
  624. scipy/linalg/_cythonized_array_utils.pxd +40 -0
  625. scipy/linalg/_cythonized_array_utils.pyi +16 -0
  626. scipy/linalg/_decomp.py +1645 -0
  627. scipy/linalg/_decomp_cholesky.py +413 -0
  628. scipy/linalg/_decomp_cossin.py +236 -0
  629. scipy/linalg/_decomp_interpolative.cp314t-win_arm64.lib +0 -0
  630. scipy/linalg/_decomp_interpolative.cp314t-win_arm64.pyd +0 -0
  631. scipy/linalg/_decomp_ldl.py +356 -0
  632. scipy/linalg/_decomp_lu.py +401 -0
  633. scipy/linalg/_decomp_lu_cython.cp314t-win_arm64.lib +0 -0
  634. scipy/linalg/_decomp_lu_cython.cp314t-win_arm64.pyd +0 -0
  635. scipy/linalg/_decomp_lu_cython.pyi +6 -0
  636. scipy/linalg/_decomp_polar.py +113 -0
  637. scipy/linalg/_decomp_qr.py +494 -0
  638. scipy/linalg/_decomp_qz.py +452 -0
  639. scipy/linalg/_decomp_schur.py +336 -0
  640. scipy/linalg/_decomp_svd.py +545 -0
  641. scipy/linalg/_decomp_update.cp314t-win_arm64.lib +0 -0
  642. scipy/linalg/_decomp_update.cp314t-win_arm64.pyd +0 -0
  643. scipy/linalg/_expm_frechet.py +417 -0
  644. scipy/linalg/_fblas.cp314t-win_arm64.lib +0 -0
  645. scipy/linalg/_fblas.cp314t-win_arm64.pyd +0 -0
  646. scipy/linalg/_flapack.cp314t-win_arm64.lib +0 -0
  647. scipy/linalg/_flapack.cp314t-win_arm64.pyd +0 -0
  648. scipy/linalg/_lapack_subroutines.h +1521 -0
  649. scipy/linalg/_linalg_pythran.cp314t-win_arm64.lib +0 -0
  650. scipy/linalg/_linalg_pythran.cp314t-win_arm64.pyd +0 -0
  651. scipy/linalg/_matfuncs.py +1050 -0
  652. scipy/linalg/_matfuncs_expm.cp314t-win_arm64.lib +0 -0
  653. scipy/linalg/_matfuncs_expm.cp314t-win_arm64.pyd +0 -0
  654. scipy/linalg/_matfuncs_expm.pyi +6 -0
  655. scipy/linalg/_matfuncs_inv_ssq.py +886 -0
  656. scipy/linalg/_matfuncs_schur_sqrtm.cp314t-win_arm64.lib +0 -0
  657. scipy/linalg/_matfuncs_schur_sqrtm.cp314t-win_arm64.pyd +0 -0
  658. scipy/linalg/_matfuncs_sqrtm.py +107 -0
  659. scipy/linalg/_matfuncs_sqrtm_triu.cp314t-win_arm64.lib +0 -0
  660. scipy/linalg/_matfuncs_sqrtm_triu.cp314t-win_arm64.pyd +0 -0
  661. scipy/linalg/_misc.py +191 -0
  662. scipy/linalg/_procrustes.py +113 -0
  663. scipy/linalg/_sketches.py +189 -0
  664. scipy/linalg/_solve_toeplitz.cp314t-win_arm64.lib +0 -0
  665. scipy/linalg/_solve_toeplitz.cp314t-win_arm64.pyd +0 -0
  666. scipy/linalg/_solvers.py +862 -0
  667. scipy/linalg/_special_matrices.py +1322 -0
  668. scipy/linalg/_testutils.py +65 -0
  669. scipy/linalg/basic.py +23 -0
  670. scipy/linalg/blas.py +495 -0
  671. scipy/linalg/cython_blas.cp314t-win_arm64.lib +0 -0
  672. scipy/linalg/cython_blas.cp314t-win_arm64.pyd +0 -0
  673. scipy/linalg/cython_blas.pxd +169 -0
  674. scipy/linalg/cython_blas.pyx +1432 -0
  675. scipy/linalg/cython_lapack.cp314t-win_arm64.lib +0 -0
  676. scipy/linalg/cython_lapack.cp314t-win_arm64.pyd +0 -0
  677. scipy/linalg/cython_lapack.pxd +1528 -0
  678. scipy/linalg/cython_lapack.pyx +12045 -0
  679. scipy/linalg/decomp.py +23 -0
  680. scipy/linalg/decomp_cholesky.py +21 -0
  681. scipy/linalg/decomp_lu.py +21 -0
  682. scipy/linalg/decomp_qr.py +20 -0
  683. scipy/linalg/decomp_schur.py +21 -0
  684. scipy/linalg/decomp_svd.py +21 -0
  685. scipy/linalg/interpolative.py +989 -0
  686. scipy/linalg/lapack.py +1081 -0
  687. scipy/linalg/matfuncs.py +23 -0
  688. scipy/linalg/misc.py +21 -0
  689. scipy/linalg/special_matrices.py +22 -0
  690. scipy/linalg/tests/__init__.py +0 -0
  691. scipy/linalg/tests/_cython_examples/extending.pyx +23 -0
  692. scipy/linalg/tests/_cython_examples/meson.build +34 -0
  693. scipy/linalg/tests/data/carex_15_data.npz +0 -0
  694. scipy/linalg/tests/data/carex_18_data.npz +0 -0
  695. scipy/linalg/tests/data/carex_19_data.npz +0 -0
  696. scipy/linalg/tests/data/carex_20_data.npz +0 -0
  697. scipy/linalg/tests/data/carex_6_data.npz +0 -0
  698. scipy/linalg/tests/data/gendare_20170120_data.npz +0 -0
  699. scipy/linalg/tests/test_basic.py +2074 -0
  700. scipy/linalg/tests/test_batch.py +588 -0
  701. scipy/linalg/tests/test_blas.py +1127 -0
  702. scipy/linalg/tests/test_cython_blas.py +118 -0
  703. scipy/linalg/tests/test_cython_lapack.py +22 -0
  704. scipy/linalg/tests/test_cythonized_array_utils.py +130 -0
  705. scipy/linalg/tests/test_decomp.py +3189 -0
  706. scipy/linalg/tests/test_decomp_cholesky.py +268 -0
  707. scipy/linalg/tests/test_decomp_cossin.py +314 -0
  708. scipy/linalg/tests/test_decomp_ldl.py +137 -0
  709. scipy/linalg/tests/test_decomp_lu.py +308 -0
  710. scipy/linalg/tests/test_decomp_polar.py +110 -0
  711. scipy/linalg/tests/test_decomp_update.py +1701 -0
  712. scipy/linalg/tests/test_extending.py +46 -0
  713. scipy/linalg/tests/test_fblas.py +607 -0
  714. scipy/linalg/tests/test_interpolative.py +232 -0
  715. scipy/linalg/tests/test_lapack.py +3620 -0
  716. scipy/linalg/tests/test_matfuncs.py +1125 -0
  717. scipy/linalg/tests/test_matmul_toeplitz.py +136 -0
  718. scipy/linalg/tests/test_procrustes.py +214 -0
  719. scipy/linalg/tests/test_sketches.py +118 -0
  720. scipy/linalg/tests/test_solve_toeplitz.py +150 -0
  721. scipy/linalg/tests/test_solvers.py +844 -0
  722. scipy/linalg/tests/test_special_matrices.py +636 -0
  723. scipy/misc/__init__.py +6 -0
  724. scipy/misc/common.py +6 -0
  725. scipy/misc/doccer.py +6 -0
  726. scipy/ndimage/__init__.py +174 -0
  727. scipy/ndimage/_ctest.cp314t-win_arm64.lib +0 -0
  728. scipy/ndimage/_ctest.cp314t-win_arm64.pyd +0 -0
  729. scipy/ndimage/_cytest.cp314t-win_arm64.lib +0 -0
  730. scipy/ndimage/_cytest.cp314t-win_arm64.pyd +0 -0
  731. scipy/ndimage/_delegators.py +303 -0
  732. scipy/ndimage/_filters.py +2422 -0
  733. scipy/ndimage/_fourier.py +306 -0
  734. scipy/ndimage/_interpolation.py +1033 -0
  735. scipy/ndimage/_measurements.py +1689 -0
  736. scipy/ndimage/_morphology.py +2634 -0
  737. scipy/ndimage/_nd_image.cp314t-win_arm64.lib +0 -0
  738. scipy/ndimage/_nd_image.cp314t-win_arm64.pyd +0 -0
  739. scipy/ndimage/_ndimage_api.py +16 -0
  740. scipy/ndimage/_ni_docstrings.py +214 -0
  741. scipy/ndimage/_ni_label.cp314t-win_arm64.lib +0 -0
  742. scipy/ndimage/_ni_label.cp314t-win_arm64.pyd +0 -0
  743. scipy/ndimage/_ni_support.py +139 -0
  744. scipy/ndimage/_rank_filter_1d.cp314t-win_arm64.lib +0 -0
  745. scipy/ndimage/_rank_filter_1d.cp314t-win_arm64.pyd +0 -0
  746. scipy/ndimage/_support_alternative_backends.py +84 -0
  747. scipy/ndimage/filters.py +27 -0
  748. scipy/ndimage/fourier.py +21 -0
  749. scipy/ndimage/interpolation.py +22 -0
  750. scipy/ndimage/measurements.py +24 -0
  751. scipy/ndimage/morphology.py +27 -0
  752. scipy/ndimage/tests/__init__.py +12 -0
  753. scipy/ndimage/tests/data/label_inputs.txt +21 -0
  754. scipy/ndimage/tests/data/label_results.txt +294 -0
  755. scipy/ndimage/tests/data/label_strels.txt +42 -0
  756. scipy/ndimage/tests/dots.png +0 -0
  757. scipy/ndimage/tests/test_c_api.py +102 -0
  758. scipy/ndimage/tests/test_datatypes.py +67 -0
  759. scipy/ndimage/tests/test_filters.py +3083 -0
  760. scipy/ndimage/tests/test_fourier.py +187 -0
  761. scipy/ndimage/tests/test_interpolation.py +1491 -0
  762. scipy/ndimage/tests/test_measurements.py +1592 -0
  763. scipy/ndimage/tests/test_morphology.py +2950 -0
  764. scipy/ndimage/tests/test_ni_support.py +78 -0
  765. scipy/ndimage/tests/test_splines.py +70 -0
  766. scipy/odr/__init__.py +131 -0
  767. scipy/odr/__odrpack.cp314t-win_arm64.lib +0 -0
  768. scipy/odr/__odrpack.cp314t-win_arm64.pyd +0 -0
  769. scipy/odr/_add_newdocs.py +34 -0
  770. scipy/odr/_models.py +315 -0
  771. scipy/odr/_odrpack.py +1154 -0
  772. scipy/odr/models.py +20 -0
  773. scipy/odr/odrpack.py +21 -0
  774. scipy/odr/tests/__init__.py +0 -0
  775. scipy/odr/tests/test_odr.py +607 -0
  776. scipy/optimize/__init__.pxd +1 -0
  777. scipy/optimize/__init__.py +460 -0
  778. scipy/optimize/_basinhopping.py +741 -0
  779. scipy/optimize/_bglu_dense.cp314t-win_arm64.lib +0 -0
  780. scipy/optimize/_bglu_dense.cp314t-win_arm64.pyd +0 -0
  781. scipy/optimize/_bracket.py +706 -0
  782. scipy/optimize/_chandrupatla.py +551 -0
  783. scipy/optimize/_cobyla_py.py +297 -0
  784. scipy/optimize/_cobyqa_py.py +72 -0
  785. scipy/optimize/_constraints.py +598 -0
  786. scipy/optimize/_dcsrch.py +728 -0
  787. scipy/optimize/_differentiable_functions.py +835 -0
  788. scipy/optimize/_differentialevolution.py +1970 -0
  789. scipy/optimize/_direct.cp314t-win_arm64.lib +0 -0
  790. scipy/optimize/_direct.cp314t-win_arm64.pyd +0 -0
  791. scipy/optimize/_direct_py.py +280 -0
  792. scipy/optimize/_dual_annealing.py +732 -0
  793. scipy/optimize/_elementwise.py +798 -0
  794. scipy/optimize/_group_columns.cp314t-win_arm64.lib +0 -0
  795. scipy/optimize/_group_columns.cp314t-win_arm64.pyd +0 -0
  796. scipy/optimize/_hessian_update_strategy.py +479 -0
  797. scipy/optimize/_highspy/__init__.py +0 -0
  798. scipy/optimize/_highspy/_core.cp314t-win_arm64.lib +0 -0
  799. scipy/optimize/_highspy/_core.cp314t-win_arm64.pyd +0 -0
  800. scipy/optimize/_highspy/_highs_options.cp314t-win_arm64.lib +0 -0
  801. scipy/optimize/_highspy/_highs_options.cp314t-win_arm64.pyd +0 -0
  802. scipy/optimize/_highspy/_highs_wrapper.py +338 -0
  803. scipy/optimize/_isotonic.py +157 -0
  804. scipy/optimize/_lbfgsb.cp314t-win_arm64.lib +0 -0
  805. scipy/optimize/_lbfgsb.cp314t-win_arm64.pyd +0 -0
  806. scipy/optimize/_lbfgsb_py.py +634 -0
  807. scipy/optimize/_linesearch.py +896 -0
  808. scipy/optimize/_linprog.py +733 -0
  809. scipy/optimize/_linprog_doc.py +1434 -0
  810. scipy/optimize/_linprog_highs.py +422 -0
  811. scipy/optimize/_linprog_ip.py +1141 -0
  812. scipy/optimize/_linprog_rs.py +572 -0
  813. scipy/optimize/_linprog_simplex.py +663 -0
  814. scipy/optimize/_linprog_util.py +1521 -0
  815. scipy/optimize/_lsap.cp314t-win_arm64.lib +0 -0
  816. scipy/optimize/_lsap.cp314t-win_arm64.pyd +0 -0
  817. scipy/optimize/_lsq/__init__.py +5 -0
  818. scipy/optimize/_lsq/bvls.py +183 -0
  819. scipy/optimize/_lsq/common.py +731 -0
  820. scipy/optimize/_lsq/dogbox.py +345 -0
  821. scipy/optimize/_lsq/givens_elimination.cp314t-win_arm64.lib +0 -0
  822. scipy/optimize/_lsq/givens_elimination.cp314t-win_arm64.pyd +0 -0
  823. scipy/optimize/_lsq/least_squares.py +1044 -0
  824. scipy/optimize/_lsq/lsq_linear.py +361 -0
  825. scipy/optimize/_lsq/trf.py +587 -0
  826. scipy/optimize/_lsq/trf_linear.py +249 -0
  827. scipy/optimize/_milp.py +394 -0
  828. scipy/optimize/_minimize.py +1199 -0
  829. scipy/optimize/_minpack.cp314t-win_arm64.lib +0 -0
  830. scipy/optimize/_minpack.cp314t-win_arm64.pyd +0 -0
  831. scipy/optimize/_minpack_py.py +1178 -0
  832. scipy/optimize/_moduleTNC.cp314t-win_arm64.lib +0 -0
  833. scipy/optimize/_moduleTNC.cp314t-win_arm64.pyd +0 -0
  834. scipy/optimize/_nnls.py +96 -0
  835. scipy/optimize/_nonlin.py +1634 -0
  836. scipy/optimize/_numdiff.py +963 -0
  837. scipy/optimize/_optimize.py +4169 -0
  838. scipy/optimize/_pava_pybind.cp314t-win_arm64.lib +0 -0
  839. scipy/optimize/_pava_pybind.cp314t-win_arm64.pyd +0 -0
  840. scipy/optimize/_qap.py +760 -0
  841. scipy/optimize/_remove_redundancy.py +522 -0
  842. scipy/optimize/_root.py +732 -0
  843. scipy/optimize/_root_scalar.py +538 -0
  844. scipy/optimize/_shgo.py +1606 -0
  845. scipy/optimize/_shgo_lib/__init__.py +0 -0
  846. scipy/optimize/_shgo_lib/_complex.py +1225 -0
  847. scipy/optimize/_shgo_lib/_vertex.py +460 -0
  848. scipy/optimize/_slsqp_py.py +603 -0
  849. scipy/optimize/_slsqplib.cp314t-win_arm64.lib +0 -0
  850. scipy/optimize/_slsqplib.cp314t-win_arm64.pyd +0 -0
  851. scipy/optimize/_spectral.py +260 -0
  852. scipy/optimize/_tnc.py +438 -0
  853. scipy/optimize/_trlib/__init__.py +12 -0
  854. scipy/optimize/_trlib/_trlib.cp314t-win_arm64.lib +0 -0
  855. scipy/optimize/_trlib/_trlib.cp314t-win_arm64.pyd +0 -0
  856. scipy/optimize/_trustregion.py +318 -0
  857. scipy/optimize/_trustregion_constr/__init__.py +6 -0
  858. scipy/optimize/_trustregion_constr/canonical_constraint.py +390 -0
  859. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +231 -0
  860. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +584 -0
  861. scipy/optimize/_trustregion_constr/projections.py +411 -0
  862. scipy/optimize/_trustregion_constr/qp_subproblem.py +637 -0
  863. scipy/optimize/_trustregion_constr/report.py +49 -0
  864. scipy/optimize/_trustregion_constr/tests/__init__.py +0 -0
  865. scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py +296 -0
  866. scipy/optimize/_trustregion_constr/tests/test_nested_minimize.py +39 -0
  867. scipy/optimize/_trustregion_constr/tests/test_projections.py +214 -0
  868. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +645 -0
  869. scipy/optimize/_trustregion_constr/tests/test_report.py +34 -0
  870. scipy/optimize/_trustregion_constr/tr_interior_point.py +361 -0
  871. scipy/optimize/_trustregion_dogleg.py +122 -0
  872. scipy/optimize/_trustregion_exact.py +437 -0
  873. scipy/optimize/_trustregion_krylov.py +65 -0
  874. scipy/optimize/_trustregion_ncg.py +126 -0
  875. scipy/optimize/_tstutils.py +972 -0
  876. scipy/optimize/_zeros.cp314t-win_arm64.lib +0 -0
  877. scipy/optimize/_zeros.cp314t-win_arm64.pyd +0 -0
  878. scipy/optimize/_zeros_py.py +1475 -0
  879. scipy/optimize/cobyla.py +19 -0
  880. scipy/optimize/cython_optimize/__init__.py +133 -0
  881. scipy/optimize/cython_optimize/_zeros.cp314t-win_arm64.lib +0 -0
  882. scipy/optimize/cython_optimize/_zeros.cp314t-win_arm64.pyd +0 -0
  883. scipy/optimize/cython_optimize/_zeros.pxd +33 -0
  884. scipy/optimize/cython_optimize/c_zeros.pxd +26 -0
  885. scipy/optimize/cython_optimize.pxd +11 -0
  886. scipy/optimize/elementwise.py +38 -0
  887. scipy/optimize/lbfgsb.py +23 -0
  888. scipy/optimize/linesearch.py +18 -0
  889. scipy/optimize/minpack.py +27 -0
  890. scipy/optimize/minpack2.py +17 -0
  891. scipy/optimize/moduleTNC.py +19 -0
  892. scipy/optimize/nonlin.py +29 -0
  893. scipy/optimize/optimize.py +40 -0
  894. scipy/optimize/slsqp.py +22 -0
  895. scipy/optimize/tests/__init__.py +0 -0
  896. scipy/optimize/tests/_cython_examples/extending.pyx +43 -0
  897. scipy/optimize/tests/_cython_examples/meson.build +32 -0
  898. scipy/optimize/tests/test__basinhopping.py +535 -0
  899. scipy/optimize/tests/test__differential_evolution.py +1703 -0
  900. scipy/optimize/tests/test__dual_annealing.py +416 -0
  901. scipy/optimize/tests/test__linprog_clean_inputs.py +312 -0
  902. scipy/optimize/tests/test__numdiff.py +885 -0
  903. scipy/optimize/tests/test__remove_redundancy.py +228 -0
  904. scipy/optimize/tests/test__root.py +124 -0
  905. scipy/optimize/tests/test__shgo.py +1164 -0
  906. scipy/optimize/tests/test__spectral.py +226 -0
  907. scipy/optimize/tests/test_bracket.py +896 -0
  908. scipy/optimize/tests/test_chandrupatla.py +982 -0
  909. scipy/optimize/tests/test_cobyla.py +195 -0
  910. scipy/optimize/tests/test_cobyqa.py +252 -0
  911. scipy/optimize/tests/test_constraint_conversion.py +286 -0
  912. scipy/optimize/tests/test_constraints.py +255 -0
  913. scipy/optimize/tests/test_cython_optimize.py +92 -0
  914. scipy/optimize/tests/test_differentiable_functions.py +1025 -0
  915. scipy/optimize/tests/test_direct.py +321 -0
  916. scipy/optimize/tests/test_extending.py +28 -0
  917. scipy/optimize/tests/test_hessian_update_strategy.py +300 -0
  918. scipy/optimize/tests/test_isotonic_regression.py +167 -0
  919. scipy/optimize/tests/test_lbfgsb_hessinv.py +65 -0
  920. scipy/optimize/tests/test_lbfgsb_setulb.py +122 -0
  921. scipy/optimize/tests/test_least_squares.py +986 -0
  922. scipy/optimize/tests/test_linear_assignment.py +116 -0
  923. scipy/optimize/tests/test_linesearch.py +328 -0
  924. scipy/optimize/tests/test_linprog.py +2577 -0
  925. scipy/optimize/tests/test_lsq_common.py +297 -0
  926. scipy/optimize/tests/test_lsq_linear.py +287 -0
  927. scipy/optimize/tests/test_milp.py +459 -0
  928. scipy/optimize/tests/test_minimize_constrained.py +845 -0
  929. scipy/optimize/tests/test_minpack.py +1194 -0
  930. scipy/optimize/tests/test_nnls.py +469 -0
  931. scipy/optimize/tests/test_nonlin.py +572 -0
  932. scipy/optimize/tests/test_optimize.py +3344 -0
  933. scipy/optimize/tests/test_quadratic_assignment.py +455 -0
  934. scipy/optimize/tests/test_regression.py +40 -0
  935. scipy/optimize/tests/test_slsqp.py +645 -0
  936. scipy/optimize/tests/test_tnc.py +345 -0
  937. scipy/optimize/tests/test_trustregion.py +110 -0
  938. scipy/optimize/tests/test_trustregion_exact.py +351 -0
  939. scipy/optimize/tests/test_trustregion_krylov.py +170 -0
  940. scipy/optimize/tests/test_zeros.py +998 -0
  941. scipy/optimize/tnc.py +22 -0
  942. scipy/optimize/zeros.py +26 -0
  943. scipy/signal/__init__.py +316 -0
  944. scipy/signal/_arraytools.py +264 -0
  945. scipy/signal/_czt.py +575 -0
  946. scipy/signal/_delegators.py +568 -0
  947. scipy/signal/_filter_design.py +5893 -0
  948. scipy/signal/_fir_filter_design.py +1458 -0
  949. scipy/signal/_lti_conversion.py +534 -0
  950. scipy/signal/_ltisys.py +3546 -0
  951. scipy/signal/_max_len_seq.py +139 -0
  952. scipy/signal/_max_len_seq_inner.cp314t-win_arm64.lib +0 -0
  953. scipy/signal/_max_len_seq_inner.cp314t-win_arm64.pyd +0 -0
  954. scipy/signal/_peak_finding.py +1310 -0
  955. scipy/signal/_peak_finding_utils.cp314t-win_arm64.lib +0 -0
  956. scipy/signal/_peak_finding_utils.cp314t-win_arm64.pyd +0 -0
  957. scipy/signal/_polyutils.py +172 -0
  958. scipy/signal/_savitzky_golay.py +357 -0
  959. scipy/signal/_short_time_fft.py +2228 -0
  960. scipy/signal/_signal_api.py +30 -0
  961. scipy/signal/_signaltools.py +5309 -0
  962. scipy/signal/_sigtools.cp314t-win_arm64.lib +0 -0
  963. scipy/signal/_sigtools.cp314t-win_arm64.pyd +0 -0
  964. scipy/signal/_sosfilt.cp314t-win_arm64.lib +0 -0
  965. scipy/signal/_sosfilt.cp314t-win_arm64.pyd +0 -0
  966. scipy/signal/_spectral_py.py +2471 -0
  967. scipy/signal/_spline.cp314t-win_arm64.lib +0 -0
  968. scipy/signal/_spline.cp314t-win_arm64.pyd +0 -0
  969. scipy/signal/_spline.pyi +34 -0
  970. scipy/signal/_spline_filters.py +848 -0
  971. scipy/signal/_support_alternative_backends.py +73 -0
  972. scipy/signal/_upfirdn.py +219 -0
  973. scipy/signal/_upfirdn_apply.cp314t-win_arm64.lib +0 -0
  974. scipy/signal/_upfirdn_apply.cp314t-win_arm64.pyd +0 -0
  975. scipy/signal/_waveforms.py +687 -0
  976. scipy/signal/_wavelets.py +29 -0
  977. scipy/signal/bsplines.py +21 -0
  978. scipy/signal/filter_design.py +28 -0
  979. scipy/signal/fir_filter_design.py +21 -0
  980. scipy/signal/lti_conversion.py +20 -0
  981. scipy/signal/ltisys.py +25 -0
  982. scipy/signal/signaltools.py +27 -0
  983. scipy/signal/spectral.py +21 -0
  984. scipy/signal/spline.py +18 -0
  985. scipy/signal/tests/__init__.py +0 -0
  986. scipy/signal/tests/_scipy_spectral_test_shim.py +311 -0
  987. scipy/signal/tests/mpsig.py +122 -0
  988. scipy/signal/tests/test_array_tools.py +111 -0
  989. scipy/signal/tests/test_bsplines.py +365 -0
  990. scipy/signal/tests/test_cont2discrete.py +424 -0
  991. scipy/signal/tests/test_czt.py +221 -0
  992. scipy/signal/tests/test_dltisys.py +599 -0
  993. scipy/signal/tests/test_filter_design.py +4744 -0
  994. scipy/signal/tests/test_fir_filter_design.py +851 -0
  995. scipy/signal/tests/test_ltisys.py +1225 -0
  996. scipy/signal/tests/test_max_len_seq.py +71 -0
  997. scipy/signal/tests/test_peak_finding.py +915 -0
  998. scipy/signal/tests/test_result_type.py +51 -0
  999. scipy/signal/tests/test_savitzky_golay.py +363 -0
  1000. scipy/signal/tests/test_short_time_fft.py +1107 -0
  1001. scipy/signal/tests/test_signaltools.py +4735 -0
  1002. scipy/signal/tests/test_spectral.py +2141 -0
  1003. scipy/signal/tests/test_splines.py +427 -0
  1004. scipy/signal/tests/test_upfirdn.py +322 -0
  1005. scipy/signal/tests/test_waveforms.py +400 -0
  1006. scipy/signal/tests/test_wavelets.py +59 -0
  1007. scipy/signal/tests/test_windows.py +987 -0
  1008. scipy/signal/waveforms.py +20 -0
  1009. scipy/signal/wavelets.py +17 -0
  1010. scipy/signal/windows/__init__.py +52 -0
  1011. scipy/signal/windows/_windows.py +2513 -0
  1012. scipy/signal/windows/windows.py +23 -0
  1013. scipy/sparse/__init__.py +350 -0
  1014. scipy/sparse/_base.py +1613 -0
  1015. scipy/sparse/_bsr.py +880 -0
  1016. scipy/sparse/_compressed.py +1328 -0
  1017. scipy/sparse/_construct.py +1454 -0
  1018. scipy/sparse/_coo.py +1581 -0
  1019. scipy/sparse/_csc.py +367 -0
  1020. scipy/sparse/_csparsetools.cp314t-win_arm64.lib +0 -0
  1021. scipy/sparse/_csparsetools.cp314t-win_arm64.pyd +0 -0
  1022. scipy/sparse/_csr.py +558 -0
  1023. scipy/sparse/_data.py +569 -0
  1024. scipy/sparse/_dia.py +677 -0
  1025. scipy/sparse/_dok.py +669 -0
  1026. scipy/sparse/_extract.py +178 -0
  1027. scipy/sparse/_index.py +444 -0
  1028. scipy/sparse/_lil.py +632 -0
  1029. scipy/sparse/_matrix.py +169 -0
  1030. scipy/sparse/_matrix_io.py +167 -0
  1031. scipy/sparse/_sparsetools.cp314t-win_arm64.lib +0 -0
  1032. scipy/sparse/_sparsetools.cp314t-win_arm64.pyd +0 -0
  1033. scipy/sparse/_spfuncs.py +76 -0
  1034. scipy/sparse/_sputils.py +632 -0
  1035. scipy/sparse/base.py +24 -0
  1036. scipy/sparse/bsr.py +22 -0
  1037. scipy/sparse/compressed.py +20 -0
  1038. scipy/sparse/construct.py +38 -0
  1039. scipy/sparse/coo.py +23 -0
  1040. scipy/sparse/csc.py +22 -0
  1041. scipy/sparse/csgraph/__init__.py +210 -0
  1042. scipy/sparse/csgraph/_flow.cp314t-win_arm64.lib +0 -0
  1043. scipy/sparse/csgraph/_flow.cp314t-win_arm64.pyd +0 -0
  1044. scipy/sparse/csgraph/_laplacian.py +563 -0
  1045. scipy/sparse/csgraph/_matching.cp314t-win_arm64.lib +0 -0
  1046. scipy/sparse/csgraph/_matching.cp314t-win_arm64.pyd +0 -0
  1047. scipy/sparse/csgraph/_min_spanning_tree.cp314t-win_arm64.lib +0 -0
  1048. scipy/sparse/csgraph/_min_spanning_tree.cp314t-win_arm64.pyd +0 -0
  1049. scipy/sparse/csgraph/_reordering.cp314t-win_arm64.lib +0 -0
  1050. scipy/sparse/csgraph/_reordering.cp314t-win_arm64.pyd +0 -0
  1051. scipy/sparse/csgraph/_shortest_path.cp314t-win_arm64.lib +0 -0
  1052. scipy/sparse/csgraph/_shortest_path.cp314t-win_arm64.pyd +0 -0
  1053. scipy/sparse/csgraph/_tools.cp314t-win_arm64.lib +0 -0
  1054. scipy/sparse/csgraph/_tools.cp314t-win_arm64.pyd +0 -0
  1055. scipy/sparse/csgraph/_traversal.cp314t-win_arm64.lib +0 -0
  1056. scipy/sparse/csgraph/_traversal.cp314t-win_arm64.pyd +0 -0
  1057. scipy/sparse/csgraph/_validation.py +66 -0
  1058. scipy/sparse/csgraph/tests/__init__.py +0 -0
  1059. scipy/sparse/csgraph/tests/test_connected_components.py +119 -0
  1060. scipy/sparse/csgraph/tests/test_conversions.py +61 -0
  1061. scipy/sparse/csgraph/tests/test_flow.py +209 -0
  1062. scipy/sparse/csgraph/tests/test_graph_laplacian.py +368 -0
  1063. scipy/sparse/csgraph/tests/test_matching.py +307 -0
  1064. scipy/sparse/csgraph/tests/test_pydata_sparse.py +197 -0
  1065. scipy/sparse/csgraph/tests/test_reordering.py +70 -0
  1066. scipy/sparse/csgraph/tests/test_shortest_path.py +540 -0
  1067. scipy/sparse/csgraph/tests/test_spanning_tree.py +66 -0
  1068. scipy/sparse/csgraph/tests/test_traversal.py +148 -0
  1069. scipy/sparse/csr.py +22 -0
  1070. scipy/sparse/data.py +18 -0
  1071. scipy/sparse/dia.py +22 -0
  1072. scipy/sparse/dok.py +22 -0
  1073. scipy/sparse/extract.py +23 -0
  1074. scipy/sparse/lil.py +22 -0
  1075. scipy/sparse/linalg/__init__.py +148 -0
  1076. scipy/sparse/linalg/_dsolve/__init__.py +71 -0
  1077. scipy/sparse/linalg/_dsolve/_add_newdocs.py +147 -0
  1078. scipy/sparse/linalg/_dsolve/_superlu.cp314t-win_arm64.lib +0 -0
  1079. scipy/sparse/linalg/_dsolve/_superlu.cp314t-win_arm64.pyd +0 -0
  1080. scipy/sparse/linalg/_dsolve/linsolve.py +882 -0
  1081. scipy/sparse/linalg/_dsolve/tests/__init__.py +0 -0
  1082. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +928 -0
  1083. scipy/sparse/linalg/_eigen/__init__.py +22 -0
  1084. scipy/sparse/linalg/_eigen/_svds.py +540 -0
  1085. scipy/sparse/linalg/_eigen/_svds_doc.py +382 -0
  1086. scipy/sparse/linalg/_eigen/arpack/COPYING +45 -0
  1087. scipy/sparse/linalg/_eigen/arpack/__init__.py +20 -0
  1088. scipy/sparse/linalg/_eigen/arpack/_arpack.cp314t-win_arm64.lib +0 -0
  1089. scipy/sparse/linalg/_eigen/arpack/_arpack.cp314t-win_arm64.pyd +0 -0
  1090. scipy/sparse/linalg/_eigen/arpack/arpack.py +1706 -0
  1091. scipy/sparse/linalg/_eigen/arpack/tests/__init__.py +0 -0
  1092. scipy/sparse/linalg/_eigen/arpack/tests/test_arpack.py +717 -0
  1093. scipy/sparse/linalg/_eigen/lobpcg/__init__.py +16 -0
  1094. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +1110 -0
  1095. scipy/sparse/linalg/_eigen/lobpcg/tests/__init__.py +0 -0
  1096. scipy/sparse/linalg/_eigen/lobpcg/tests/test_lobpcg.py +725 -0
  1097. scipy/sparse/linalg/_eigen/tests/__init__.py +0 -0
  1098. scipy/sparse/linalg/_eigen/tests/test_svds.py +886 -0
  1099. scipy/sparse/linalg/_expm_multiply.py +816 -0
  1100. scipy/sparse/linalg/_interface.py +920 -0
  1101. scipy/sparse/linalg/_isolve/__init__.py +20 -0
  1102. scipy/sparse/linalg/_isolve/_gcrotmk.py +503 -0
  1103. scipy/sparse/linalg/_isolve/iterative.py +1051 -0
  1104. scipy/sparse/linalg/_isolve/lgmres.py +230 -0
  1105. scipy/sparse/linalg/_isolve/lsmr.py +486 -0
  1106. scipy/sparse/linalg/_isolve/lsqr.py +589 -0
  1107. scipy/sparse/linalg/_isolve/minres.py +372 -0
  1108. scipy/sparse/linalg/_isolve/tests/__init__.py +0 -0
  1109. scipy/sparse/linalg/_isolve/tests/test_gcrotmk.py +183 -0
  1110. scipy/sparse/linalg/_isolve/tests/test_iterative.py +809 -0
  1111. scipy/sparse/linalg/_isolve/tests/test_lgmres.py +225 -0
  1112. scipy/sparse/linalg/_isolve/tests/test_lsmr.py +185 -0
  1113. scipy/sparse/linalg/_isolve/tests/test_lsqr.py +120 -0
  1114. scipy/sparse/linalg/_isolve/tests/test_minres.py +97 -0
  1115. scipy/sparse/linalg/_isolve/tests/test_utils.py +9 -0
  1116. scipy/sparse/linalg/_isolve/tfqmr.py +179 -0
  1117. scipy/sparse/linalg/_isolve/utils.py +121 -0
  1118. scipy/sparse/linalg/_matfuncs.py +940 -0
  1119. scipy/sparse/linalg/_norm.py +195 -0
  1120. scipy/sparse/linalg/_onenormest.py +467 -0
  1121. scipy/sparse/linalg/_propack/_cpropack.cp314t-win_arm64.lib +0 -0
  1122. scipy/sparse/linalg/_propack/_cpropack.cp314t-win_arm64.pyd +0 -0
  1123. scipy/sparse/linalg/_propack/_dpropack.cp314t-win_arm64.lib +0 -0
  1124. scipy/sparse/linalg/_propack/_dpropack.cp314t-win_arm64.pyd +0 -0
  1125. scipy/sparse/linalg/_propack/_spropack.cp314t-win_arm64.lib +0 -0
  1126. scipy/sparse/linalg/_propack/_spropack.cp314t-win_arm64.pyd +0 -0
  1127. scipy/sparse/linalg/_propack/_zpropack.cp314t-win_arm64.lib +0 -0
  1128. scipy/sparse/linalg/_propack/_zpropack.cp314t-win_arm64.pyd +0 -0
  1129. scipy/sparse/linalg/_special_sparse_arrays.py +949 -0
  1130. scipy/sparse/linalg/_svdp.py +309 -0
  1131. scipy/sparse/linalg/dsolve.py +22 -0
  1132. scipy/sparse/linalg/eigen.py +21 -0
  1133. scipy/sparse/linalg/interface.py +20 -0
  1134. scipy/sparse/linalg/isolve.py +22 -0
  1135. scipy/sparse/linalg/matfuncs.py +18 -0
  1136. scipy/sparse/linalg/tests/__init__.py +0 -0
  1137. scipy/sparse/linalg/tests/propack_test_data.npz +0 -0
  1138. scipy/sparse/linalg/tests/test_expm_multiply.py +367 -0
  1139. scipy/sparse/linalg/tests/test_interface.py +561 -0
  1140. scipy/sparse/linalg/tests/test_matfuncs.py +592 -0
  1141. scipy/sparse/linalg/tests/test_norm.py +154 -0
  1142. scipy/sparse/linalg/tests/test_onenormest.py +252 -0
  1143. scipy/sparse/linalg/tests/test_propack.py +165 -0
  1144. scipy/sparse/linalg/tests/test_pydata_sparse.py +272 -0
  1145. scipy/sparse/linalg/tests/test_special_sparse_arrays.py +337 -0
  1146. scipy/sparse/sparsetools.py +17 -0
  1147. scipy/sparse/spfuncs.py +17 -0
  1148. scipy/sparse/sputils.py +17 -0
  1149. scipy/sparse/tests/__init__.py +0 -0
  1150. scipy/sparse/tests/data/csc_py2.npz +0 -0
  1151. scipy/sparse/tests/data/csc_py3.npz +0 -0
  1152. scipy/sparse/tests/test_arithmetic1d.py +341 -0
  1153. scipy/sparse/tests/test_array_api.py +561 -0
  1154. scipy/sparse/tests/test_base.py +5870 -0
  1155. scipy/sparse/tests/test_common1d.py +447 -0
  1156. scipy/sparse/tests/test_construct.py +872 -0
  1157. scipy/sparse/tests/test_coo.py +1119 -0
  1158. scipy/sparse/tests/test_csc.py +98 -0
  1159. scipy/sparse/tests/test_csr.py +214 -0
  1160. scipy/sparse/tests/test_dok.py +209 -0
  1161. scipy/sparse/tests/test_extract.py +51 -0
  1162. scipy/sparse/tests/test_indexing1d.py +603 -0
  1163. scipy/sparse/tests/test_matrix_io.py +109 -0
  1164. scipy/sparse/tests/test_minmax1d.py +128 -0
  1165. scipy/sparse/tests/test_sparsetools.py +344 -0
  1166. scipy/sparse/tests/test_spfuncs.py +97 -0
  1167. scipy/sparse/tests/test_sputils.py +424 -0
  1168. scipy/spatial/__init__.py +129 -0
  1169. scipy/spatial/_ckdtree.cp314t-win_arm64.lib +0 -0
  1170. scipy/spatial/_ckdtree.cp314t-win_arm64.pyd +0 -0
  1171. scipy/spatial/_distance_pybind.cp314t-win_arm64.lib +0 -0
  1172. scipy/spatial/_distance_pybind.cp314t-win_arm64.pyd +0 -0
  1173. scipy/spatial/_distance_wrap.cp314t-win_arm64.lib +0 -0
  1174. scipy/spatial/_distance_wrap.cp314t-win_arm64.pyd +0 -0
  1175. scipy/spatial/_geometric_slerp.py +238 -0
  1176. scipy/spatial/_hausdorff.cp314t-win_arm64.lib +0 -0
  1177. scipy/spatial/_hausdorff.cp314t-win_arm64.pyd +0 -0
  1178. scipy/spatial/_kdtree.py +920 -0
  1179. scipy/spatial/_plotutils.py +274 -0
  1180. scipy/spatial/_procrustes.py +132 -0
  1181. scipy/spatial/_qhull.cp314t-win_arm64.lib +0 -0
  1182. scipy/spatial/_qhull.cp314t-win_arm64.pyd +0 -0
  1183. scipy/spatial/_qhull.pyi +213 -0
  1184. scipy/spatial/_spherical_voronoi.py +341 -0
  1185. scipy/spatial/_voronoi.cp314t-win_arm64.lib +0 -0
  1186. scipy/spatial/_voronoi.cp314t-win_arm64.pyd +0 -0
  1187. scipy/spatial/_voronoi.pyi +4 -0
  1188. scipy/spatial/ckdtree.py +18 -0
  1189. scipy/spatial/distance.py +3147 -0
  1190. scipy/spatial/distance.pyi +210 -0
  1191. scipy/spatial/kdtree.py +25 -0
  1192. scipy/spatial/qhull.py +25 -0
  1193. scipy/spatial/qhull_src/COPYING_QHULL.txt +39 -0
  1194. scipy/spatial/tests/__init__.py +0 -0
  1195. scipy/spatial/tests/data/cdist-X1.txt +10 -0
  1196. scipy/spatial/tests/data/cdist-X2.txt +20 -0
  1197. scipy/spatial/tests/data/degenerate_pointset.npz +0 -0
  1198. scipy/spatial/tests/data/iris.txt +150 -0
  1199. scipy/spatial/tests/data/pdist-boolean-inp.txt +20 -0
  1200. scipy/spatial/tests/data/pdist-chebyshev-ml-iris.txt +1 -0
  1201. scipy/spatial/tests/data/pdist-chebyshev-ml.txt +1 -0
  1202. scipy/spatial/tests/data/pdist-cityblock-ml-iris.txt +1 -0
  1203. scipy/spatial/tests/data/pdist-cityblock-ml.txt +1 -0
  1204. scipy/spatial/tests/data/pdist-correlation-ml-iris.txt +1 -0
  1205. scipy/spatial/tests/data/pdist-correlation-ml.txt +1 -0
  1206. scipy/spatial/tests/data/pdist-cosine-ml-iris.txt +1 -0
  1207. scipy/spatial/tests/data/pdist-cosine-ml.txt +1 -0
  1208. scipy/spatial/tests/data/pdist-double-inp.txt +20 -0
  1209. scipy/spatial/tests/data/pdist-euclidean-ml-iris.txt +1 -0
  1210. scipy/spatial/tests/data/pdist-euclidean-ml.txt +1 -0
  1211. scipy/spatial/tests/data/pdist-hamming-ml.txt +1 -0
  1212. scipy/spatial/tests/data/pdist-jaccard-ml.txt +1 -0
  1213. scipy/spatial/tests/data/pdist-jensenshannon-ml-iris.txt +1 -0
  1214. scipy/spatial/tests/data/pdist-jensenshannon-ml.txt +1 -0
  1215. scipy/spatial/tests/data/pdist-minkowski-3.2-ml-iris.txt +1 -0
  1216. scipy/spatial/tests/data/pdist-minkowski-3.2-ml.txt +1 -0
  1217. scipy/spatial/tests/data/pdist-minkowski-5.8-ml-iris.txt +1 -0
  1218. scipy/spatial/tests/data/pdist-seuclidean-ml-iris.txt +1 -0
  1219. scipy/spatial/tests/data/pdist-seuclidean-ml.txt +1 -0
  1220. scipy/spatial/tests/data/pdist-spearman-ml.txt +1 -0
  1221. scipy/spatial/tests/data/random-bool-data.txt +100 -0
  1222. scipy/spatial/tests/data/random-double-data.txt +100 -0
  1223. scipy/spatial/tests/data/random-int-data.txt +100 -0
  1224. scipy/spatial/tests/data/random-uint-data.txt +100 -0
  1225. scipy/spatial/tests/data/selfdual-4d-polytope.txt +27 -0
  1226. scipy/spatial/tests/test__plotutils.py +91 -0
  1227. scipy/spatial/tests/test__procrustes.py +116 -0
  1228. scipy/spatial/tests/test_distance.py +2389 -0
  1229. scipy/spatial/tests/test_hausdorff.py +199 -0
  1230. scipy/spatial/tests/test_kdtree.py +1536 -0
  1231. scipy/spatial/tests/test_qhull.py +1313 -0
  1232. scipy/spatial/tests/test_slerp.py +417 -0
  1233. scipy/spatial/tests/test_spherical_voronoi.py +358 -0
  1234. scipy/spatial/transform/__init__.py +31 -0
  1235. scipy/spatial/transform/_rigid_transform.cp314t-win_arm64.lib +0 -0
  1236. scipy/spatial/transform/_rigid_transform.cp314t-win_arm64.pyd +0 -0
  1237. scipy/spatial/transform/_rotation.cp314t-win_arm64.lib +0 -0
  1238. scipy/spatial/transform/_rotation.cp314t-win_arm64.pyd +0 -0
  1239. scipy/spatial/transform/_rotation_groups.py +140 -0
  1240. scipy/spatial/transform/_rotation_spline.py +460 -0
  1241. scipy/spatial/transform/rotation.py +21 -0
  1242. scipy/spatial/transform/tests/__init__.py +0 -0
  1243. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  1244. scipy/spatial/transform/tests/test_rotation.py +2569 -0
  1245. scipy/spatial/transform/tests/test_rotation_groups.py +169 -0
  1246. scipy/spatial/transform/tests/test_rotation_spline.py +183 -0
  1247. scipy/special/__init__.pxd +1 -0
  1248. scipy/special/__init__.py +841 -0
  1249. scipy/special/_add_newdocs.py +9961 -0
  1250. scipy/special/_basic.py +3576 -0
  1251. scipy/special/_comb.cp314t-win_arm64.lib +0 -0
  1252. scipy/special/_comb.cp314t-win_arm64.pyd +0 -0
  1253. scipy/special/_ellip_harm.py +214 -0
  1254. scipy/special/_ellip_harm_2.cp314t-win_arm64.lib +0 -0
  1255. scipy/special/_ellip_harm_2.cp314t-win_arm64.pyd +0 -0
  1256. scipy/special/_gufuncs.cp314t-win_arm64.lib +0 -0
  1257. scipy/special/_gufuncs.cp314t-win_arm64.pyd +0 -0
  1258. scipy/special/_input_validation.py +17 -0
  1259. scipy/special/_lambertw.py +149 -0
  1260. scipy/special/_logsumexp.py +426 -0
  1261. scipy/special/_mptestutils.py +453 -0
  1262. scipy/special/_multiufuncs.py +610 -0
  1263. scipy/special/_orthogonal.py +2592 -0
  1264. scipy/special/_orthogonal.pyi +330 -0
  1265. scipy/special/_precompute/__init__.py +0 -0
  1266. scipy/special/_precompute/cosine_cdf.py +17 -0
  1267. scipy/special/_precompute/expn_asy.py +54 -0
  1268. scipy/special/_precompute/gammainc_asy.py +116 -0
  1269. scipy/special/_precompute/gammainc_data.py +124 -0
  1270. scipy/special/_precompute/hyp2f1_data.py +484 -0
  1271. scipy/special/_precompute/lambertw.py +68 -0
  1272. scipy/special/_precompute/loggamma.py +43 -0
  1273. scipy/special/_precompute/struve_convergence.py +131 -0
  1274. scipy/special/_precompute/utils.py +38 -0
  1275. scipy/special/_precompute/wright_bessel.py +342 -0
  1276. scipy/special/_precompute/wright_bessel_data.py +152 -0
  1277. scipy/special/_precompute/wrightomega.py +41 -0
  1278. scipy/special/_precompute/zetac.py +27 -0
  1279. scipy/special/_sf_error.py +15 -0
  1280. scipy/special/_specfun.cp314t-win_arm64.lib +0 -0
  1281. scipy/special/_specfun.cp314t-win_arm64.pyd +0 -0
  1282. scipy/special/_special_ufuncs.cp314t-win_arm64.lib +0 -0
  1283. scipy/special/_special_ufuncs.cp314t-win_arm64.pyd +0 -0
  1284. scipy/special/_spfun_stats.py +106 -0
  1285. scipy/special/_spherical_bessel.py +397 -0
  1286. scipy/special/_support_alternative_backends.py +295 -0
  1287. scipy/special/_test_internal.cp314t-win_arm64.lib +0 -0
  1288. scipy/special/_test_internal.cp314t-win_arm64.pyd +0 -0
  1289. scipy/special/_test_internal.pyi +9 -0
  1290. scipy/special/_testutils.py +321 -0
  1291. scipy/special/_ufuncs.cp314t-win_arm64.lib +0 -0
  1292. scipy/special/_ufuncs.cp314t-win_arm64.pyd +0 -0
  1293. scipy/special/_ufuncs.pyi +522 -0
  1294. scipy/special/_ufuncs.pyx +13173 -0
  1295. scipy/special/_ufuncs_cxx.cp314t-win_arm64.lib +0 -0
  1296. scipy/special/_ufuncs_cxx.cp314t-win_arm64.pyd +0 -0
  1297. scipy/special/_ufuncs_cxx.pxd +142 -0
  1298. scipy/special/_ufuncs_cxx.pyx +427 -0
  1299. scipy/special/_ufuncs_cxx_defs.h +147 -0
  1300. scipy/special/_ufuncs_defs.h +57 -0
  1301. scipy/special/add_newdocs.py +15 -0
  1302. scipy/special/basic.py +87 -0
  1303. scipy/special/cython_special.cp314t-win_arm64.lib +0 -0
  1304. scipy/special/cython_special.cp314t-win_arm64.pyd +0 -0
  1305. scipy/special/cython_special.pxd +259 -0
  1306. scipy/special/cython_special.pyi +3 -0
  1307. scipy/special/orthogonal.py +45 -0
  1308. scipy/special/sf_error.py +20 -0
  1309. scipy/special/specfun.py +24 -0
  1310. scipy/special/spfun_stats.py +17 -0
  1311. scipy/special/tests/__init__.py +0 -0
  1312. scipy/special/tests/_cython_examples/extending.pyx +12 -0
  1313. scipy/special/tests/_cython_examples/meson.build +34 -0
  1314. scipy/special/tests/data/__init__.py +0 -0
  1315. scipy/special/tests/data/boost.npz +0 -0
  1316. scipy/special/tests/data/gsl.npz +0 -0
  1317. scipy/special/tests/data/local.npz +0 -0
  1318. scipy/special/tests/test_basic.py +4815 -0
  1319. scipy/special/tests/test_bdtr.py +112 -0
  1320. scipy/special/tests/test_boost_ufuncs.py +64 -0
  1321. scipy/special/tests/test_boxcox.py +125 -0
  1322. scipy/special/tests/test_cdflib.py +712 -0
  1323. scipy/special/tests/test_cdft_asymptotic.py +49 -0
  1324. scipy/special/tests/test_cephes_intp_cast.py +29 -0
  1325. scipy/special/tests/test_cosine_distr.py +83 -0
  1326. scipy/special/tests/test_cython_special.py +363 -0
  1327. scipy/special/tests/test_data.py +719 -0
  1328. scipy/special/tests/test_dd.py +42 -0
  1329. scipy/special/tests/test_digamma.py +45 -0
  1330. scipy/special/tests/test_ellip_harm.py +278 -0
  1331. scipy/special/tests/test_erfinv.py +89 -0
  1332. scipy/special/tests/test_exponential_integrals.py +118 -0
  1333. scipy/special/tests/test_extending.py +28 -0
  1334. scipy/special/tests/test_faddeeva.py +85 -0
  1335. scipy/special/tests/test_gamma.py +12 -0
  1336. scipy/special/tests/test_gammainc.py +152 -0
  1337. scipy/special/tests/test_hyp2f1.py +2566 -0
  1338. scipy/special/tests/test_hypergeometric.py +234 -0
  1339. scipy/special/tests/test_iv_ratio.py +249 -0
  1340. scipy/special/tests/test_kolmogorov.py +491 -0
  1341. scipy/special/tests/test_lambertw.py +109 -0
  1342. scipy/special/tests/test_legendre.py +1518 -0
  1343. scipy/special/tests/test_log1mexp.py +85 -0
  1344. scipy/special/tests/test_loggamma.py +70 -0
  1345. scipy/special/tests/test_logit.py +162 -0
  1346. scipy/special/tests/test_logsumexp.py +469 -0
  1347. scipy/special/tests/test_mpmath.py +2293 -0
  1348. scipy/special/tests/test_nan_inputs.py +65 -0
  1349. scipy/special/tests/test_ndtr.py +77 -0
  1350. scipy/special/tests/test_ndtri_exp.py +94 -0
  1351. scipy/special/tests/test_orthogonal.py +821 -0
  1352. scipy/special/tests/test_orthogonal_eval.py +275 -0
  1353. scipy/special/tests/test_owens_t.py +53 -0
  1354. scipy/special/tests/test_pcf.py +24 -0
  1355. scipy/special/tests/test_pdtr.py +48 -0
  1356. scipy/special/tests/test_powm1.py +65 -0
  1357. scipy/special/tests/test_precompute_expn_asy.py +24 -0
  1358. scipy/special/tests/test_precompute_gammainc.py +108 -0
  1359. scipy/special/tests/test_precompute_utils.py +36 -0
  1360. scipy/special/tests/test_round.py +18 -0
  1361. scipy/special/tests/test_sf_error.py +146 -0
  1362. scipy/special/tests/test_sici.py +36 -0
  1363. scipy/special/tests/test_specfun.py +48 -0
  1364. scipy/special/tests/test_spence.py +32 -0
  1365. scipy/special/tests/test_spfun_stats.py +61 -0
  1366. scipy/special/tests/test_sph_harm.py +85 -0
  1367. scipy/special/tests/test_spherical_bessel.py +400 -0
  1368. scipy/special/tests/test_support_alternative_backends.py +248 -0
  1369. scipy/special/tests/test_trig.py +72 -0
  1370. scipy/special/tests/test_ufunc_signatures.py +46 -0
  1371. scipy/special/tests/test_wright_bessel.py +205 -0
  1372. scipy/special/tests/test_wrightomega.py +117 -0
  1373. scipy/special/tests/test_zeta.py +301 -0
  1374. scipy/stats/__init__.py +670 -0
  1375. scipy/stats/_ansari_swilk_statistics.cp314t-win_arm64.lib +0 -0
  1376. scipy/stats/_ansari_swilk_statistics.cp314t-win_arm64.pyd +0 -0
  1377. scipy/stats/_axis_nan_policy.py +692 -0
  1378. scipy/stats/_biasedurn.cp314t-win_arm64.lib +0 -0
  1379. scipy/stats/_biasedurn.cp314t-win_arm64.pyd +0 -0
  1380. scipy/stats/_biasedurn.pxd +27 -0
  1381. scipy/stats/_binned_statistic.py +795 -0
  1382. scipy/stats/_binomtest.py +375 -0
  1383. scipy/stats/_bws_test.py +177 -0
  1384. scipy/stats/_censored_data.py +459 -0
  1385. scipy/stats/_common.py +5 -0
  1386. scipy/stats/_constants.py +42 -0
  1387. scipy/stats/_continued_fraction.py +387 -0
  1388. scipy/stats/_continuous_distns.py +12486 -0
  1389. scipy/stats/_correlation.py +210 -0
  1390. scipy/stats/_covariance.py +636 -0
  1391. scipy/stats/_crosstab.py +204 -0
  1392. scipy/stats/_discrete_distns.py +2098 -0
  1393. scipy/stats/_distn_infrastructure.py +4201 -0
  1394. scipy/stats/_distr_params.py +299 -0
  1395. scipy/stats/_distribution_infrastructure.py +5750 -0
  1396. scipy/stats/_entropy.py +428 -0
  1397. scipy/stats/_finite_differences.py +145 -0
  1398. scipy/stats/_fit.py +1351 -0
  1399. scipy/stats/_hypotests.py +2060 -0
  1400. scipy/stats/_kde.py +732 -0
  1401. scipy/stats/_ksstats.py +600 -0
  1402. scipy/stats/_levy_stable/__init__.py +1231 -0
  1403. scipy/stats/_levy_stable/levyst.cp314t-win_arm64.lib +0 -0
  1404. scipy/stats/_levy_stable/levyst.cp314t-win_arm64.pyd +0 -0
  1405. scipy/stats/_mannwhitneyu.py +492 -0
  1406. scipy/stats/_mgc.py +550 -0
  1407. scipy/stats/_morestats.py +4626 -0
  1408. scipy/stats/_mstats_basic.py +3658 -0
  1409. scipy/stats/_mstats_extras.py +521 -0
  1410. scipy/stats/_multicomp.py +449 -0
  1411. scipy/stats/_multivariate.py +7281 -0
  1412. scipy/stats/_new_distributions.py +452 -0
  1413. scipy/stats/_odds_ratio.py +466 -0
  1414. scipy/stats/_page_trend_test.py +486 -0
  1415. scipy/stats/_probability_distribution.py +1964 -0
  1416. scipy/stats/_qmc.py +2956 -0
  1417. scipy/stats/_qmc_cy.cp314t-win_arm64.lib +0 -0
  1418. scipy/stats/_qmc_cy.cp314t-win_arm64.pyd +0 -0
  1419. scipy/stats/_qmc_cy.pyi +54 -0
  1420. scipy/stats/_qmvnt.py +454 -0
  1421. scipy/stats/_qmvnt_cy.cp314t-win_arm64.lib +0 -0
  1422. scipy/stats/_qmvnt_cy.cp314t-win_arm64.pyd +0 -0
  1423. scipy/stats/_quantile.py +335 -0
  1424. scipy/stats/_rcont/__init__.py +4 -0
  1425. scipy/stats/_rcont/rcont.cp314t-win_arm64.lib +0 -0
  1426. scipy/stats/_rcont/rcont.cp314t-win_arm64.pyd +0 -0
  1427. scipy/stats/_relative_risk.py +263 -0
  1428. scipy/stats/_resampling.py +2352 -0
  1429. scipy/stats/_result_classes.py +40 -0
  1430. scipy/stats/_sampling.py +1314 -0
  1431. scipy/stats/_sensitivity_analysis.py +713 -0
  1432. scipy/stats/_sobol.cp314t-win_arm64.lib +0 -0
  1433. scipy/stats/_sobol.cp314t-win_arm64.pyd +0 -0
  1434. scipy/stats/_sobol.pyi +54 -0
  1435. scipy/stats/_sobol_direction_numbers.npz +0 -0
  1436. scipy/stats/_stats.cp314t-win_arm64.lib +0 -0
  1437. scipy/stats/_stats.cp314t-win_arm64.pyd +0 -0
  1438. scipy/stats/_stats.pxd +10 -0
  1439. scipy/stats/_stats_mstats_common.py +322 -0
  1440. scipy/stats/_stats_py.py +11089 -0
  1441. scipy/stats/_stats_pythran.cp314t-win_arm64.lib +0 -0
  1442. scipy/stats/_stats_pythran.cp314t-win_arm64.pyd +0 -0
  1443. scipy/stats/_survival.py +683 -0
  1444. scipy/stats/_tukeylambda_stats.py +199 -0
  1445. scipy/stats/_unuran/__init__.py +0 -0
  1446. scipy/stats/_unuran/unuran_wrapper.cp314t-win_arm64.lib +0 -0
  1447. scipy/stats/_unuran/unuran_wrapper.cp314t-win_arm64.pyd +0 -0
  1448. scipy/stats/_unuran/unuran_wrapper.pyi +179 -0
  1449. scipy/stats/_variation.py +126 -0
  1450. scipy/stats/_warnings_errors.py +38 -0
  1451. scipy/stats/_wilcoxon.py +265 -0
  1452. scipy/stats/biasedurn.py +16 -0
  1453. scipy/stats/contingency.py +521 -0
  1454. scipy/stats/distributions.py +24 -0
  1455. scipy/stats/kde.py +18 -0
  1456. scipy/stats/morestats.py +27 -0
  1457. scipy/stats/mstats.py +140 -0
  1458. scipy/stats/mstats_basic.py +42 -0
  1459. scipy/stats/mstats_extras.py +25 -0
  1460. scipy/stats/mvn.py +17 -0
  1461. scipy/stats/qmc.py +236 -0
  1462. scipy/stats/sampling.py +73 -0
  1463. scipy/stats/stats.py +41 -0
  1464. scipy/stats/tests/__init__.py +0 -0
  1465. scipy/stats/tests/common_tests.py +356 -0
  1466. scipy/stats/tests/data/_mvt.py +171 -0
  1467. scipy/stats/tests/data/fisher_exact_results_from_r.py +607 -0
  1468. scipy/stats/tests/data/jf_skew_t_gamlss_pdf_data.npy +0 -0
  1469. scipy/stats/tests/data/levy_stable/stable-Z1-cdf-sample-data.npy +0 -0
  1470. scipy/stats/tests/data/levy_stable/stable-Z1-pdf-sample-data.npy +0 -0
  1471. scipy/stats/tests/data/levy_stable/stable-loc-scale-sample-data.npy +0 -0
  1472. scipy/stats/tests/data/nist_anova/AtmWtAg.dat +108 -0
  1473. scipy/stats/tests/data/nist_anova/SiRstv.dat +85 -0
  1474. scipy/stats/tests/data/nist_anova/SmLs01.dat +249 -0
  1475. scipy/stats/tests/data/nist_anova/SmLs02.dat +1869 -0
  1476. scipy/stats/tests/data/nist_anova/SmLs03.dat +18069 -0
  1477. scipy/stats/tests/data/nist_anova/SmLs04.dat +249 -0
  1478. scipy/stats/tests/data/nist_anova/SmLs05.dat +1869 -0
  1479. scipy/stats/tests/data/nist_anova/SmLs06.dat +18069 -0
  1480. scipy/stats/tests/data/nist_anova/SmLs07.dat +249 -0
  1481. scipy/stats/tests/data/nist_anova/SmLs08.dat +1869 -0
  1482. scipy/stats/tests/data/nist_anova/SmLs09.dat +18069 -0
  1483. scipy/stats/tests/data/nist_linregress/Norris.dat +97 -0
  1484. scipy/stats/tests/data/rel_breitwigner_pdf_sample_data_ROOT.npy +0 -0
  1485. scipy/stats/tests/data/studentized_range_mpmath_ref.json +1499 -0
  1486. scipy/stats/tests/test_axis_nan_policy.py +1388 -0
  1487. scipy/stats/tests/test_binned_statistic.py +568 -0
  1488. scipy/stats/tests/test_censored_data.py +152 -0
  1489. scipy/stats/tests/test_contingency.py +294 -0
  1490. scipy/stats/tests/test_continued_fraction.py +173 -0
  1491. scipy/stats/tests/test_continuous.py +2198 -0
  1492. scipy/stats/tests/test_continuous_basic.py +1053 -0
  1493. scipy/stats/tests/test_continuous_fit_censored.py +683 -0
  1494. scipy/stats/tests/test_correlation.py +80 -0
  1495. scipy/stats/tests/test_crosstab.py +115 -0
  1496. scipy/stats/tests/test_discrete_basic.py +580 -0
  1497. scipy/stats/tests/test_discrete_distns.py +700 -0
  1498. scipy/stats/tests/test_distributions.py +10413 -0
  1499. scipy/stats/tests/test_entropy.py +322 -0
  1500. scipy/stats/tests/test_fast_gen_inversion.py +435 -0
  1501. scipy/stats/tests/test_fit.py +1090 -0
  1502. scipy/stats/tests/test_hypotests.py +1991 -0
  1503. scipy/stats/tests/test_kdeoth.py +676 -0
  1504. scipy/stats/tests/test_marray.py +289 -0
  1505. scipy/stats/tests/test_mgc.py +217 -0
  1506. scipy/stats/tests/test_morestats.py +3259 -0
  1507. scipy/stats/tests/test_mstats_basic.py +2071 -0
  1508. scipy/stats/tests/test_mstats_extras.py +172 -0
  1509. scipy/stats/tests/test_multicomp.py +405 -0
  1510. scipy/stats/tests/test_multivariate.py +4381 -0
  1511. scipy/stats/tests/test_odds_ratio.py +148 -0
  1512. scipy/stats/tests/test_qmc.py +1492 -0
  1513. scipy/stats/tests/test_quantile.py +199 -0
  1514. scipy/stats/tests/test_rank.py +345 -0
  1515. scipy/stats/tests/test_relative_risk.py +95 -0
  1516. scipy/stats/tests/test_resampling.py +2000 -0
  1517. scipy/stats/tests/test_sampling.py +1450 -0
  1518. scipy/stats/tests/test_sensitivity_analysis.py +310 -0
  1519. scipy/stats/tests/test_stats.py +9707 -0
  1520. scipy/stats/tests/test_survival.py +466 -0
  1521. scipy/stats/tests/test_tukeylambda_stats.py +85 -0
  1522. scipy/stats/tests/test_variation.py +216 -0
  1523. scipy/version.py +12 -0
  1524. scipy-1.16.2.dist-info/DELVEWHEEL +2 -0
  1525. scipy-1.16.2.dist-info/LICENSE.txt +912 -0
  1526. scipy-1.16.2.dist-info/METADATA +1061 -0
  1527. scipy-1.16.2.dist-info/RECORD +1530 -0
  1528. scipy-1.16.2.dist-info/WHEEL +4 -0
  1529. scipy.libs/msvcp140-5f1c5dd31916990d94181e07bc3afb32.dll +0 -0
  1530. scipy.libs/scipy_openblas-f3ac85b1f412f7e86514c923dc4058d1.dll +0 -0
@@ -0,0 +1,2098 @@
1
+ #
2
+ # Author: Travis Oliphant 2002-2011 with contributions from
3
+ # SciPy Developers 2004-2011
4
+ #
5
+ from functools import partial
6
+
7
+ from scipy import special
8
+ from scipy.special import entr, logsumexp, betaln, gammaln as gamln, zeta
9
+ from scipy._lib._util import rng_integers
10
+ import scipy._lib.array_api_extra as xpx
11
+ from scipy.interpolate import interp1d
12
+
13
+ from numpy import floor, ceil, log, exp, sqrt, log1p, expm1, tanh, cosh, sinh
14
+
15
+ import numpy as np
16
+
17
+ from ._distn_infrastructure import (rv_discrete, get_distribution_names,
18
+ _vectorize_rvs_over_shapes,
19
+ _ShapeInfo, _isintegral,
20
+ rv_discrete_frozen)
21
+ from ._biasedurn import (_PyFishersNCHypergeometric,
22
+ _PyWalleniusNCHypergeometric,
23
+ _PyStochasticLib3)
24
+ from ._stats_pythran import _poisson_binom
25
+
26
+ import scipy.special._ufuncs as scu
27
+
28
+
29
+
30
+ class binom_gen(rv_discrete):
31
+ r"""A binomial discrete random variable.
32
+
33
+ %(before_notes)s
34
+
35
+ Notes
36
+ -----
37
+ The probability mass function for `binom` is:
38
+
39
+ .. math::
40
+
41
+ f(k) = \binom{n}{k} p^k (1-p)^{n-k}
42
+
43
+ for :math:`k \in \{0, 1, \dots, n\}`, :math:`0 \leq p \leq 1`
44
+
45
+ `binom` takes :math:`n` and :math:`p` as shape parameters,
46
+ where :math:`p` is the probability of a single success
47
+ and :math:`1-p` is the probability of a single failure.
48
+
49
+ This distribution uses routines from the Boost Math C++ library for
50
+ the computation of the ``pmf``, ``cdf``, ``sf``, ``ppf`` and ``isf``
51
+ methods. [1]_
52
+
53
+ %(after_notes)s
54
+
55
+ References
56
+ ----------
57
+ .. [1] The Boost Developers. "Boost C++ Libraries". https://www.boost.org/.
58
+
59
+ %(example)s
60
+
61
+ See Also
62
+ --------
63
+ hypergeom, nbinom, nhypergeom
64
+
65
+ """
66
+ def _shape_info(self):
67
+ return [_ShapeInfo("n", True, (0, np.inf), (True, False)),
68
+ _ShapeInfo("p", False, (0, 1), (True, True))]
69
+
70
+ def _rvs(self, n, p, size=None, random_state=None):
71
+ return random_state.binomial(n, p, size)
72
+
73
+ def _argcheck(self, n, p):
74
+ return (n >= 0) & _isintegral(n) & (p >= 0) & (p <= 1)
75
+
76
+ def _get_support(self, n, p):
77
+ return self.a, n
78
+
79
+ def _logpmf(self, x, n, p):
80
+ k = floor(x)
81
+ combiln = (gamln(n+1) - (gamln(k+1) + gamln(n-k+1)))
82
+ return combiln + special.xlogy(k, p) + special.xlog1py(n-k, -p)
83
+
84
+ def _pmf(self, x, n, p):
85
+ # binom.pmf(k) = choose(n, k) * p**k * (1-p)**(n-k)
86
+ return scu._binom_pmf(x, n, p)
87
+
88
+ def _cdf(self, x, n, p):
89
+ k = floor(x)
90
+ return scu._binom_cdf(k, n, p)
91
+
92
+ def _sf(self, x, n, p):
93
+ k = floor(x)
94
+ return scu._binom_sf(k, n, p)
95
+
96
+ def _isf(self, x, n, p):
97
+ return scu._binom_isf(x, n, p)
98
+
99
+ def _ppf(self, q, n, p):
100
+ return scu._binom_ppf(q, n, p)
101
+
102
+ def _stats(self, n, p, moments='mv'):
103
+ mu = n * p
104
+ var = mu - n * np.square(p)
105
+ g1, g2 = None, None
106
+ if 's' in moments:
107
+ pq = p - np.square(p)
108
+ npq_sqrt = np.sqrt(n * pq)
109
+ t1 = np.reciprocal(npq_sqrt)
110
+ t2 = (2.0 * p) / npq_sqrt
111
+ g1 = t1 - t2
112
+ if 'k' in moments:
113
+ pq = p - np.square(p)
114
+ npq = n * pq
115
+ t1 = np.reciprocal(npq)
116
+ t2 = 6.0/n
117
+ g2 = t1 - t2
118
+ return mu, var, g1, g2
119
+
120
+ def _entropy(self, n, p):
121
+ k = np.r_[0:n + 1]
122
+ vals = self._pmf(k, n, p)
123
+ return np.sum(entr(vals), axis=0)
124
+
125
+
126
+ binom = binom_gen(name='binom')
127
+
128
+
129
+ class bernoulli_gen(binom_gen):
130
+ r"""A Bernoulli discrete random variable.
131
+
132
+ %(before_notes)s
133
+
134
+ Notes
135
+ -----
136
+ The probability mass function for `bernoulli` is:
137
+
138
+ .. math::
139
+
140
+ f(k) = \begin{cases}1-p &\text{if } k = 0\\
141
+ p &\text{if } k = 1\end{cases}
142
+
143
+ for :math:`k` in :math:`\{0, 1\}`, :math:`0 \leq p \leq 1`
144
+
145
+ `bernoulli` takes :math:`p` as shape parameter,
146
+ where :math:`p` is the probability of a single success
147
+ and :math:`1-p` is the probability of a single failure.
148
+
149
+ %(after_notes)s
150
+
151
+ %(example)s
152
+
153
+ """
154
+ def _shape_info(self):
155
+ return [_ShapeInfo("p", False, (0, 1), (True, True))]
156
+
157
+ def _rvs(self, p, size=None, random_state=None):
158
+ return binom_gen._rvs(self, 1, p, size=size, random_state=random_state)
159
+
160
+ def _argcheck(self, p):
161
+ return (p >= 0) & (p <= 1)
162
+
163
+ def _get_support(self, p):
164
+ # Overrides binom_gen._get_support!x
165
+ return self.a, self.b
166
+
167
+ def _logpmf(self, x, p):
168
+ return binom._logpmf(x, 1, p)
169
+
170
+ def _pmf(self, x, p):
171
+ # bernoulli.pmf(k) = 1-p if k = 0
172
+ # = p if k = 1
173
+ return binom._pmf(x, 1, p)
174
+
175
+ def _cdf(self, x, p):
176
+ return binom._cdf(x, 1, p)
177
+
178
+ def _sf(self, x, p):
179
+ return binom._sf(x, 1, p)
180
+
181
+ def _isf(self, x, p):
182
+ return binom._isf(x, 1, p)
183
+
184
+ def _ppf(self, q, p):
185
+ return binom._ppf(q, 1, p)
186
+
187
+ def _stats(self, p):
188
+ return binom._stats(1, p)
189
+
190
+ def _entropy(self, p):
191
+ return entr(p) + entr(1-p)
192
+
193
+
194
+ bernoulli = bernoulli_gen(b=1, name='bernoulli')
195
+
196
+
197
+ class betabinom_gen(rv_discrete):
198
+ r"""A beta-binomial discrete random variable.
199
+
200
+ %(before_notes)s
201
+
202
+ Notes
203
+ -----
204
+ The beta-binomial distribution is a binomial distribution with a
205
+ probability of success `p` that follows a beta distribution.
206
+
207
+ The probability mass function for `betabinom` is:
208
+
209
+ .. math::
210
+
211
+ f(k) = \binom{n}{k} \frac{B(k + a, n - k + b)}{B(a, b)}
212
+
213
+ for :math:`k \in \{0, 1, \dots, n\}`, :math:`n \geq 0`, :math:`a > 0`,
214
+ :math:`b > 0`, where :math:`B(a, b)` is the beta function.
215
+
216
+ `betabinom` takes :math:`n`, :math:`a`, and :math:`b` as shape parameters.
217
+
218
+ %(after_notes)s
219
+
220
+ References
221
+ ----------
222
+ .. [1] https://en.wikipedia.org/wiki/Beta-binomial_distribution
223
+
224
+ .. versionadded:: 1.4.0
225
+
226
+ See Also
227
+ --------
228
+ beta, binom
229
+
230
+ %(example)s
231
+
232
+ """
233
+ def _shape_info(self):
234
+ return [_ShapeInfo("n", True, (0, np.inf), (True, False)),
235
+ _ShapeInfo("a", False, (0, np.inf), (False, False)),
236
+ _ShapeInfo("b", False, (0, np.inf), (False, False))]
237
+
238
+ def _rvs(self, n, a, b, size=None, random_state=None):
239
+ p = random_state.beta(a, b, size)
240
+ return random_state.binomial(n, p, size)
241
+
242
+ def _get_support(self, n, a, b):
243
+ return 0, n
244
+
245
+ def _argcheck(self, n, a, b):
246
+ return (n >= 0) & _isintegral(n) & (a > 0) & (b > 0)
247
+
248
+ def _logpmf(self, x, n, a, b):
249
+ k = floor(x)
250
+ combiln = -log(n + 1) - betaln(n - k + 1, k + 1)
251
+ return combiln + betaln(k + a, n - k + b) - betaln(a, b)
252
+
253
+ def _pmf(self, x, n, a, b):
254
+ return exp(self._logpmf(x, n, a, b))
255
+
256
+ def _stats(self, n, a, b, moments='mv'):
257
+ e_p = a / (a + b)
258
+ e_q = 1 - e_p
259
+ mu = n * e_p
260
+ var = n * (a + b + n) * e_p * e_q / (a + b + 1)
261
+ g1, g2 = None, None
262
+ if 's' in moments:
263
+ g1 = 1.0 / sqrt(var)
264
+ g1 *= (a + b + 2 * n) * (b - a)
265
+ g1 /= (a + b + 2) * (a + b)
266
+ if 'k' in moments:
267
+ g2 = (a + b).astype(e_p.dtype)
268
+ g2 *= (a + b - 1 + 6 * n)
269
+ g2 += 3 * a * b * (n - 2)
270
+ g2 += 6 * n ** 2
271
+ g2 -= 3 * e_p * b * n * (6 - n)
272
+ g2 -= 18 * e_p * e_q * n ** 2
273
+ g2 *= (a + b) ** 2 * (1 + a + b)
274
+ g2 /= (n * a * b * (a + b + 2) * (a + b + 3) * (a + b + n))
275
+ g2 -= 3
276
+ return mu, var, g1, g2
277
+
278
+
279
+ betabinom = betabinom_gen(name='betabinom')
280
+
281
+
282
+ class nbinom_gen(rv_discrete):
283
+ r"""A negative binomial discrete random variable.
284
+
285
+ %(before_notes)s
286
+
287
+ Notes
288
+ -----
289
+ Negative binomial distribution describes a sequence of i.i.d. Bernoulli
290
+ trials, repeated until a predefined, non-random number of successes occurs.
291
+
292
+ The probability mass function of the number of failures for `nbinom` is:
293
+
294
+ .. math::
295
+
296
+ f(k) = \binom{k+n-1}{n-1} p^n (1-p)^k
297
+
298
+ for :math:`k \ge 0`, :math:`0 < p \leq 1`
299
+
300
+ `nbinom` takes :math:`n` and :math:`p` as shape parameters where :math:`n`
301
+ is the number of successes, :math:`p` is the probability of a single
302
+ success, and :math:`1-p` is the probability of a single failure.
303
+
304
+ Another common parameterization of the negative binomial distribution is
305
+ in terms of the mean number of failures :math:`\mu` to achieve :math:`n`
306
+ successes. The mean :math:`\mu` is related to the probability of success
307
+ as
308
+
309
+ .. math::
310
+
311
+ p = \frac{n}{n + \mu}
312
+
313
+ The number of successes :math:`n` may also be specified in terms of a
314
+ "dispersion", "heterogeneity", or "aggregation" parameter :math:`\alpha`,
315
+ which relates the mean :math:`\mu` to the variance :math:`\sigma^2`,
316
+ e.g. :math:`\sigma^2 = \mu + \alpha \mu^2`. Regardless of the convention
317
+ used for :math:`\alpha`,
318
+
319
+ .. math::
320
+
321
+ p &= \frac{\mu}{\sigma^2} \\
322
+ n &= \frac{\mu^2}{\sigma^2 - \mu}
323
+
324
+ This distribution uses routines from the Boost Math C++ library for
325
+ the computation of the ``pmf``, ``cdf``, ``sf``, ``ppf``, ``isf``
326
+ and ``stats`` methods. [1]_
327
+
328
+ %(after_notes)s
329
+
330
+ References
331
+ ----------
332
+ .. [1] The Boost Developers. "Boost C++ Libraries". https://www.boost.org/.
333
+
334
+ %(example)s
335
+
336
+ See Also
337
+ --------
338
+ hypergeom, binom, nhypergeom
339
+
340
+ """
341
+ def _shape_info(self):
342
+ return [_ShapeInfo("n", True, (0, np.inf), (True, False)),
343
+ _ShapeInfo("p", False, (0, 1), (True, True))]
344
+
345
+ def _rvs(self, n, p, size=None, random_state=None):
346
+ return random_state.negative_binomial(n, p, size)
347
+
348
+ def _argcheck(self, n, p):
349
+ return (n > 0) & (p > 0) & (p <= 1)
350
+
351
+ def _pmf(self, x, n, p):
352
+ # nbinom.pmf(k) = choose(k+n-1, n-1) * p**n * (1-p)**k
353
+ return scu._nbinom_pmf(x, n, p)
354
+
355
+ def _logpmf(self, x, n, p):
356
+ coeff = gamln(n+x) - gamln(x+1) - gamln(n)
357
+ return coeff + n*log(p) + special.xlog1py(x, -p)
358
+
359
+ def _cdf(self, x, n, p):
360
+ k = floor(x)
361
+ return scu._nbinom_cdf(k, n, p)
362
+
363
+ def _logcdf(self, x, n, p):
364
+ k = floor(x)
365
+ k, n, p = np.broadcast_arrays(k, n, p)
366
+ cdf = self._cdf(k, n, p)
367
+ cond = cdf > 0.5
368
+ def f1(k, n, p):
369
+ return np.log1p(-special.betainc(k + 1, n, 1 - p))
370
+
371
+ # do calc in place
372
+ logcdf = cdf
373
+ with np.errstate(divide='ignore'):
374
+ logcdf[cond] = f1(k[cond], n[cond], p[cond])
375
+ logcdf[~cond] = np.log(cdf[~cond])
376
+ return logcdf
377
+
378
+ def _sf(self, x, n, p):
379
+ k = floor(x)
380
+ return scu._nbinom_sf(k, n, p)
381
+
382
+ def _isf(self, x, n, p):
383
+ with np.errstate(over='ignore'): # see gh-17432
384
+ return scu._nbinom_isf(x, n, p)
385
+
386
+ def _ppf(self, q, n, p):
387
+ with np.errstate(over='ignore'): # see gh-17432
388
+ return scu._nbinom_ppf(q, n, p)
389
+
390
+ def _stats(self, n, p):
391
+ return (
392
+ scu._nbinom_mean(n, p),
393
+ scu._nbinom_variance(n, p),
394
+ scu._nbinom_skewness(n, p),
395
+ scu._nbinom_kurtosis_excess(n, p),
396
+ )
397
+
398
+
399
+ nbinom = nbinom_gen(name='nbinom')
400
+
401
+
402
+ class betanbinom_gen(rv_discrete):
403
+ r"""A beta-negative-binomial discrete random variable.
404
+
405
+ %(before_notes)s
406
+
407
+ Notes
408
+ -----
409
+ The beta-negative-binomial distribution is a negative binomial
410
+ distribution with a probability of success `p` that follows a
411
+ beta distribution.
412
+
413
+ The probability mass function for `betanbinom` is:
414
+
415
+ .. math::
416
+
417
+ f(k) = \binom{n + k - 1}{k} \frac{B(a + n, b + k)}{B(a, b)}
418
+
419
+ for :math:`k \ge 0`, :math:`n \geq 0`, :math:`a > 0`,
420
+ :math:`b > 0`, where :math:`B(a, b)` is the beta function.
421
+
422
+ `betanbinom` takes :math:`n`, :math:`a`, and :math:`b` as shape parameters.
423
+
424
+ %(after_notes)s
425
+
426
+ References
427
+ ----------
428
+ .. [1] https://en.wikipedia.org/wiki/Beta_negative_binomial_distribution
429
+
430
+ .. versionadded:: 1.12.0
431
+
432
+ See Also
433
+ --------
434
+ betabinom : Beta binomial distribution
435
+
436
+ %(example)s
437
+
438
+ """
439
+ def _shape_info(self):
440
+ return [_ShapeInfo("n", True, (0, np.inf), (True, False)),
441
+ _ShapeInfo("a", False, (0, np.inf), (False, False)),
442
+ _ShapeInfo("b", False, (0, np.inf), (False, False))]
443
+
444
+ def _rvs(self, n, a, b, size=None, random_state=None):
445
+ p = random_state.beta(a, b, size)
446
+ return random_state.negative_binomial(n, p, size)
447
+
448
+ def _argcheck(self, n, a, b):
449
+ return (n >= 0) & _isintegral(n) & (a > 0) & (b > 0)
450
+
451
+ def _logpmf(self, x, n, a, b):
452
+ k = floor(x)
453
+ combiln = -np.log(n + k) - betaln(n, k + 1)
454
+ return combiln + betaln(a + n, b + k) - betaln(a, b)
455
+
456
+ def _pmf(self, x, n, a, b):
457
+ return exp(self._logpmf(x, n, a, b))
458
+
459
+ def _stats(self, n, a, b, moments='mv'):
460
+ # reference: Wolfram Alpha input
461
+ # BetaNegativeBinomialDistribution[a, b, n]
462
+ def mean(n, a, b):
463
+ return n * b / (a - 1.)
464
+ mu = xpx.apply_where(a > 1, (n, a, b), mean, fill_value=np.inf)
465
+ def var(n, a, b):
466
+ return (n * b * (n + a - 1.) * (a + b - 1.)
467
+ / ((a - 2.) * (a - 1.)**2.))
468
+ var = xpx.apply_where(a > 2, (n, a, b), var, fill_value=np.inf)
469
+ g1, g2 = None, None
470
+ def skew(n, a, b):
471
+ return ((2 * n + a - 1.) * (2 * b + a - 1.)
472
+ / (a - 3.) / sqrt(n * b * (n + a - 1.) * (b + a - 1.)
473
+ / (a - 2.)))
474
+ if 's' in moments:
475
+ g1 = xpx.apply_where(a > 3, (n, a, b), skew, fill_value=np.inf)
476
+ def kurtosis(n, a, b):
477
+ term = (a - 2.)
478
+ term_2 = ((a - 1.)**2. * (a**2. + a * (6 * b - 1.)
479
+ + 6. * (b - 1.) * b)
480
+ + 3. * n**2. * ((a + 5.) * b**2. + (a + 5.)
481
+ * (a - 1.) * b + 2. * (a - 1.)**2)
482
+ + 3 * (a - 1.) * n
483
+ * ((a + 5.) * b**2. + (a + 5.) * (a - 1.) * b
484
+ + 2. * (a - 1.)**2.))
485
+ denominator = ((a - 4.) * (a - 3.) * b * n
486
+ * (a + b - 1.) * (a + n - 1.))
487
+ # Wolfram Alpha uses Pearson kurtosis, so we subtract 3 to get
488
+ # scipy's Fisher kurtosis
489
+ return term * term_2 / denominator - 3.
490
+ if 'k' in moments:
491
+ g2 = xpx.apply_where(a > 4, (n, a, b), kurtosis, fill_value=np.inf)
492
+ return mu, var, g1, g2
493
+
494
+
495
+ betanbinom = betanbinom_gen(name='betanbinom')
496
+
497
+
498
+ class geom_gen(rv_discrete):
499
+ r"""A geometric discrete random variable.
500
+
501
+ %(before_notes)s
502
+
503
+ Notes
504
+ -----
505
+ The probability mass function for `geom` is:
506
+
507
+ .. math::
508
+
509
+ f(k) = (1-p)^{k-1} p
510
+
511
+ for :math:`k \ge 1`, :math:`0 < p \leq 1`
512
+
513
+ `geom` takes :math:`p` as shape parameter,
514
+ where :math:`p` is the probability of a single success
515
+ and :math:`1-p` is the probability of a single failure.
516
+
517
+ Note that when drawing random samples, the probability of observations that exceed
518
+ ``np.iinfo(np.int64).max`` increases rapidly as $p$ decreases below $10^{-17}$. For
519
+ $p < 10^{-20}$, almost all observations would exceed the maximum ``int64``; however,
520
+ the output dtype is always ``int64``, so these values are clipped to the maximum.
521
+
522
+ %(after_notes)s
523
+
524
+ See Also
525
+ --------
526
+ planck
527
+
528
+ %(example)s
529
+
530
+ """
531
+
532
+ def _shape_info(self):
533
+ return [_ShapeInfo("p", False, (0, 1), (True, True))]
534
+
535
+ def _rvs(self, p, size=None, random_state=None):
536
+ res = random_state.geometric(p, size=size)
537
+ # RandomState.geometric can wrap around to negative values; make behavior
538
+ # consistent with Generator.geometric by replacing with maximum integer.
539
+ max_int = np.iinfo(res.dtype).max
540
+ return np.where(res < 0, max_int, res)
541
+
542
+ def _argcheck(self, p):
543
+ return (p <= 1) & (p > 0)
544
+
545
+ def _pmf(self, k, p):
546
+ return np.power(1-p, k-1) * p
547
+
548
+ def _logpmf(self, k, p):
549
+ return special.xlog1py(k - 1, -p) + log(p)
550
+
551
+ def _cdf(self, x, p):
552
+ k = floor(x)
553
+ return -expm1(log1p(-p)*k)
554
+
555
+ def _sf(self, x, p):
556
+ return np.exp(self._logsf(x, p))
557
+
558
+ def _logsf(self, x, p):
559
+ k = floor(x)
560
+ return k*log1p(-p)
561
+
562
+ def _ppf(self, q, p):
563
+ vals = ceil(log1p(-q) / log1p(-p))
564
+ temp = self._cdf(vals-1, p)
565
+ return np.where((temp >= q) & (vals > 0), vals-1, vals)
566
+
567
+ def _stats(self, p):
568
+ mu = 1.0/p
569
+ qr = 1.0-p
570
+ var = qr / p / p
571
+ g1 = (2.0-p) / sqrt(qr)
572
+ g2 = np.polyval([1, -6, 6], p)/(1.0-p)
573
+ return mu, var, g1, g2
574
+
575
+ def _entropy(self, p):
576
+ return -np.log(p) - np.log1p(-p) * (1.0-p) / p
577
+
578
+
579
+ geom = geom_gen(a=1, name='geom', longname="A geometric")
580
+
581
+
582
+ class hypergeom_gen(rv_discrete):
583
+ r"""A hypergeometric discrete random variable.
584
+
585
+ The hypergeometric distribution models drawing objects from a bin.
586
+ `M` is the total number of objects, `n` is total number of Type I objects.
587
+ The random variate represents the number of Type I objects in `N` drawn
588
+ without replacement from the total population.
589
+
590
+ %(before_notes)s
591
+
592
+ Notes
593
+ -----
594
+ The symbols used to denote the shape parameters (`M`, `n`, and `N`) are not
595
+ universally accepted. See the Examples for a clarification of the
596
+ definitions used here.
597
+
598
+ The probability mass function is defined as,
599
+
600
+ .. math:: p(k, M, n, N) = \frac{\binom{n}{k} \binom{M - n}{N - k}}
601
+ {\binom{M}{N}}
602
+
603
+ for :math:`k \in [\max(0, N - M + n), \min(n, N)]`, where the binomial
604
+ coefficients are defined as,
605
+
606
+ .. math:: \binom{n}{k} \equiv \frac{n!}{k! (n - k)!}.
607
+
608
+ This distribution uses routines from the Boost Math C++ library for
609
+ the computation of the ``pmf``, ``cdf``, ``sf`` and ``stats`` methods. [1]_
610
+
611
+ %(after_notes)s
612
+
613
+ References
614
+ ----------
615
+ .. [1] The Boost Developers. "Boost C++ Libraries". https://www.boost.org/.
616
+
617
+ Examples
618
+ --------
619
+ >>> import numpy as np
620
+ >>> from scipy.stats import hypergeom
621
+ >>> import matplotlib.pyplot as plt
622
+
623
+ Suppose we have a collection of 20 animals, of which 7 are dogs. Then if
624
+ we want to know the probability of finding a given number of dogs if we
625
+ choose at random 12 of the 20 animals, we can initialize a frozen
626
+ distribution and plot the probability mass function:
627
+
628
+ >>> [M, n, N] = [20, 7, 12]
629
+ >>> rv = hypergeom(M, n, N)
630
+ >>> x = np.arange(0, n+1)
631
+ >>> pmf_dogs = rv.pmf(x)
632
+
633
+ >>> fig = plt.figure()
634
+ >>> ax = fig.add_subplot(111)
635
+ >>> ax.plot(x, pmf_dogs, 'bo')
636
+ >>> ax.vlines(x, 0, pmf_dogs, lw=2)
637
+ >>> ax.set_xlabel('# of dogs in our group of chosen animals')
638
+ >>> ax.set_ylabel('hypergeom PMF')
639
+ >>> plt.show()
640
+
641
+ Instead of using a frozen distribution we can also use `hypergeom`
642
+ methods directly. To for example obtain the cumulative distribution
643
+ function, use:
644
+
645
+ >>> prb = hypergeom.cdf(x, M, n, N)
646
+
647
+ And to generate random numbers:
648
+
649
+ >>> R = hypergeom.rvs(M, n, N, size=10)
650
+
651
+ See Also
652
+ --------
653
+ nhypergeom, binom, nbinom
654
+
655
+ """
656
+ def _shape_info(self):
657
+ return [_ShapeInfo("M", True, (0, np.inf), (True, False)),
658
+ _ShapeInfo("n", True, (0, np.inf), (True, False)),
659
+ _ShapeInfo("N", True, (0, np.inf), (True, False))]
660
+
661
+ def _rvs(self, M, n, N, size=None, random_state=None):
662
+ return random_state.hypergeometric(n, M-n, N, size=size)
663
+
664
+ def _get_support(self, M, n, N):
665
+ return np.maximum(N-(M-n), 0), np.minimum(n, N)
666
+
667
+ def _argcheck(self, M, n, N):
668
+ cond = (M > 0) & (n >= 0) & (N >= 0)
669
+ cond &= (n <= M) & (N <= M)
670
+ cond &= _isintegral(M) & _isintegral(n) & _isintegral(N)
671
+ return cond
672
+
673
+ def _logpmf(self, k, M, n, N):
674
+ tot, good = M, n
675
+ bad = tot - good
676
+ result = (betaln(good+1, 1) + betaln(bad+1, 1) + betaln(tot-N+1, N+1) -
677
+ betaln(k+1, good-k+1) - betaln(N-k+1, bad-N+k+1) -
678
+ betaln(tot+1, 1))
679
+ return result
680
+
681
+ def _pmf(self, k, M, n, N):
682
+ return scu._hypergeom_pmf(k, n, N, M)
683
+
684
+ def _cdf(self, k, M, n, N):
685
+ return scu._hypergeom_cdf(k, n, N, M)
686
+
687
+ def _stats(self, M, n, N):
688
+ M, n, N = 1. * M, 1. * n, 1. * N
689
+ m = M - n
690
+
691
+ # Boost kurtosis_excess doesn't return the same as the value
692
+ # computed here.
693
+ g2 = M * (M + 1) - 6. * N * (M - N) - 6. * n * m
694
+ g2 *= (M - 1) * M * M
695
+ g2 += 6. * n * N * (M - N) * m * (5. * M - 6)
696
+ g2 /= n * N * (M - N) * m * (M - 2.) * (M - 3.)
697
+ return (
698
+ scu._hypergeom_mean(n, N, M),
699
+ scu._hypergeom_variance(n, N, M),
700
+ scu._hypergeom_skewness(n, N, M),
701
+ g2,
702
+ )
703
+
704
+ def _entropy(self, M, n, N):
705
+ k = np.r_[N - (M - n):min(n, N) + 1]
706
+ vals = self.pmf(k, M, n, N)
707
+ return np.sum(entr(vals), axis=0)
708
+
709
+ def _sf(self, k, M, n, N):
710
+ return scu._hypergeom_sf(k, n, N, M)
711
+
712
+ def _logsf(self, k, M, n, N):
713
+ res = []
714
+ for quant, tot, good, draw in zip(*np.broadcast_arrays(k, M, n, N)):
715
+ if (quant + 0.5) * (tot + 0.5) < (good - 0.5) * (draw - 0.5):
716
+ # Less terms to sum if we calculate log(1-cdf)
717
+ res.append(log1p(-exp(self.logcdf(quant, tot, good, draw))))
718
+ else:
719
+ # Integration over probability mass function using logsumexp
720
+ k2 = np.arange(quant + 1, draw + 1)
721
+ res.append(logsumexp(self._logpmf(k2, tot, good, draw)))
722
+ return np.asarray(res)
723
+
724
+ def _logcdf(self, k, M, n, N):
725
+ res = []
726
+ for quant, tot, good, draw in zip(*np.broadcast_arrays(k, M, n, N)):
727
+ if (quant + 0.5) * (tot + 0.5) > (good - 0.5) * (draw - 0.5):
728
+ # Less terms to sum if we calculate log(1-sf)
729
+ res.append(log1p(-exp(self.logsf(quant, tot, good, draw))))
730
+ else:
731
+ # Integration over probability mass function using logsumexp
732
+ k2 = np.arange(0, quant + 1)
733
+ res.append(logsumexp(self._logpmf(k2, tot, good, draw)))
734
+ return np.asarray(res)
735
+
736
+
737
+ hypergeom = hypergeom_gen(name='hypergeom')
738
+
739
+
740
+ class nhypergeom_gen(rv_discrete):
741
+ r"""A negative hypergeometric discrete random variable.
742
+
743
+ Consider a box containing :math:`M` balls:, :math:`n` red and
744
+ :math:`M-n` blue. We randomly sample balls from the box, one
745
+ at a time and *without* replacement, until we have picked :math:`r`
746
+ blue balls. `nhypergeom` is the distribution of the number of
747
+ red balls :math:`k` we have picked.
748
+
749
+ %(before_notes)s
750
+
751
+ Notes
752
+ -----
753
+ The symbols used to denote the shape parameters (`M`, `n`, and `r`) are not
754
+ universally accepted. See the Examples for a clarification of the
755
+ definitions used here.
756
+
757
+ The probability mass function is defined as,
758
+
759
+ .. math:: f(k; M, n, r) = \frac{{{k+r-1}\choose{k}}{{M-r-k}\choose{n-k}}}
760
+ {{M \choose n}}
761
+
762
+ for :math:`k \in [0, n]`, :math:`n \in [0, M]`, :math:`r \in [0, M-n]`,
763
+ and the binomial coefficient is:
764
+
765
+ .. math:: \binom{n}{k} \equiv \frac{n!}{k! (n - k)!}.
766
+
767
+ It is equivalent to observing :math:`k` successes in :math:`k+r-1`
768
+ samples with :math:`k+r`'th sample being a failure. The former
769
+ can be modelled as a hypergeometric distribution. The probability
770
+ of the latter is simply the number of failures remaining
771
+ :math:`M-n-(r-1)` divided by the size of the remaining population
772
+ :math:`M-(k+r-1)`. This relationship can be shown as:
773
+
774
+ .. math:: NHG(k;M,n,r) = HG(k;M,n,k+r-1)\frac{(M-n-(r-1))}{(M-(k+r-1))}
775
+
776
+ where :math:`NHG` is probability mass function (PMF) of the
777
+ negative hypergeometric distribution and :math:`HG` is the
778
+ PMF of the hypergeometric distribution.
779
+
780
+ %(after_notes)s
781
+
782
+ Examples
783
+ --------
784
+ >>> import numpy as np
785
+ >>> from scipy.stats import nhypergeom
786
+ >>> import matplotlib.pyplot as plt
787
+
788
+ Suppose we have a collection of 20 animals, of which 7 are dogs.
789
+ Then if we want to know the probability of finding a given number
790
+ of dogs (successes) in a sample with exactly 12 animals that
791
+ aren't dogs (failures), we can initialize a frozen distribution
792
+ and plot the probability mass function:
793
+
794
+ >>> M, n, r = [20, 7, 12]
795
+ >>> rv = nhypergeom(M, n, r)
796
+ >>> x = np.arange(0, n+2)
797
+ >>> pmf_dogs = rv.pmf(x)
798
+
799
+ >>> fig = plt.figure()
800
+ >>> ax = fig.add_subplot(111)
801
+ >>> ax.plot(x, pmf_dogs, 'bo')
802
+ >>> ax.vlines(x, 0, pmf_dogs, lw=2)
803
+ >>> ax.set_xlabel('# of dogs in our group with given 12 failures')
804
+ >>> ax.set_ylabel('nhypergeom PMF')
805
+ >>> plt.show()
806
+
807
+ Instead of using a frozen distribution we can also use `nhypergeom`
808
+ methods directly. To for example obtain the probability mass
809
+ function, use:
810
+
811
+ >>> prb = nhypergeom.pmf(x, M, n, r)
812
+
813
+ And to generate random numbers:
814
+
815
+ >>> R = nhypergeom.rvs(M, n, r, size=10)
816
+
817
+ To verify the relationship between `hypergeom` and `nhypergeom`, use:
818
+
819
+ >>> from scipy.stats import hypergeom, nhypergeom
820
+ >>> M, n, r = 45, 13, 8
821
+ >>> k = 6
822
+ >>> nhypergeom.pmf(k, M, n, r)
823
+ 0.06180776620271643
824
+ >>> hypergeom.pmf(k, M, n, k+r-1) * (M - n - (r-1)) / (M - (k+r-1))
825
+ 0.06180776620271644
826
+
827
+ See Also
828
+ --------
829
+ hypergeom, binom, nbinom
830
+
831
+ References
832
+ ----------
833
+ .. [1] Negative Hypergeometric Distribution on Wikipedia
834
+ https://en.wikipedia.org/wiki/Negative_hypergeometric_distribution
835
+
836
+ .. [2] Negative Hypergeometric Distribution from
837
+ http://www.math.wm.edu/~leemis/chart/UDR/PDFs/Negativehypergeometric.pdf
838
+
839
+ """
840
+
841
+ def _shape_info(self):
842
+ return [_ShapeInfo("M", True, (0, np.inf), (True, False)),
843
+ _ShapeInfo("n", True, (0, np.inf), (True, False)),
844
+ _ShapeInfo("r", True, (0, np.inf), (True, False))]
845
+
846
+ def _get_support(self, M, n, r):
847
+ return 0, n
848
+
849
+ def _argcheck(self, M, n, r):
850
+ cond = (n >= 0) & (n <= M) & (r >= 0) & (r <= M-n)
851
+ cond &= _isintegral(M) & _isintegral(n) & _isintegral(r)
852
+ return cond
853
+
854
+ def _rvs(self, M, n, r, size=None, random_state=None):
855
+
856
+ @_vectorize_rvs_over_shapes
857
+ def _rvs1(M, n, r, size, random_state):
858
+ # invert cdf by calculating all values in support, scalar M, n, r
859
+ a, b = self.support(M, n, r)
860
+ ks = np.arange(a, b+1)
861
+ cdf = self.cdf(ks, M, n, r)
862
+ ppf = interp1d(cdf, ks, kind='next', fill_value='extrapolate')
863
+ rvs = ppf(random_state.uniform(size=size)).astype(int)
864
+ if size is None:
865
+ return rvs.item()
866
+ return rvs
867
+
868
+ return _rvs1(M, n, r, size=size, random_state=random_state)
869
+
870
+ def _logpmf(self, k, M, n, r):
871
+ return xpx.apply_where(
872
+ (r != 0) | (k != 0), (k, M, n, r),
873
+ lambda k, M, n, r:
874
+ (-betaln(k+1, r) + betaln(k+r, 1)
875
+ - betaln(n-k+1, M-r-n+1) + betaln(M-r-k+1, 1)
876
+ + betaln(n+1, M-n+1) - betaln(M+1, 1)),
877
+ fill_value=0.0)
878
+
879
+ def _pmf(self, k, M, n, r):
880
+ # same as the following but numerically more precise
881
+ # return comb(k+r-1, k) * comb(M-r-k, n-k) / comb(M, n)
882
+ return exp(self._logpmf(k, M, n, r))
883
+
884
+ def _stats(self, M, n, r):
885
+ # Promote the datatype to at least float
886
+ # mu = rn / (M-n+1)
887
+ M, n, r = 1.*M, 1.*n, 1.*r
888
+ mu = r*n / (M-n+1)
889
+
890
+ var = r*(M+1)*n / ((M-n+1)*(M-n+2)) * (1 - r / (M-n+1))
891
+
892
+ # The skew and kurtosis are mathematically
893
+ # intractable so return `None`. See [2]_.
894
+ g1, g2 = None, None
895
+ return mu, var, g1, g2
896
+
897
+
898
+ nhypergeom = nhypergeom_gen(name='nhypergeom')
899
+
900
+
901
+ # FIXME: Fails _cdfvec
902
+ class logser_gen(rv_discrete):
903
+ r"""A Logarithmic (Log-Series, Series) discrete random variable.
904
+
905
+ %(before_notes)s
906
+
907
+ Notes
908
+ -----
909
+ The probability mass function for `logser` is:
910
+
911
+ .. math::
912
+
913
+ f(k) = - \frac{p^k}{k \log(1-p)}
914
+
915
+ for :math:`k \ge 1`, :math:`0 < p < 1`
916
+
917
+ `logser` takes :math:`p` as shape parameter,
918
+ where :math:`p` is the probability of a single success
919
+ and :math:`1-p` is the probability of a single failure.
920
+
921
+ %(after_notes)s
922
+
923
+ %(example)s
924
+
925
+ """
926
+
927
+ def _shape_info(self):
928
+ return [_ShapeInfo("p", False, (0, 1), (True, True))]
929
+
930
+ def _rvs(self, p, size=None, random_state=None):
931
+ # looks wrong for p>0.5, too few k=1
932
+ # trying to use generic is worse, no k=1 at all
933
+ return random_state.logseries(p, size=size)
934
+
935
+ def _argcheck(self, p):
936
+ return (p > 0) & (p < 1)
937
+
938
+ def _pmf(self, k, p):
939
+ # logser.pmf(k) = - p**k / (k*log(1-p))
940
+ return -np.power(p, k) * 1.0 / k / special.log1p(-p)
941
+
942
+ def _stats(self, p):
943
+ r = special.log1p(-p)
944
+ mu = p / (p - 1.0) / r
945
+ mu2p = -p / r / (p - 1.0)**2
946
+ var = mu2p - mu*mu
947
+ mu3p = -p / r * (1.0+p) / (1.0 - p)**3
948
+ mu3 = mu3p - 3*mu*mu2p + 2*mu**3
949
+ g1 = mu3 / np.power(var, 1.5)
950
+
951
+ mu4p = -p / r * (
952
+ 1.0 / (p-1)**2 - 6*p / (p - 1)**3 + 6*p*p / (p-1)**4)
953
+ mu4 = mu4p - 4*mu3p*mu + 6*mu2p*mu*mu - 3*mu**4
954
+ g2 = mu4 / var**2 - 3.0
955
+ return mu, var, g1, g2
956
+
957
+
958
+ logser = logser_gen(a=1, name='logser', longname='A logarithmic')
959
+
960
+
961
+ class poisson_gen(rv_discrete):
962
+ r"""A Poisson discrete random variable.
963
+
964
+ %(before_notes)s
965
+
966
+ Notes
967
+ -----
968
+ The probability mass function for `poisson` is:
969
+
970
+ .. math::
971
+
972
+ f(k) = \exp(-\mu) \frac{\mu^k}{k!}
973
+
974
+ for :math:`k \ge 0`.
975
+
976
+ `poisson` takes :math:`\mu \geq 0` as shape parameter.
977
+ When :math:`\mu = 0`, the ``pmf`` method
978
+ returns ``1.0`` at quantile :math:`k = 0`.
979
+
980
+ %(after_notes)s
981
+
982
+ %(example)s
983
+
984
+ """
985
+
986
+ def _shape_info(self):
987
+ return [_ShapeInfo("mu", False, (0, np.inf), (True, False))]
988
+
989
+ # Override rv_discrete._argcheck to allow mu=0.
990
+ def _argcheck(self, mu):
991
+ return mu >= 0
992
+
993
+ def _rvs(self, mu, size=None, random_state=None):
994
+ return random_state.poisson(mu, size)
995
+
996
+ def _logpmf(self, k, mu):
997
+ Pk = special.xlogy(k, mu) - gamln(k + 1) - mu
998
+ return Pk
999
+
1000
+ def _pmf(self, k, mu):
1001
+ # poisson.pmf(k) = exp(-mu) * mu**k / k!
1002
+ return exp(self._logpmf(k, mu))
1003
+
1004
+ def _cdf(self, x, mu):
1005
+ k = floor(x)
1006
+ return special.pdtr(k, mu)
1007
+
1008
+ def _sf(self, x, mu):
1009
+ k = floor(x)
1010
+ return special.pdtrc(k, mu)
1011
+
1012
+ def _ppf(self, q, mu):
1013
+ vals = ceil(special.pdtrik(q, mu))
1014
+ vals1 = np.maximum(vals - 1, 0)
1015
+ temp = special.pdtr(vals1, mu)
1016
+ return np.where(temp >= q, vals1, vals)
1017
+
1018
+ def _stats(self, mu):
1019
+ var = mu
1020
+ tmp = np.asarray(mu)
1021
+ mu_nonzero = tmp > 0
1022
+ g1 = xpx.apply_where(mu_nonzero, tmp, lambda x: sqrt(1.0/x), fill_value=np.inf)
1023
+ g2 = xpx.apply_where(mu_nonzero, tmp, lambda x: 1.0/x, fill_value=np.inf)
1024
+ return mu, var, g1, g2
1025
+
1026
+
1027
+ poisson = poisson_gen(name="poisson", longname='A Poisson')
1028
+
1029
+
1030
+ class planck_gen(rv_discrete):
1031
+ r"""A Planck discrete exponential random variable.
1032
+
1033
+ %(before_notes)s
1034
+
1035
+ Notes
1036
+ -----
1037
+ The probability mass function for `planck` is:
1038
+
1039
+ .. math::
1040
+
1041
+ f(k) = (1-\exp(-\lambda)) \exp(-\lambda k)
1042
+
1043
+ for :math:`k \ge 0` and :math:`\lambda > 0`.
1044
+
1045
+ `planck` takes :math:`\lambda` as shape parameter. The Planck distribution
1046
+ can be written as a geometric distribution (`geom`) with
1047
+ :math:`p = 1 - \exp(-\lambda)` shifted by ``loc = -1``.
1048
+
1049
+ %(after_notes)s
1050
+
1051
+ See Also
1052
+ --------
1053
+ geom
1054
+
1055
+ %(example)s
1056
+
1057
+ """
1058
+ def _shape_info(self):
1059
+ return [_ShapeInfo("lambda_", False, (0, np.inf), (False, False))]
1060
+
1061
+ def _argcheck(self, lambda_):
1062
+ return lambda_ > 0
1063
+
1064
+ def _pmf(self, k, lambda_):
1065
+ return -expm1(-lambda_)*exp(-lambda_*k)
1066
+
1067
+ def _cdf(self, x, lambda_):
1068
+ k = floor(x)
1069
+ return -expm1(-lambda_*(k+1))
1070
+
1071
+ def _sf(self, x, lambda_):
1072
+ return exp(self._logsf(x, lambda_))
1073
+
1074
+ def _logsf(self, x, lambda_):
1075
+ k = floor(x)
1076
+ return -lambda_*(k+1)
1077
+
1078
+ def _ppf(self, q, lambda_):
1079
+ vals = ceil(-1.0/lambda_ * log1p(-q)-1)
1080
+ vals1 = (vals-1).clip(*(self._get_support(lambda_)))
1081
+ temp = self._cdf(vals1, lambda_)
1082
+ return np.where(temp >= q, vals1, vals)
1083
+
1084
+ def _rvs(self, lambda_, size=None, random_state=None):
1085
+ # use relation to geometric distribution for sampling
1086
+ p = -expm1(-lambda_)
1087
+ return random_state.geometric(p, size=size) - 1.0
1088
+
1089
+ def _stats(self, lambda_):
1090
+ mu = 1/expm1(lambda_)
1091
+ var = exp(-lambda_)/(expm1(-lambda_))**2
1092
+ g1 = 2*cosh(lambda_/2.0)
1093
+ g2 = 4+2*cosh(lambda_)
1094
+ return mu, var, g1, g2
1095
+
1096
+ def _entropy(self, lambda_):
1097
+ C = -expm1(-lambda_)
1098
+ return lambda_*exp(-lambda_)/C - log(C)
1099
+
1100
+
1101
+ planck = planck_gen(a=0, name='planck', longname='A discrete exponential ')
1102
+
1103
+
1104
+ class boltzmann_gen(rv_discrete):
1105
+ r"""A Boltzmann (Truncated Discrete Exponential) random variable.
1106
+
1107
+ %(before_notes)s
1108
+
1109
+ Notes
1110
+ -----
1111
+ The probability mass function for `boltzmann` is:
1112
+
1113
+ .. math::
1114
+
1115
+ f(k) = (1-\exp(-\lambda)) \exp(-\lambda k) / (1-\exp(-\lambda N))
1116
+
1117
+ for :math:`k = 0,..., N-1`.
1118
+
1119
+ `boltzmann` takes :math:`\lambda > 0` and :math:`N > 0` as shape parameters.
1120
+
1121
+ %(after_notes)s
1122
+
1123
+ %(example)s
1124
+
1125
+ """
1126
+ def _shape_info(self):
1127
+ return [_ShapeInfo("lambda_", False, (0, np.inf), (False, False)),
1128
+ _ShapeInfo("N", True, (0, np.inf), (False, False))]
1129
+
1130
+ def _argcheck(self, lambda_, N):
1131
+ return (lambda_ > 0) & (N > 0) & _isintegral(N)
1132
+
1133
+ def _get_support(self, lambda_, N):
1134
+ return self.a, N - 1
1135
+
1136
+ def _pmf(self, k, lambda_, N):
1137
+ # boltzmann.pmf(k) =
1138
+ # (1-exp(-lambda_)*exp(-lambda_*k)/(1-exp(-lambda_*N))
1139
+ fact = (1-exp(-lambda_))/(1-exp(-lambda_*N))
1140
+ return fact*exp(-lambda_*k)
1141
+
1142
+ def _cdf(self, x, lambda_, N):
1143
+ k = floor(x)
1144
+ return (1-exp(-lambda_*(k+1)))/(1-exp(-lambda_*N))
1145
+
1146
+ def _ppf(self, q, lambda_, N):
1147
+ qnew = q*(1-exp(-lambda_*N))
1148
+ vals = ceil(-1.0/lambda_ * log(1-qnew)-1)
1149
+ vals1 = (vals-1).clip(0.0, np.inf)
1150
+ temp = self._cdf(vals1, lambda_, N)
1151
+ return np.where(temp >= q, vals1, vals)
1152
+
1153
+ def _stats(self, lambda_, N):
1154
+ z = exp(-lambda_)
1155
+ zN = exp(-lambda_*N)
1156
+ mu = z/(1.0-z)-N*zN/(1-zN)
1157
+ var = z/(1.0-z)**2 - N*N*zN/(1-zN)**2
1158
+ trm = (1-zN)/(1-z)
1159
+ trm2 = (z*trm**2 - N*N*zN)
1160
+ g1 = z*(1+z)*trm**3 - N**3*zN*(1+zN)
1161
+ g1 = g1 / trm2**(1.5)
1162
+ g2 = z*(1+4*z+z*z)*trm**4 - N**4 * zN*(1+4*zN+zN*zN)
1163
+ g2 = g2 / trm2 / trm2
1164
+ return mu, var, g1, g2
1165
+
1166
+
1167
+ boltzmann = boltzmann_gen(name='boltzmann', a=0,
1168
+ longname='A truncated discrete exponential ')
1169
+
1170
+
1171
+ class randint_gen(rv_discrete):
1172
+ r"""A uniform discrete random variable.
1173
+
1174
+ %(before_notes)s
1175
+
1176
+ Notes
1177
+ -----
1178
+ The probability mass function for `randint` is:
1179
+
1180
+ .. math::
1181
+
1182
+ f(k) = \frac{1}{\texttt{high} - \texttt{low}}
1183
+
1184
+ for :math:`k \in \{\texttt{low}, \dots, \texttt{high} - 1\}`.
1185
+
1186
+ `randint` takes :math:`\texttt{low}` and :math:`\texttt{high}` as shape
1187
+ parameters.
1188
+
1189
+ %(after_notes)s
1190
+
1191
+ Examples
1192
+ --------
1193
+ >>> import numpy as np
1194
+ >>> from scipy.stats import randint
1195
+ >>> import matplotlib.pyplot as plt
1196
+ >>> fig, ax = plt.subplots(1, 1)
1197
+
1198
+ Calculate the first four moments:
1199
+
1200
+ >>> low, high = 7, 31
1201
+ >>> mean, var, skew, kurt = randint.stats(low, high, moments='mvsk')
1202
+
1203
+ Display the probability mass function (``pmf``):
1204
+
1205
+ >>> x = np.arange(low - 5, high + 5)
1206
+ >>> ax.plot(x, randint.pmf(x, low, high), 'bo', ms=8, label='randint pmf')
1207
+ >>> ax.vlines(x, 0, randint.pmf(x, low, high), colors='b', lw=5, alpha=0.5)
1208
+
1209
+ Alternatively, the distribution object can be called (as a function) to
1210
+ fix the shape and location. This returns a "frozen" RV object holding the
1211
+ given parameters fixed.
1212
+
1213
+ Freeze the distribution and display the frozen ``pmf``:
1214
+
1215
+ >>> rv = randint(low, high)
1216
+ >>> ax.vlines(x, 0, rv.pmf(x), colors='k', linestyles='-',
1217
+ ... lw=1, label='frozen pmf')
1218
+ >>> ax.legend(loc='lower center')
1219
+ >>> plt.show()
1220
+
1221
+ Check the relationship between the cumulative distribution function
1222
+ (``cdf``) and its inverse, the percent point function (``ppf``):
1223
+
1224
+ >>> q = np.arange(low, high)
1225
+ >>> p = randint.cdf(q, low, high)
1226
+ >>> np.allclose(q, randint.ppf(p, low, high))
1227
+ True
1228
+
1229
+ Generate random numbers:
1230
+
1231
+ >>> r = randint.rvs(low, high, size=1000)
1232
+
1233
+ """
1234
+
1235
+ def _shape_info(self):
1236
+ return [_ShapeInfo("low", True, (-np.inf, np.inf), (False, False)),
1237
+ _ShapeInfo("high", True, (-np.inf, np.inf), (False, False))]
1238
+
1239
+ def _argcheck(self, low, high):
1240
+ return (high > low) & _isintegral(low) & _isintegral(high)
1241
+
1242
+ def _get_support(self, low, high):
1243
+ return low, high-1
1244
+
1245
+ def _pmf(self, k, low, high):
1246
+ # randint.pmf(k) = 1./(high - low)
1247
+ p = np.ones_like(k) / (np.asarray(high, dtype=np.int64) - low)
1248
+ return np.where((k >= low) & (k < high), p, 0.)
1249
+
1250
+ def _cdf(self, x, low, high):
1251
+ k = floor(x)
1252
+ return (k - low + 1.) / (high - low)
1253
+
1254
+ def _ppf(self, q, low, high):
1255
+ vals = ceil(q * (high - low) + low) - 1
1256
+ vals1 = (vals - 1).clip(low, high)
1257
+ temp = self._cdf(vals1, low, high)
1258
+ return np.where(temp >= q, vals1, vals)
1259
+
1260
+ def _stats(self, low, high):
1261
+ m2, m1 = np.asarray(high), np.asarray(low)
1262
+ mu = (m2 + m1 - 1.0) / 2
1263
+ d = m2 - m1
1264
+ var = (d*d - 1) / 12.0
1265
+ g1 = 0.0
1266
+ g2 = -6.0/5.0 * (d*d + 1.0) / (d*d - 1.0)
1267
+ return mu, var, g1, g2
1268
+
1269
+ def _rvs(self, low, high, size=None, random_state=None):
1270
+ """An array of *size* random integers >= ``low`` and < ``high``."""
1271
+ if np.asarray(low).size == 1 and np.asarray(high).size == 1:
1272
+ # no need to vectorize in that case
1273
+ return rng_integers(random_state, low, high, size=size)
1274
+
1275
+ if size is not None:
1276
+ # NumPy's RandomState.randint() doesn't broadcast its arguments.
1277
+ # Use `broadcast_to()` to extend the shapes of low and high
1278
+ # up to size. Then we can use the numpy.vectorize'd
1279
+ # randint without needing to pass it a `size` argument.
1280
+ low = np.broadcast_to(low, size)
1281
+ high = np.broadcast_to(high, size)
1282
+ randint = np.vectorize(partial(rng_integers, random_state),
1283
+ otypes=[np.dtype(int)])
1284
+ return randint(low, high)
1285
+
1286
+ def _entropy(self, low, high):
1287
+ return log(high - low)
1288
+
1289
+
1290
+ randint = randint_gen(name='randint', longname='A discrete uniform '
1291
+ '(random integer)')
1292
+
1293
+
1294
+ # FIXME: problems sampling.
1295
+ class zipf_gen(rv_discrete):
1296
+ r"""A Zipf (Zeta) discrete random variable.
1297
+
1298
+ %(before_notes)s
1299
+
1300
+ See Also
1301
+ --------
1302
+ zipfian
1303
+
1304
+ Notes
1305
+ -----
1306
+ The probability mass function for `zipf` is:
1307
+
1308
+ .. math::
1309
+
1310
+ f(k, a) = \frac{1}{\zeta(a) k^a}
1311
+
1312
+ for :math:`k \ge 1`, :math:`a > 1`.
1313
+
1314
+ `zipf` takes :math:`a > 1` as shape parameter. :math:`\zeta` is the
1315
+ Riemann zeta function (`scipy.special.zeta`)
1316
+
1317
+ The Zipf distribution is also known as the zeta distribution, which is
1318
+ a special case of the Zipfian distribution (`zipfian`).
1319
+
1320
+ %(after_notes)s
1321
+
1322
+ References
1323
+ ----------
1324
+ .. [1] "Zeta Distribution", Wikipedia,
1325
+ https://en.wikipedia.org/wiki/Zeta_distribution
1326
+
1327
+ %(example)s
1328
+
1329
+ Confirm that `zipf` is the large `n` limit of `zipfian`.
1330
+
1331
+ >>> import numpy as np
1332
+ >>> from scipy.stats import zipf, zipfian
1333
+ >>> k = np.arange(11)
1334
+ >>> np.allclose(zipf.pmf(k, a), zipfian.pmf(k, a, n=10000000))
1335
+ True
1336
+
1337
+ """
1338
+
1339
+ def _shape_info(self):
1340
+ return [_ShapeInfo("a", False, (1, np.inf), (False, False))]
1341
+
1342
+ def _rvs(self, a, size=None, random_state=None):
1343
+ return random_state.zipf(a, size=size)
1344
+
1345
+ def _argcheck(self, a):
1346
+ return a > 1
1347
+
1348
+ def _pmf(self, k, a):
1349
+ k = k.astype(np.float64)
1350
+ # zipf.pmf(k, a) = 1/(zeta(a) * k**a)
1351
+ Pk = 1.0 / special.zeta(a, 1) * k**-a
1352
+ return Pk
1353
+
1354
+ def _munp(self, n, a):
1355
+ return xpx.apply_where(
1356
+ a > n + 1, (a, n),
1357
+ lambda a, n: special.zeta(a - n, 1) / special.zeta(a, 1),
1358
+ fill_value=np.inf)
1359
+
1360
+
1361
+ zipf = zipf_gen(a=1, name='zipf', longname='A Zipf')
1362
+
1363
+
1364
+ def _gen_harmonic_gt1(n, a):
1365
+ """Generalized harmonic number, a > 1"""
1366
+ # See https://en.wikipedia.org/wiki/Harmonic_number; search for "hurwitz"
1367
+ return zeta(a, 1) - zeta(a, n+1)
1368
+
1369
+
1370
+ def _gen_harmonic_leq1(n, a):
1371
+ """Generalized harmonic number, a <= 1"""
1372
+ if not np.size(n):
1373
+ return n
1374
+ n_max = np.nanmax(n) # loop starts at maximum of all n
1375
+ out = np.zeros_like(a, dtype=float)
1376
+ # add terms of harmonic series; starting from smallest to avoid roundoff
1377
+ for i in np.arange(n_max, 0, -1, dtype=float):
1378
+ mask = i <= n # don't add terms after nth
1379
+ out[mask] += 1/i**a[mask]
1380
+ out[np.isnan(n)] = np.nan
1381
+ return out
1382
+
1383
+
1384
+ def _gen_harmonic(n, a):
1385
+ """Generalized harmonic number"""
1386
+ n, a = np.broadcast_arrays(n, a)
1387
+ return xpx.apply_where(a > 1, (n, a), _gen_harmonic_gt1, _gen_harmonic_leq1)
1388
+
1389
+
1390
+ class zipfian_gen(rv_discrete):
1391
+ r"""A Zipfian discrete random variable.
1392
+
1393
+ %(before_notes)s
1394
+
1395
+ See Also
1396
+ --------
1397
+ zipf
1398
+
1399
+ Notes
1400
+ -----
1401
+ The probability mass function for `zipfian` is:
1402
+
1403
+ .. math::
1404
+
1405
+ f(k, a, n) = \frac{1}{H_{n,a} k^a}
1406
+
1407
+ for :math:`k \in \{1, 2, \dots, n-1, n\}`, :math:`a \ge 0`,
1408
+ :math:`n \in \{1, 2, 3, \dots\}`.
1409
+
1410
+ `zipfian` takes :math:`a` and :math:`n` as shape parameters.
1411
+ :math:`H_{n,a}` is the :math:`n`:sup:`th` generalized harmonic
1412
+ number of order :math:`a`.
1413
+
1414
+ The Zipfian distribution reduces to the Zipf (zeta) distribution as
1415
+ :math:`n \rightarrow \infty`.
1416
+
1417
+ %(after_notes)s
1418
+
1419
+ References
1420
+ ----------
1421
+ .. [1] "Zipf's Law", Wikipedia, https://en.wikipedia.org/wiki/Zipf's_law
1422
+ .. [2] Larry Leemis, "Zipf Distribution", Univariate Distribution
1423
+ Relationships. http://www.math.wm.edu/~leemis/chart/UDR/PDFs/Zipf.pdf
1424
+
1425
+ %(example)s
1426
+
1427
+ Confirm that `zipfian` reduces to `zipf` for large `n`, ``a > 1``.
1428
+
1429
+ >>> import numpy as np
1430
+ >>> from scipy.stats import zipf, zipfian
1431
+ >>> k = np.arange(11)
1432
+ >>> np.allclose(zipfian.pmf(k, a=3.5, n=10000000), zipf.pmf(k, a=3.5))
1433
+ True
1434
+
1435
+ """
1436
+
1437
+ def _shape_info(self):
1438
+ return [_ShapeInfo("a", False, (0, np.inf), (True, False)),
1439
+ _ShapeInfo("n", True, (0, np.inf), (False, False))]
1440
+
1441
+ def _argcheck(self, a, n):
1442
+ # we need np.asarray here because moment (maybe others) don't convert
1443
+ return (a >= 0) & (n > 0) & (n == np.asarray(n, dtype=int))
1444
+
1445
+ def _get_support(self, a, n):
1446
+ return 1, n
1447
+
1448
+ def _pmf(self, k, a, n):
1449
+ k = k.astype(np.float64)
1450
+ return 1.0 / _gen_harmonic(n, a) * k**-a
1451
+
1452
+ def _cdf(self, k, a, n):
1453
+ k = np.floor(k)
1454
+ return _gen_harmonic(k, a) / _gen_harmonic(n, a)
1455
+
1456
+ def _sf(self, k, a, n):
1457
+ k = np.floor(k + 1) # # to match SciPy convention
1458
+ # see http://www.math.wm.edu/~leemis/chart/UDR/PDFs/Zipf.pdf
1459
+ return ((k**a*(_gen_harmonic(n, a) - _gen_harmonic(k, a)) + 1)
1460
+ / (k**a*_gen_harmonic(n, a)))
1461
+
1462
+ def _stats(self, a, n):
1463
+ # see # see http://www.math.wm.edu/~leemis/chart/UDR/PDFs/Zipf.pdf
1464
+ Hna = _gen_harmonic(n, a)
1465
+ Hna1 = _gen_harmonic(n, a-1)
1466
+ Hna2 = _gen_harmonic(n, a-2)
1467
+ Hna3 = _gen_harmonic(n, a-3)
1468
+ Hna4 = _gen_harmonic(n, a-4)
1469
+ mu1 = Hna1/Hna
1470
+ mu2n = (Hna2*Hna - Hna1**2)
1471
+ mu2d = Hna**2
1472
+ mu2 = mu2n / mu2d
1473
+ g1 = (Hna3/Hna - 3*Hna1*Hna2/Hna**2 + 2*Hna1**3/Hna**3)/mu2**(3/2)
1474
+ g2 = (Hna**3*Hna4 - 4*Hna**2*Hna1*Hna3 + 6*Hna*Hna1**2*Hna2
1475
+ - 3*Hna1**4) / mu2n**2
1476
+ g2 -= 3
1477
+ return mu1, mu2, g1, g2
1478
+
1479
+
1480
+ zipfian = zipfian_gen(a=1, name='zipfian', longname='A Zipfian')
1481
+
1482
+
1483
+ class dlaplace_gen(rv_discrete):
1484
+ r"""A Laplacian discrete random variable.
1485
+
1486
+ %(before_notes)s
1487
+
1488
+ Notes
1489
+ -----
1490
+ The probability mass function for `dlaplace` is:
1491
+
1492
+ .. math::
1493
+
1494
+ f(k) = \tanh(a/2) \exp(-a |k|)
1495
+
1496
+ for integers :math:`k` and :math:`a > 0`.
1497
+
1498
+ `dlaplace` takes :math:`a` as shape parameter.
1499
+
1500
+ %(after_notes)s
1501
+
1502
+ %(example)s
1503
+
1504
+ """
1505
+
1506
+ def _shape_info(self):
1507
+ return [_ShapeInfo("a", False, (0, np.inf), (False, False))]
1508
+
1509
+ def _pmf(self, k, a):
1510
+ # dlaplace.pmf(k) = tanh(a/2) * exp(-a*abs(k))
1511
+ return tanh(a/2.0) * exp(-a * abs(k))
1512
+
1513
+ def _cdf(self, x, a):
1514
+ k = floor(x)
1515
+
1516
+ def f1(k, a):
1517
+ return 1.0 - exp(-a * k) / (exp(a) + 1)
1518
+
1519
+ def f2(k, a):
1520
+ return exp(a * (k + 1)) / (exp(a) + 1)
1521
+
1522
+ return xpx.apply_where(k >= 0, (k, a), f1, f2)
1523
+
1524
+ def _ppf(self, q, a):
1525
+ const = 1 + exp(a)
1526
+ vals = ceil(np.where(q < 1.0 / (1 + exp(-a)),
1527
+ log(q*const) / a - 1,
1528
+ -log((1-q) * const) / a))
1529
+ vals1 = vals - 1
1530
+ return np.where(self._cdf(vals1, a) >= q, vals1, vals)
1531
+
1532
+ def _stats(self, a):
1533
+ ea = exp(a)
1534
+ mu2 = 2.*ea/(ea-1.)**2
1535
+ mu4 = 2.*ea*(ea**2+10.*ea+1.) / (ea-1.)**4
1536
+ return 0., mu2, 0., mu4/mu2**2 - 3.
1537
+
1538
+ def _entropy(self, a):
1539
+ return a / sinh(a) - log(tanh(a/2.0))
1540
+
1541
+ def _rvs(self, a, size=None, random_state=None):
1542
+ # The discrete Laplace is equivalent to the two-sided geometric
1543
+ # distribution with PMF:
1544
+ # f(k) = (1 - alpha)/(1 + alpha) * alpha^abs(k)
1545
+ # Reference:
1546
+ # https://www.sciencedirect.com/science/
1547
+ # article/abs/pii/S0378375804003519
1548
+ # Furthermore, the two-sided geometric distribution is
1549
+ # equivalent to the difference between two iid geometric
1550
+ # distributions.
1551
+ # Reference (page 179):
1552
+ # https://pdfs.semanticscholar.org/61b3/
1553
+ # b99f466815808fd0d03f5d2791eea8b541a1.pdf
1554
+ # Thus, we can leverage the following:
1555
+ # 1) alpha = e^-a
1556
+ # 2) probability_of_success = 1 - alpha (Bernoulli trial)
1557
+ probOfSuccess = -np.expm1(-np.asarray(a))
1558
+ x = random_state.geometric(probOfSuccess, size=size)
1559
+ y = random_state.geometric(probOfSuccess, size=size)
1560
+ return x - y
1561
+
1562
+
1563
+ dlaplace = dlaplace_gen(a=-np.inf,
1564
+ name='dlaplace', longname='A discrete Laplacian')
1565
+
1566
+
1567
+ class poisson_binom_gen(rv_discrete):
1568
+ r"""A Poisson Binomial discrete random variable.
1569
+
1570
+ %(before_notes)s
1571
+
1572
+ See Also
1573
+ --------
1574
+ binom
1575
+
1576
+ Notes
1577
+ -----
1578
+ The probability mass function for `poisson_binom` is:
1579
+
1580
+ .. math::
1581
+
1582
+ f(k; p_1, p_2, ..., p_n) = \sum_{A \in F_k} \prod_{i \in A} p_i \prod_{j \in A^C} 1 - p_j
1583
+
1584
+ where :math:`k \in \{0, 1, \dots, n-1, n\}`, :math:`F_k` is the set of all
1585
+ subsets of :math:`k` integers that can be selected :math:`\{0, 1, \dots, n-1, n\}`,
1586
+ and :math:`A^C` is the complement of a set :math:`A`.
1587
+
1588
+ `poisson_binom` accepts a single array argument ``p`` for shape parameters
1589
+ :math:`0 ≤ p_i ≤ 1`, where the last axis corresponds with the index :math:`i` and
1590
+ any others are for batch dimensions. Broadcasting behaves according to the usual
1591
+ rules except that the last axis of ``p`` is ignored. Instances of this class do
1592
+ not support serialization/unserialization.
1593
+
1594
+ %(after_notes)s
1595
+
1596
+ References
1597
+ ----------
1598
+ .. [1] "Poisson binomial distribution", Wikipedia,
1599
+ https://en.wikipedia.org/wiki/Poisson_binomial_distribution
1600
+ .. [2] Biscarri, William, Sihai Dave Zhao, and Robert J. Brunner. "A simple and
1601
+ fast method for computing the Poisson binomial distribution function".
1602
+ Computational Statistics & Data Analysis 122 (2018) 92-100.
1603
+ :doi:`10.1016/j.csda.2018.01.007`
1604
+
1605
+ %(example)s
1606
+
1607
+ """ # noqa: E501
1608
+ def _shape_info(self):
1609
+ # message = 'Fitting is not implemented for this distribution."
1610
+ # raise NotImplementedError(message)
1611
+ return []
1612
+
1613
+ def _argcheck(self, *args):
1614
+ p = np.stack(args, axis=0)
1615
+ conds = (0 <= p) & (p <= 1)
1616
+ return np.all(conds, axis=0)
1617
+
1618
+ def _rvs(self, *args, size=None, random_state=None):
1619
+ # convenient to work along the last axis here to avoid interference with `size`
1620
+ p = np.stack(args, axis=-1)
1621
+ # Size passed by the user is the *shape of the returned array*, so it won't
1622
+ # contain the length of the last axis of p.
1623
+ size = (p.shape if size is None else
1624
+ (size, 1) if np.isscalar(size) else tuple(size) + (1,))
1625
+ size = np.broadcast_shapes(p.shape, size)
1626
+ return bernoulli._rvs(p, size=size, random_state=random_state).sum(axis=-1)
1627
+
1628
+ def _get_support(self, *args):
1629
+ return 0, len(args)
1630
+
1631
+ def _pmf(self, k, *args):
1632
+ k = np.atleast_1d(k).astype(np.int64)
1633
+ k, *args = np.broadcast_arrays(k, *args)
1634
+ args = np.asarray(args, dtype=np.float64)
1635
+ return _poisson_binom(k, args, 'pmf')
1636
+
1637
+ def _cdf(self, k, *args):
1638
+ k = np.atleast_1d(k).astype(np.int64)
1639
+ k, *args = np.broadcast_arrays(k, *args)
1640
+ args = np.asarray(args, dtype=np.float64)
1641
+ return _poisson_binom(k, args, 'cdf')
1642
+
1643
+ def _stats(self, *args, **kwds):
1644
+ p = np.stack(args, axis=0)
1645
+ mean = np.sum(p, axis=0)
1646
+ var = np.sum(p * (1-p), axis=0)
1647
+ return (mean, var, None, None)
1648
+
1649
+ def __call__(self, *args, **kwds):
1650
+ return poisson_binomial_frozen(self, *args, **kwds)
1651
+
1652
+
1653
+ poisson_binom = poisson_binom_gen(name='poisson_binom', longname='A Poisson binomial',
1654
+ shapes='p')
1655
+
1656
+ # The _parse_args methods don't work with vector-valued shape parameters, so we rewrite
1657
+ # them. Note that `p` is accepted as an array with the index `i` of `p_i` corresponding
1658
+ # with the last axis; we return it as a tuple (p_1, p_2, ..., p_n) so that it looks
1659
+ # like `n` scalar (or arrays of scalar-valued) shape parameters to the infrastructure.
1660
+
1661
+ def _parse_args_rvs(self, p, loc=0, size=None):
1662
+ return tuple(np.moveaxis(p, -1, 0)), loc, 1.0, size
1663
+
1664
+ def _parse_args_stats(self, p, loc=0, moments='mv'):
1665
+ return tuple(np.moveaxis(p, -1, 0)), loc, 1.0, moments
1666
+
1667
+ def _parse_args(self, p, loc=0):
1668
+ return tuple(np.moveaxis(p, -1, 0)), loc, 1.0
1669
+
1670
+ # The infrastructure manually binds these methods to the instance, so
1671
+ # we can only override them by manually binding them, too.
1672
+ _pb_obj, _pb_cls = poisson_binom, poisson_binom_gen # shorter names (for PEP8)
1673
+ poisson_binom._parse_args_rvs = _parse_args_rvs.__get__(_pb_obj, _pb_cls)
1674
+ poisson_binom._parse_args_stats = _parse_args_stats.__get__(_pb_obj, _pb_cls)
1675
+ poisson_binom._parse_args = _parse_args.__get__(_pb_obj, _pb_cls)
1676
+
1677
+ class poisson_binomial_frozen(rv_discrete_frozen):
1678
+ # copied from rv_frozen; we just need to bind the `_parse_args` methods
1679
+ def __init__(self, dist, *args, **kwds): # verbatim
1680
+ self.args = args # verbatim
1681
+ self.kwds = kwds # verbatim
1682
+
1683
+ # create a new instance # verbatim
1684
+ self.dist = dist.__class__(**dist._updated_ctor_param()) # verbatim
1685
+
1686
+ # Here is the only modification
1687
+ self.dist._parse_args_rvs = _parse_args_rvs.__get__(_pb_obj, _pb_cls)
1688
+ self.dist._parse_args_stats = _parse_args_stats.__get__(_pb_obj, _pb_cls)
1689
+ self.dist._parse_args = _parse_args.__get__(_pb_obj, _pb_cls)
1690
+
1691
+ shapes, _, _ = self.dist._parse_args(*args, **kwds) # verbatim
1692
+ self.a, self.b = self.dist._get_support(*shapes) # verbatim
1693
+
1694
+ def expect(self, func=None, lb=None, ub=None, conditional=False, **kwds):
1695
+ a, loc, scale = self.dist._parse_args(*self.args, **self.kwds)
1696
+ # Here's the modification: we pass all args (including `loc`) into the `args`
1697
+ # parameter of `expect` so the shape only goes through `_parse_args` once.
1698
+ return self.dist.expect(func, self.args, loc, lb, ub, conditional, **kwds)
1699
+
1700
+
1701
+ class skellam_gen(rv_discrete):
1702
+ r"""A Skellam discrete random variable.
1703
+
1704
+ %(before_notes)s
1705
+
1706
+ Notes
1707
+ -----
1708
+ Probability distribution of the difference of two correlated or
1709
+ uncorrelated Poisson random variables.
1710
+
1711
+ Let :math:`k_1` and :math:`k_2` be two Poisson-distributed r.v. with
1712
+ expected values :math:`\lambda_1` and :math:`\lambda_2`. Then,
1713
+ :math:`k_1 - k_2` follows a Skellam distribution with parameters
1714
+ :math:`\mu_1 = \lambda_1 - \rho \sqrt{\lambda_1 \lambda_2}` and
1715
+ :math:`\mu_2 = \lambda_2 - \rho \sqrt{\lambda_1 \lambda_2}`, where
1716
+ :math:`\rho` is the correlation coefficient between :math:`k_1` and
1717
+ :math:`k_2`. If the two Poisson-distributed r.v. are independent then
1718
+ :math:`\rho = 0`.
1719
+
1720
+ Parameters :math:`\mu_1` and :math:`\mu_2` must be strictly positive.
1721
+
1722
+ For details see: https://en.wikipedia.org/wiki/Skellam_distribution
1723
+
1724
+ `skellam` takes :math:`\mu_1` and :math:`\mu_2` as shape parameters.
1725
+
1726
+ %(after_notes)s
1727
+
1728
+ %(example)s
1729
+
1730
+ """
1731
+ def _shape_info(self):
1732
+ return [_ShapeInfo("mu1", False, (0, np.inf), (False, False)),
1733
+ _ShapeInfo("mu2", False, (0, np.inf), (False, False))]
1734
+
1735
+ def _rvs(self, mu1, mu2, size=None, random_state=None):
1736
+ n = size
1737
+ return (random_state.poisson(mu1, n) -
1738
+ random_state.poisson(mu2, n))
1739
+
1740
+ def _pmf(self, x, mu1, mu2):
1741
+ with np.errstate(over='ignore'): # see gh-17432
1742
+ px = np.where(x < 0,
1743
+ scu._ncx2_pdf(2*mu2, 2*(1-x), 2*mu1)*2,
1744
+ scu._ncx2_pdf(2*mu1, 2*(1+x), 2*mu2)*2)
1745
+ # ncx2.pdf() returns nan's for extremely low probabilities
1746
+ return px
1747
+
1748
+ def _cdf(self, x, mu1, mu2):
1749
+ x = floor(x)
1750
+ with np.errstate(over='ignore'): # see gh-17432
1751
+ px = np.where(x < 0,
1752
+ scu._ncx2_cdf(2*mu2, -2*x, 2*mu1),
1753
+ 1 - scu._ncx2_cdf(2*mu1, 2*(x+1), 2*mu2))
1754
+ return px
1755
+
1756
+ def _stats(self, mu1, mu2):
1757
+ mean = mu1 - mu2
1758
+ var = mu1 + mu2
1759
+ g1 = mean / sqrt((var)**3)
1760
+ g2 = 1 / var
1761
+ return mean, var, g1, g2
1762
+
1763
+
1764
+ skellam = skellam_gen(a=-np.inf, name="skellam", longname='A Skellam')
1765
+
1766
+
1767
+ class yulesimon_gen(rv_discrete):
1768
+ r"""A Yule-Simon discrete random variable.
1769
+
1770
+ %(before_notes)s
1771
+
1772
+ Notes
1773
+ -----
1774
+
1775
+ The probability mass function for the `yulesimon` is:
1776
+
1777
+ .. math::
1778
+
1779
+ f(k) = \alpha B(k, \alpha+1)
1780
+
1781
+ for :math:`k=1,2,3,...`, where :math:`\alpha>0`.
1782
+ Here :math:`B` refers to the `scipy.special.beta` function.
1783
+
1784
+ The sampling of random variates is based on pg 553, Section 6.3 of [1]_.
1785
+ Our notation maps to the referenced logic via :math:`\alpha=a-1`.
1786
+
1787
+ For details see the wikipedia entry [2]_.
1788
+
1789
+ References
1790
+ ----------
1791
+ .. [1] Devroye, Luc. "Non-uniform Random Variate Generation",
1792
+ (1986) Springer, New York.
1793
+
1794
+ .. [2] https://en.wikipedia.org/wiki/Yule-Simon_distribution
1795
+
1796
+ %(after_notes)s
1797
+
1798
+ %(example)s
1799
+
1800
+ """
1801
+ def _shape_info(self):
1802
+ return [_ShapeInfo("alpha", False, (0, np.inf), (False, False))]
1803
+
1804
+ def _rvs(self, alpha, size=None, random_state=None):
1805
+ E1 = random_state.standard_exponential(size)
1806
+ E2 = random_state.standard_exponential(size)
1807
+ ans = ceil(-E1 / log1p(-exp(-E2 / alpha)))
1808
+ return ans
1809
+
1810
+ def _pmf(self, x, alpha):
1811
+ return alpha * special.beta(x, alpha + 1)
1812
+
1813
+ def _argcheck(self, alpha):
1814
+ return (alpha > 0)
1815
+
1816
+ def _logpmf(self, x, alpha):
1817
+ return log(alpha) + special.betaln(x, alpha + 1)
1818
+
1819
+ def _cdf(self, x, alpha):
1820
+ return 1 - x * special.beta(x, alpha + 1)
1821
+
1822
+ def _sf(self, x, alpha):
1823
+ return x * special.beta(x, alpha + 1)
1824
+
1825
+ def _logsf(self, x, alpha):
1826
+ return log(x) + special.betaln(x, alpha + 1)
1827
+
1828
+ def _stats(self, alpha):
1829
+ mu = np.where(alpha <= 1, np.inf, alpha / (alpha - 1))
1830
+ mu2 = np.where(alpha > 2,
1831
+ alpha**2 / ((alpha - 2.0) * (alpha - 1)**2),
1832
+ np.inf)
1833
+ mu2 = np.where(alpha <= 1, np.nan, mu2)
1834
+ g1 = np.where(alpha > 3,
1835
+ sqrt(alpha - 2) * (alpha + 1)**2 / (alpha * (alpha - 3)),
1836
+ np.inf)
1837
+ g1 = np.where(alpha <= 2, np.nan, g1)
1838
+ g2 = np.where(alpha > 4,
1839
+ alpha + 3 + ((11 * alpha**3 - 49 * alpha - 22) /
1840
+ (alpha * (alpha - 4) * (alpha - 3))),
1841
+ np.inf)
1842
+ g2 = np.where(alpha <= 2, np.nan, g2)
1843
+ return mu, mu2, g1, g2
1844
+
1845
+
1846
+ yulesimon = yulesimon_gen(name='yulesimon', a=1)
1847
+
1848
+
1849
+ class _nchypergeom_gen(rv_discrete):
1850
+ r"""A noncentral hypergeometric discrete random variable.
1851
+
1852
+ For subclassing by nchypergeom_fisher_gen and nchypergeom_wallenius_gen.
1853
+
1854
+ """
1855
+
1856
+ rvs_name = None
1857
+ dist = None
1858
+
1859
+ def _shape_info(self):
1860
+ return [_ShapeInfo("M", True, (0, np.inf), (True, False)),
1861
+ _ShapeInfo("n", True, (0, np.inf), (True, False)),
1862
+ _ShapeInfo("N", True, (0, np.inf), (True, False)),
1863
+ _ShapeInfo("odds", False, (0, np.inf), (False, False))]
1864
+
1865
+ def _get_support(self, M, n, N, odds):
1866
+ N, m1, n = M, n, N # follow Wikipedia notation
1867
+ m2 = N - m1
1868
+ x_min = np.maximum(0, n - m2)
1869
+ x_max = np.minimum(n, m1)
1870
+ return x_min, x_max
1871
+
1872
+ def _argcheck(self, M, n, N, odds):
1873
+ M, n = np.asarray(M), np.asarray(n),
1874
+ N, odds = np.asarray(N), np.asarray(odds)
1875
+ cond1 = (~np.isnan(M)) & (M.astype(int) == M) & (M >= 0)
1876
+ cond2 = (~np.isnan(n)) & (n.astype(int) == n) & (n >= 0)
1877
+ cond3 = (~np.isnan(N)) & (N.astype(int) == N) & (N >= 0)
1878
+ cond4 = odds > 0
1879
+ cond5 = N <= M
1880
+ cond6 = n <= M
1881
+ return cond1 & cond2 & cond3 & cond4 & cond5 & cond6
1882
+
1883
+ def _rvs(self, M, n, N, odds, size=None, random_state=None):
1884
+
1885
+ @_vectorize_rvs_over_shapes
1886
+ def _rvs1(M, n, N, odds, size, random_state):
1887
+ if np.isnan(M) | np.isnan(n) | np.isnan(N):
1888
+ return np.full(size, np.nan)
1889
+ length = np.prod(size)
1890
+ urn = _PyStochasticLib3()
1891
+ rv_gen = getattr(urn, self.rvs_name)
1892
+ rvs = rv_gen(N, n, M, odds, length, random_state)
1893
+ rvs = rvs.reshape(size)
1894
+ return rvs
1895
+
1896
+ return _rvs1(M, n, N, odds, size=size, random_state=random_state)
1897
+
1898
+ def _pmf(self, x, M, n, N, odds):
1899
+
1900
+ x, M, n, N, odds = np.broadcast_arrays(x, M, n, N, odds)
1901
+ if x.size == 0: # np.vectorize doesn't work with zero size input
1902
+ return np.empty_like(x)
1903
+
1904
+ @np.vectorize
1905
+ def _pmf1(x, M, n, N, odds):
1906
+ if np.isnan(x) | np.isnan(M) | np.isnan(n) | np.isnan(N):
1907
+ return np.nan
1908
+ urn = self.dist(N, n, M, odds, 1e-12)
1909
+ return urn.probability(x)
1910
+
1911
+ return _pmf1(x, M, n, N, odds)
1912
+
1913
+ def _stats(self, M, n, N, odds, moments='mv'):
1914
+
1915
+ @np.vectorize
1916
+ def _moments1(M, n, N, odds):
1917
+ if np.isnan(M) | np.isnan(n) | np.isnan(N):
1918
+ return np.nan, np.nan
1919
+ urn = self.dist(N, n, M, odds, 1e-12)
1920
+ return urn.moments()
1921
+
1922
+ m, v = (_moments1(M, n, N, odds) if ("m" in moments or "v" in moments)
1923
+ else (None, None))
1924
+ s, k = None, None
1925
+ return m, v, s, k
1926
+
1927
+
1928
+ class nchypergeom_fisher_gen(_nchypergeom_gen):
1929
+ r"""A Fisher's noncentral hypergeometric discrete random variable.
1930
+
1931
+ Fisher's noncentral hypergeometric distribution models drawing objects of
1932
+ two types from a bin. `M` is the total number of objects, `n` is the
1933
+ number of Type I objects, and `odds` is the odds ratio: the odds of
1934
+ selecting a Type I object rather than a Type II object when there is only
1935
+ one object of each type.
1936
+ The random variate represents the number of Type I objects drawn if we
1937
+ take a handful of objects from the bin at once and find out afterwards
1938
+ that we took `N` objects.
1939
+
1940
+ %(before_notes)s
1941
+
1942
+ See Also
1943
+ --------
1944
+ nchypergeom_wallenius, hypergeom, nhypergeom
1945
+
1946
+ Notes
1947
+ -----
1948
+ Let mathematical symbols :math:`N`, :math:`n`, and :math:`M` correspond
1949
+ with parameters `N`, `n`, and `M` (respectively) as defined above.
1950
+
1951
+ The probability mass function is defined as
1952
+
1953
+ .. math::
1954
+
1955
+ p(x; M, n, N, \omega) =
1956
+ \frac{\binom{n}{x}\binom{M - n}{N-x}\omega^x}{P_0},
1957
+
1958
+ for
1959
+ :math:`x \in [x_l, x_u]`,
1960
+ :math:`M \in {\mathbb N}`,
1961
+ :math:`n \in [0, M]`,
1962
+ :math:`N \in [0, M]`,
1963
+ :math:`\omega > 0`,
1964
+ where
1965
+ :math:`x_l = \max(0, N - (M - n))`,
1966
+ :math:`x_u = \min(N, n)`,
1967
+
1968
+ .. math::
1969
+
1970
+ P_0 = \sum_{y=x_l}^{x_u} \binom{n}{y}\binom{M - n}{N-y}\omega^y,
1971
+
1972
+ and the binomial coefficients are defined as
1973
+
1974
+ .. math:: \binom{n}{k} \equiv \frac{n!}{k! (n - k)!}.
1975
+
1976
+ `nchypergeom_fisher` uses the BiasedUrn package by Agner Fog with
1977
+ permission for it to be distributed under SciPy's license.
1978
+
1979
+ The symbols used to denote the shape parameters (`N`, `n`, and `M`) are not
1980
+ universally accepted; they are chosen for consistency with `hypergeom`.
1981
+
1982
+ Note that Fisher's noncentral hypergeometric distribution is distinct
1983
+ from Wallenius' noncentral hypergeometric distribution, which models
1984
+ drawing a pre-determined `N` objects from a bin one by one.
1985
+ When the odds ratio is unity, however, both distributions reduce to the
1986
+ ordinary hypergeometric distribution.
1987
+
1988
+ %(after_notes)s
1989
+
1990
+ References
1991
+ ----------
1992
+ .. [1] Agner Fog, "Biased Urn Theory".
1993
+ https://cran.r-project.org/web/packages/BiasedUrn/vignettes/UrnTheory.pdf
1994
+
1995
+ .. [2] "Fisher's noncentral hypergeometric distribution", Wikipedia,
1996
+ https://en.wikipedia.org/wiki/Fisher's_noncentral_hypergeometric_distribution
1997
+
1998
+ %(example)s
1999
+
2000
+ """
2001
+
2002
+ rvs_name = "rvs_fisher"
2003
+ dist = _PyFishersNCHypergeometric
2004
+
2005
+
2006
+ nchypergeom_fisher = nchypergeom_fisher_gen(
2007
+ name='nchypergeom_fisher',
2008
+ longname="A Fisher's noncentral hypergeometric")
2009
+
2010
+
2011
+ class nchypergeom_wallenius_gen(_nchypergeom_gen):
2012
+ r"""A Wallenius' noncentral hypergeometric discrete random variable.
2013
+
2014
+ Wallenius' noncentral hypergeometric distribution models drawing objects of
2015
+ two types from a bin. `M` is the total number of objects, `n` is the
2016
+ number of Type I objects, and `odds` is the odds ratio: the odds of
2017
+ selecting a Type I object rather than a Type II object when there is only
2018
+ one object of each type.
2019
+ The random variate represents the number of Type I objects drawn if we
2020
+ draw a pre-determined `N` objects from a bin one by one.
2021
+
2022
+ %(before_notes)s
2023
+
2024
+ See Also
2025
+ --------
2026
+ nchypergeom_fisher, hypergeom, nhypergeom
2027
+
2028
+ Notes
2029
+ -----
2030
+ Let mathematical symbols :math:`N`, :math:`n`, and :math:`M` correspond
2031
+ with parameters `N`, `n`, and `M` (respectively) as defined above.
2032
+
2033
+ The probability mass function is defined as
2034
+
2035
+ .. math::
2036
+
2037
+ p(x; N, n, M) = \binom{n}{x} \binom{M - n}{N-x}
2038
+ \int_0^1 \left(1-t^{\omega/D}\right)^x\left(1-t^{1/D}\right)^{N-x} dt
2039
+
2040
+ for
2041
+ :math:`x \in [x_l, x_u]`,
2042
+ :math:`M \in {\mathbb N}`,
2043
+ :math:`n \in [0, M]`,
2044
+ :math:`N \in [0, M]`,
2045
+ :math:`\omega > 0`,
2046
+ where
2047
+ :math:`x_l = \max(0, N - (M - n))`,
2048
+ :math:`x_u = \min(N, n)`,
2049
+
2050
+ .. math::
2051
+
2052
+ D = \omega(n - x) + ((M - n)-(N-x)),
2053
+
2054
+ and the binomial coefficients are defined as
2055
+
2056
+ .. math:: \binom{n}{k} \equiv \frac{n!}{k! (n - k)!}.
2057
+
2058
+ `nchypergeom_wallenius` uses the BiasedUrn package by Agner Fog with
2059
+ permission for it to be distributed under SciPy's license.
2060
+
2061
+ The symbols used to denote the shape parameters (`N`, `n`, and `M`) are not
2062
+ universally accepted; they are chosen for consistency with `hypergeom`.
2063
+
2064
+ Note that Wallenius' noncentral hypergeometric distribution is distinct
2065
+ from Fisher's noncentral hypergeometric distribution, which models
2066
+ take a handful of objects from the bin at once, finding out afterwards
2067
+ that `N` objects were taken.
2068
+ When the odds ratio is unity, however, both distributions reduce to the
2069
+ ordinary hypergeometric distribution.
2070
+
2071
+ %(after_notes)s
2072
+
2073
+ References
2074
+ ----------
2075
+ .. [1] Agner Fog, "Biased Urn Theory".
2076
+ https://cran.r-project.org/web/packages/BiasedUrn/vignettes/UrnTheory.pdf
2077
+
2078
+ .. [2] "Wallenius' noncentral hypergeometric distribution", Wikipedia,
2079
+ https://en.wikipedia.org/wiki/Wallenius'_noncentral_hypergeometric_distribution
2080
+
2081
+ %(example)s
2082
+
2083
+ """
2084
+
2085
+ rvs_name = "rvs_wallenius"
2086
+ dist = _PyWalleniusNCHypergeometric
2087
+
2088
+
2089
+ nchypergeom_wallenius = nchypergeom_wallenius_gen(
2090
+ name='nchypergeom_wallenius',
2091
+ longname="A Wallenius' noncentral hypergeometric")
2092
+
2093
+
2094
+ # Collect names of classes and objects in this module.
2095
+ pairs = list(globals().copy().items())
2096
+ _distn_names, _distn_gen_names = get_distribution_names(pairs, rv_discrete)
2097
+
2098
+ __all__ = _distn_names + _distn_gen_names