scipy 1.16.2__cp312-cp312-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.cp312-win_arm64.lib +0 -0
  4. scipy/_cyutility.cp312-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.cp312-win_arm64.lib +0 -0
  13. scipy/_lib/_ccallback_c.cp312-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.cp312-win_arm64.lib +0 -0
  18. scipy/_lib/_fpumode.cp312-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.cp312-win_arm64.lib +0 -0
  23. scipy/_lib/_test_ccallback.cp312-win_arm64.pyd +0 -0
  24. scipy/_lib/_test_deprecation_call.cp312-win_arm64.lib +0 -0
  25. scipy/_lib/_test_deprecation_call.cp312-win_arm64.pyd +0 -0
  26. scipy/_lib/_test_deprecation_def.cp312-win_arm64.lib +0 -0
  27. scipy/_lib/_test_deprecation_def.cp312-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.cp312-win_arm64.lib +0 -0
  35. scipy/_lib/_uarray/_uarray.cp312-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.cp312-win_arm64.lib +0 -0
  101. scipy/_lib/messagestream.cp312-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.cp312-win_arm64.lib +0 -0
  148. scipy/cluster/_hierarchy.cp312-win_arm64.pyd +0 -0
  149. scipy/cluster/_optimal_leaf_ordering.cp312-win_arm64.lib +0 -0
  150. scipy/cluster/_optimal_leaf_ordering.cp312-win_arm64.pyd +0 -0
  151. scipy/cluster/_vq.cp312-win_arm64.lib +0 -0
  152. scipy/cluster/_vq.cp312-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.cp312-win_arm64.lib +0 -0
  193. scipy/fft/_pocketfft/pypocketfft.cp312-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.cp312-win_arm64.lib +0 -0
  215. scipy/fftpack/convolve.cp312-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.cp312-win_arm64.lib +0 -0
  233. scipy/integrate/_dop.cp312-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.cp312-win_arm64.lib +0 -0
  248. scipy/integrate/_lsoda.cp312-win_arm64.pyd +0 -0
  249. scipy/integrate/_ode.py +1395 -0
  250. scipy/integrate/_odepack.cp312-win_arm64.lib +0 -0
  251. scipy/integrate/_odepack.cp312-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.cp312-win_arm64.lib +0 -0
  255. scipy/integrate/_quadpack.cp312-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.cp312-win_arm64.lib +0 -0
  265. scipy/integrate/_test_multivariate.cp312-win_arm64.pyd +0 -0
  266. scipy/integrate/_test_odeint_banded.cp312-win_arm64.lib +0 -0
  267. scipy/integrate/_test_odeint_banded.cp312-win_arm64.pyd +0 -0
  268. scipy/integrate/_vode.cp312-win_arm64.lib +0 -0
  269. scipy/integrate/_vode.cp312-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.cp312-win_arm64.lib +0 -0
  290. scipy/interpolate/_dfitpack.cp312-win_arm64.pyd +0 -0
  291. scipy/interpolate/_dierckx.cp312-win_arm64.lib +0 -0
  292. scipy/interpolate/_dierckx.cp312-win_arm64.pyd +0 -0
  293. scipy/interpolate/_fitpack.cp312-win_arm64.lib +0 -0
  294. scipy/interpolate/_fitpack.cp312-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.cp312-win_arm64.lib +0 -0
  300. scipy/interpolate/_interpnd.cp312-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.cp312-win_arm64.lib +0 -0
  307. scipy/interpolate/_ppoly.cp312-win_arm64.pyd +0 -0
  308. scipy/interpolate/_rbf.py +290 -0
  309. scipy/interpolate/_rbfinterp.py +550 -0
  310. scipy/interpolate/_rbfinterp_pythran.cp312-win_arm64.lib +0 -0
  311. scipy/interpolate/_rbfinterp_pythran.cp312-win_arm64.pyd +0 -0
  312. scipy/interpolate/_rgi.py +764 -0
  313. scipy/interpolate/_rgi_cython.cp312-win_arm64.lib +0 -0
  314. scipy/interpolate/_rgi_cython.cp312-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.cp312-win_arm64.lib +0 -0
  343. scipy/io/_fast_matrix_market/_fmm_core.cp312-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.cp312-win_arm64.lib +0 -0
  355. scipy/io/_test_fortran.cp312-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.cp312-win_arm64.lib +0 -0
  386. scipy/io/matlab/_mio5_utils.cp312-win_arm64.pyd +0 -0
  387. scipy/io/matlab/_mio_utils.cp312-win_arm64.lib +0 -0
  388. scipy/io/matlab/_mio_utils.cp312-win_arm64.pyd +0 -0
  389. scipy/io/matlab/_miobase.py +435 -0
  390. scipy/io/matlab/_streams.cp312-win_arm64.lib +0 -0
  391. scipy/io/matlab/_streams.cp312-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.cp312-win_arm64.lib +0 -0
  623. scipy/linalg/_cythonized_array_utils.cp312-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.cp312-win_arm64.lib +0 -0
  630. scipy/linalg/_decomp_interpolative.cp312-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.cp312-win_arm64.lib +0 -0
  634. scipy/linalg/_decomp_lu_cython.cp312-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.cp312-win_arm64.lib +0 -0
  642. scipy/linalg/_decomp_update.cp312-win_arm64.pyd +0 -0
  643. scipy/linalg/_expm_frechet.py +417 -0
  644. scipy/linalg/_fblas.cp312-win_arm64.lib +0 -0
  645. scipy/linalg/_fblas.cp312-win_arm64.pyd +0 -0
  646. scipy/linalg/_flapack.cp312-win_arm64.lib +0 -0
  647. scipy/linalg/_flapack.cp312-win_arm64.pyd +0 -0
  648. scipy/linalg/_lapack_subroutines.h +1521 -0
  649. scipy/linalg/_linalg_pythran.cp312-win_arm64.lib +0 -0
  650. scipy/linalg/_linalg_pythran.cp312-win_arm64.pyd +0 -0
  651. scipy/linalg/_matfuncs.py +1050 -0
  652. scipy/linalg/_matfuncs_expm.cp312-win_arm64.lib +0 -0
  653. scipy/linalg/_matfuncs_expm.cp312-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.cp312-win_arm64.lib +0 -0
  657. scipy/linalg/_matfuncs_schur_sqrtm.cp312-win_arm64.pyd +0 -0
  658. scipy/linalg/_matfuncs_sqrtm.py +107 -0
  659. scipy/linalg/_matfuncs_sqrtm_triu.cp312-win_arm64.lib +0 -0
  660. scipy/linalg/_matfuncs_sqrtm_triu.cp312-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.cp312-win_arm64.lib +0 -0
  665. scipy/linalg/_solve_toeplitz.cp312-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.cp312-win_arm64.lib +0 -0
  672. scipy/linalg/cython_blas.cp312-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.cp312-win_arm64.lib +0 -0
  676. scipy/linalg/cython_lapack.cp312-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.cp312-win_arm64.lib +0 -0
  728. scipy/ndimage/_ctest.cp312-win_arm64.pyd +0 -0
  729. scipy/ndimage/_cytest.cp312-win_arm64.lib +0 -0
  730. scipy/ndimage/_cytest.cp312-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.cp312-win_arm64.lib +0 -0
  738. scipy/ndimage/_nd_image.cp312-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.cp312-win_arm64.lib +0 -0
  742. scipy/ndimage/_ni_label.cp312-win_arm64.pyd +0 -0
  743. scipy/ndimage/_ni_support.py +139 -0
  744. scipy/ndimage/_rank_filter_1d.cp312-win_arm64.lib +0 -0
  745. scipy/ndimage/_rank_filter_1d.cp312-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.cp312-win_arm64.lib +0 -0
  768. scipy/odr/__odrpack.cp312-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.cp312-win_arm64.lib +0 -0
  780. scipy/optimize/_bglu_dense.cp312-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.cp312-win_arm64.lib +0 -0
  790. scipy/optimize/_direct.cp312-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.cp312-win_arm64.lib +0 -0
  795. scipy/optimize/_group_columns.cp312-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.cp312-win_arm64.lib +0 -0
  799. scipy/optimize/_highspy/_core.cp312-win_arm64.pyd +0 -0
  800. scipy/optimize/_highspy/_highs_options.cp312-win_arm64.lib +0 -0
  801. scipy/optimize/_highspy/_highs_options.cp312-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.cp312-win_arm64.lib +0 -0
  805. scipy/optimize/_lbfgsb.cp312-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.cp312-win_arm64.lib +0 -0
  816. scipy/optimize/_lsap.cp312-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.cp312-win_arm64.lib +0 -0
  822. scipy/optimize/_lsq/givens_elimination.cp312-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.cp312-win_arm64.lib +0 -0
  830. scipy/optimize/_minpack.cp312-win_arm64.pyd +0 -0
  831. scipy/optimize/_minpack_py.py +1178 -0
  832. scipy/optimize/_moduleTNC.cp312-win_arm64.lib +0 -0
  833. scipy/optimize/_moduleTNC.cp312-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.cp312-win_arm64.lib +0 -0
  839. scipy/optimize/_pava_pybind.cp312-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.cp312-win_arm64.lib +0 -0
  850. scipy/optimize/_slsqplib.cp312-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.cp312-win_arm64.lib +0 -0
  855. scipy/optimize/_trlib/_trlib.cp312-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.cp312-win_arm64.lib +0 -0
  877. scipy/optimize/_zeros.cp312-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.cp312-win_arm64.lib +0 -0
  882. scipy/optimize/cython_optimize/_zeros.cp312-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.cp312-win_arm64.lib +0 -0
  953. scipy/signal/_max_len_seq_inner.cp312-win_arm64.pyd +0 -0
  954. scipy/signal/_peak_finding.py +1310 -0
  955. scipy/signal/_peak_finding_utils.cp312-win_arm64.lib +0 -0
  956. scipy/signal/_peak_finding_utils.cp312-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.cp312-win_arm64.lib +0 -0
  963. scipy/signal/_sigtools.cp312-win_arm64.pyd +0 -0
  964. scipy/signal/_sosfilt.cp312-win_arm64.lib +0 -0
  965. scipy/signal/_sosfilt.cp312-win_arm64.pyd +0 -0
  966. scipy/signal/_spectral_py.py +2471 -0
  967. scipy/signal/_spline.cp312-win_arm64.lib +0 -0
  968. scipy/signal/_spline.cp312-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.cp312-win_arm64.lib +0 -0
  974. scipy/signal/_upfirdn_apply.cp312-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.cp312-win_arm64.lib +0 -0
  1021. scipy/sparse/_csparsetools.cp312-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.cp312-win_arm64.lib +0 -0
  1032. scipy/sparse/_sparsetools.cp312-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.cp312-win_arm64.lib +0 -0
  1043. scipy/sparse/csgraph/_flow.cp312-win_arm64.pyd +0 -0
  1044. scipy/sparse/csgraph/_laplacian.py +563 -0
  1045. scipy/sparse/csgraph/_matching.cp312-win_arm64.lib +0 -0
  1046. scipy/sparse/csgraph/_matching.cp312-win_arm64.pyd +0 -0
  1047. scipy/sparse/csgraph/_min_spanning_tree.cp312-win_arm64.lib +0 -0
  1048. scipy/sparse/csgraph/_min_spanning_tree.cp312-win_arm64.pyd +0 -0
  1049. scipy/sparse/csgraph/_reordering.cp312-win_arm64.lib +0 -0
  1050. scipy/sparse/csgraph/_reordering.cp312-win_arm64.pyd +0 -0
  1051. scipy/sparse/csgraph/_shortest_path.cp312-win_arm64.lib +0 -0
  1052. scipy/sparse/csgraph/_shortest_path.cp312-win_arm64.pyd +0 -0
  1053. scipy/sparse/csgraph/_tools.cp312-win_arm64.lib +0 -0
  1054. scipy/sparse/csgraph/_tools.cp312-win_arm64.pyd +0 -0
  1055. scipy/sparse/csgraph/_traversal.cp312-win_arm64.lib +0 -0
  1056. scipy/sparse/csgraph/_traversal.cp312-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.cp312-win_arm64.lib +0 -0
  1079. scipy/sparse/linalg/_dsolve/_superlu.cp312-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.cp312-win_arm64.lib +0 -0
  1089. scipy/sparse/linalg/_eigen/arpack/_arpack.cp312-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.cp312-win_arm64.lib +0 -0
  1122. scipy/sparse/linalg/_propack/_cpropack.cp312-win_arm64.pyd +0 -0
  1123. scipy/sparse/linalg/_propack/_dpropack.cp312-win_arm64.lib +0 -0
  1124. scipy/sparse/linalg/_propack/_dpropack.cp312-win_arm64.pyd +0 -0
  1125. scipy/sparse/linalg/_propack/_spropack.cp312-win_arm64.lib +0 -0
  1126. scipy/sparse/linalg/_propack/_spropack.cp312-win_arm64.pyd +0 -0
  1127. scipy/sparse/linalg/_propack/_zpropack.cp312-win_arm64.lib +0 -0
  1128. scipy/sparse/linalg/_propack/_zpropack.cp312-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.cp312-win_arm64.lib +0 -0
  1170. scipy/spatial/_ckdtree.cp312-win_arm64.pyd +0 -0
  1171. scipy/spatial/_distance_pybind.cp312-win_arm64.lib +0 -0
  1172. scipy/spatial/_distance_pybind.cp312-win_arm64.pyd +0 -0
  1173. scipy/spatial/_distance_wrap.cp312-win_arm64.lib +0 -0
  1174. scipy/spatial/_distance_wrap.cp312-win_arm64.pyd +0 -0
  1175. scipy/spatial/_geometric_slerp.py +238 -0
  1176. scipy/spatial/_hausdorff.cp312-win_arm64.lib +0 -0
  1177. scipy/spatial/_hausdorff.cp312-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.cp312-win_arm64.lib +0 -0
  1182. scipy/spatial/_qhull.cp312-win_arm64.pyd +0 -0
  1183. scipy/spatial/_qhull.pyi +213 -0
  1184. scipy/spatial/_spherical_voronoi.py +341 -0
  1185. scipy/spatial/_voronoi.cp312-win_arm64.lib +0 -0
  1186. scipy/spatial/_voronoi.cp312-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.cp312-win_arm64.lib +0 -0
  1236. scipy/spatial/transform/_rigid_transform.cp312-win_arm64.pyd +0 -0
  1237. scipy/spatial/transform/_rotation.cp312-win_arm64.lib +0 -0
  1238. scipy/spatial/transform/_rotation.cp312-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.cp312-win_arm64.lib +0 -0
  1252. scipy/special/_comb.cp312-win_arm64.pyd +0 -0
  1253. scipy/special/_ellip_harm.py +214 -0
  1254. scipy/special/_ellip_harm_2.cp312-win_arm64.lib +0 -0
  1255. scipy/special/_ellip_harm_2.cp312-win_arm64.pyd +0 -0
  1256. scipy/special/_gufuncs.cp312-win_arm64.lib +0 -0
  1257. scipy/special/_gufuncs.cp312-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.cp312-win_arm64.lib +0 -0
  1281. scipy/special/_specfun.cp312-win_arm64.pyd +0 -0
  1282. scipy/special/_special_ufuncs.cp312-win_arm64.lib +0 -0
  1283. scipy/special/_special_ufuncs.cp312-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.cp312-win_arm64.lib +0 -0
  1288. scipy/special/_test_internal.cp312-win_arm64.pyd +0 -0
  1289. scipy/special/_test_internal.pyi +9 -0
  1290. scipy/special/_testutils.py +321 -0
  1291. scipy/special/_ufuncs.cp312-win_arm64.lib +0 -0
  1292. scipy/special/_ufuncs.cp312-win_arm64.pyd +0 -0
  1293. scipy/special/_ufuncs.pyi +522 -0
  1294. scipy/special/_ufuncs.pyx +13173 -0
  1295. scipy/special/_ufuncs_cxx.cp312-win_arm64.lib +0 -0
  1296. scipy/special/_ufuncs_cxx.cp312-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.cp312-win_arm64.lib +0 -0
  1304. scipy/special/cython_special.cp312-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.cp312-win_arm64.lib +0 -0
  1376. scipy/stats/_ansari_swilk_statistics.cp312-win_arm64.pyd +0 -0
  1377. scipy/stats/_axis_nan_policy.py +692 -0
  1378. scipy/stats/_biasedurn.cp312-win_arm64.lib +0 -0
  1379. scipy/stats/_biasedurn.cp312-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.cp312-win_arm64.lib +0 -0
  1404. scipy/stats/_levy_stable/levyst.cp312-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.cp312-win_arm64.lib +0 -0
  1418. scipy/stats/_qmc_cy.cp312-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.cp312-win_arm64.lib +0 -0
  1422. scipy/stats/_qmvnt_cy.cp312-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.cp312-win_arm64.lib +0 -0
  1426. scipy/stats/_rcont/rcont.cp312-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.cp312-win_arm64.lib +0 -0
  1433. scipy/stats/_sobol.cp312-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.cp312-win_arm64.lib +0 -0
  1437. scipy/stats/_stats.cp312-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.cp312-win_arm64.lib +0 -0
  1442. scipy/stats/_stats_pythran.cp312-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.cp312-win_arm64.lib +0 -0
  1447. scipy/stats/_unuran/unuran_wrapper.cp312-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,1314 @@
1
+ import math
2
+ import numbers
3
+ import numpy as np
4
+ from scipy import stats
5
+ from scipy import special as sc
6
+ from ._qmc import (check_random_state as check_random_state_qmc,
7
+ Halton, QMCEngine)
8
+ from ._unuran.unuran_wrapper import NumericalInversePolynomial
9
+ from scipy._lib._util import check_random_state
10
+
11
+
12
+ __all__ = ['FastGeneratorInversion', 'RatioUniforms']
13
+
14
+
15
+ # define pdfs and other helper functions to create the generators
16
+
17
+ def argus_pdf(x, chi):
18
+ # approach follows Baumgarten/Hoermann: Generating ARGUS random variates
19
+ # for chi > 5, use relationship of the ARGUS distribution to Gamma(1.5)
20
+ if chi <= 5:
21
+ y = 1 - x * x
22
+ return x * math.sqrt(y) * math.exp(-0.5 * chi**2 * y)
23
+ return math.sqrt(x) * math.exp(-x)
24
+
25
+
26
+ def argus_gamma_trf(x, chi):
27
+ if chi <= 5:
28
+ return x
29
+ return np.sqrt(1.0 - 2 * x / chi**2)
30
+
31
+
32
+ def argus_gamma_inv_trf(x, chi):
33
+ if chi <= 5:
34
+ return x
35
+ return 0.5 * chi**2 * (1 - x**2)
36
+
37
+
38
+ def betaprime_pdf(x, a, b):
39
+ if x > 0:
40
+ logf = (a - 1) * math.log(x) - (a + b) * math.log1p(x) - sc.betaln(a, b)
41
+ return math.exp(logf)
42
+ else:
43
+ # return pdf at x == 0 separately to avoid runtime warnings
44
+ if a > 1:
45
+ return 0
46
+ elif a < 1:
47
+ return np.inf
48
+ else:
49
+ return 1 / sc.beta(a, b)
50
+
51
+
52
+ def beta_valid_params(a, b):
53
+ return (min(a, b) >= 0.1) and (max(a, b) <= 700)
54
+
55
+
56
+ def gamma_pdf(x, a):
57
+ if x > 0:
58
+ return math.exp(-math.lgamma(a) + (a - 1.0) * math.log(x) - x)
59
+ else:
60
+ return 0 if a >= 1 else np.inf
61
+
62
+
63
+ def invgamma_pdf(x, a):
64
+ if x > 0:
65
+ return math.exp(-(a + 1.0) * math.log(x) - math.lgamma(a) - 1 / x)
66
+ else:
67
+ return 0 if a >= 1 else np.inf
68
+
69
+
70
+ def burr_pdf(x, cc, dd):
71
+ # note: we use np.exp instead of math.exp, otherwise an overflow
72
+ # error can occur in the setup, e.g., for parameters
73
+ # 1.89128135, 0.30195177, see test test_burr_overflow
74
+ if x > 0:
75
+ lx = math.log(x)
76
+ return np.exp(-(cc + 1) * lx - (dd + 1) * math.log1p(np.exp(-cc * lx)))
77
+ else:
78
+ return 0
79
+
80
+
81
+ def burr12_pdf(x, cc, dd):
82
+ if x > 0:
83
+ lx = math.log(x)
84
+ logterm = math.log1p(math.exp(cc * lx))
85
+ return math.exp((cc - 1) * lx - (dd + 1) * logterm + math.log(cc * dd))
86
+ else:
87
+ return 0
88
+
89
+
90
+ def chi_pdf(x, a):
91
+ if x > 0:
92
+ return math.exp(
93
+ (a - 1) * math.log(x)
94
+ - 0.5 * (x * x)
95
+ - (a / 2 - 1) * math.log(2)
96
+ - math.lgamma(0.5 * a)
97
+ )
98
+ else:
99
+ return 0 if a >= 1 else np.inf
100
+
101
+
102
+ def chi2_pdf(x, df):
103
+ if x > 0:
104
+ return math.exp(
105
+ (df / 2 - 1) * math.log(x)
106
+ - 0.5 * x
107
+ - (df / 2) * math.log(2)
108
+ - math.lgamma(0.5 * df)
109
+ )
110
+ else:
111
+ return 0 if df >= 1 else np.inf
112
+
113
+
114
+ def alpha_pdf(x, a):
115
+ if x > 0:
116
+ return math.exp(-2.0 * math.log(x) - 0.5 * (a - 1.0 / x) ** 2)
117
+ return 0.0
118
+
119
+
120
+ def bradford_pdf(x, c):
121
+ if 0 <= x <= 1:
122
+ return 1.0 / (1.0 + c * x)
123
+ return 0.0
124
+
125
+
126
+ def crystalball_pdf(x, b, m):
127
+ if x > -b:
128
+ return math.exp(-0.5 * x * x)
129
+ return math.exp(m * math.log(m / b) - 0.5 * b * b - m * math.log(m / b - b - x))
130
+
131
+
132
+ def weibull_min_pdf(x, c):
133
+ if x > 0:
134
+ return c * math.exp((c - 1) * math.log(x) - x**c)
135
+ return 0.0
136
+
137
+
138
+ def weibull_max_pdf(x, c):
139
+ if x < 0:
140
+ return c * math.exp((c - 1) * math.log(-x) - ((-x) ** c))
141
+ return 0.0
142
+
143
+
144
+ def invweibull_pdf(x, c):
145
+ if x > 0:
146
+ return c * math.exp(-(c + 1) * math.log(x) - x ** (-c))
147
+ return 0.0
148
+
149
+
150
+ def wald_pdf(x):
151
+ if x > 0:
152
+ return math.exp(-((x - 1) ** 2) / (2 * x)) / math.sqrt(x**3)
153
+ return 0.0
154
+
155
+
156
+ def geninvgauss_mode(p, b):
157
+ if p > 1: # equivalent mode formulas numerical more stable versions
158
+ return (math.sqrt((1 - p) ** 2 + b**2) - (1 - p)) / b
159
+ return b / (math.sqrt((1 - p) ** 2 + b**2) + (1 - p))
160
+
161
+
162
+ def geninvgauss_pdf(x, p, b):
163
+ m = geninvgauss_mode(p, b)
164
+ lfm = (p - 1) * math.log(m) - 0.5 * b * (m + 1 / m)
165
+ if x > 0:
166
+ return math.exp((p - 1) * math.log(x) - 0.5 * b * (x + 1 / x) - lfm)
167
+ return 0.0
168
+
169
+
170
+ def invgauss_mode(mu):
171
+ return 1.0 / (math.sqrt(1.5 * 1.5 + 1 / (mu * mu)) + 1.5)
172
+
173
+
174
+ def invgauss_pdf(x, mu):
175
+ m = invgauss_mode(mu)
176
+ lfm = -1.5 * math.log(m) - (m - mu) ** 2 / (2 * m * mu**2)
177
+ if x > 0:
178
+ return math.exp(-1.5 * math.log(x) - (x - mu) ** 2 / (2 * x * mu**2) - lfm)
179
+ return 0.0
180
+
181
+
182
+ def powerlaw_pdf(x, a):
183
+ if x > 0:
184
+ return x ** (a - 1)
185
+ return 0.0
186
+
187
+
188
+ # Define a dictionary: for a given distribution (keys), another dictionary
189
+ # (values) specifies the parameters for NumericalInversePolynomial (PINV).
190
+ # The keys of the latter dictionary are:
191
+ # - pdf: the pdf of the distribution (callable). The signature of the pdf
192
+ # is float -> float (i.e., the function does not have to be vectorized).
193
+ # If possible, functions like log or exp from the module math should be
194
+ # preferred over functions from numpy since the PINV setup will be faster
195
+ # in that case.
196
+ # - check_pinv_params: callable f that returns true if the shape parameters
197
+ # (args) are recommended parameters for PINV (i.e., the u-error does
198
+ # not exceed the default tolerance)
199
+ # - center: scalar if the center does not depend on args, otherwise
200
+ # callable that returns the center as a function of the shape parameters
201
+ # - rvs_transform: a callable that can be used to transform the rvs that
202
+ # are distributed according to the pdf to the target distribution
203
+ # (as an example, see the entry for the beta distribution)
204
+ # - rvs_transform_inv: the inverse of rvs_transform (it is required
205
+ # for the transformed ppf)
206
+ # - mirror_uniform: boolean or a callable that returns true or false
207
+ # depending on the shape parameters. If True, the ppf is applied
208
+ # to 1-u instead of u to generate rvs, where u is a uniform rv.
209
+ # While both u and 1-u are uniform, it can be required to use 1-u
210
+ # to compute the u-error correctly. This is only relevant for the argus
211
+ # distribution.
212
+ # The only required keys are "pdf" and "check_pinv_params".
213
+ # All other keys are optional.
214
+
215
+ PINV_CONFIG = {
216
+ "alpha": {
217
+ "pdf": alpha_pdf,
218
+ "check_pinv_params": lambda a: 1.0e-11 <= a < 2.1e5,
219
+ "center": lambda a: 0.25 * (math.sqrt(a * a + 8.0) - a),
220
+ },
221
+ "anglit": {
222
+ "pdf": lambda x: math.cos(2 * x) + 1.0e-13,
223
+ # +1.e-13 is necessary, otherwise PINV has strange problems as
224
+ # f(upper border) is very close to 0
225
+ "center": 0,
226
+ },
227
+ "argus": {
228
+ "pdf": argus_pdf,
229
+ "center": lambda chi: 0.7 if chi <= 5 else 0.5,
230
+ "check_pinv_params": lambda chi: 1e-20 < chi < 901,
231
+ "rvs_transform": argus_gamma_trf,
232
+ "rvs_transform_inv": argus_gamma_inv_trf,
233
+ "mirror_uniform": lambda chi: chi > 5,
234
+ },
235
+ "beta": {
236
+ "pdf": betaprime_pdf,
237
+ "center": lambda a, b: max(0.1, (a - 1) / (b + 1)),
238
+ "check_pinv_params": beta_valid_params,
239
+ "rvs_transform": lambda x, *args: x / (1 + x),
240
+ "rvs_transform_inv": lambda x, *args: x / (1 - x) if x < 1 else np.inf,
241
+ },
242
+ "betaprime": {
243
+ "pdf": betaprime_pdf,
244
+ "center": lambda a, b: max(0.1, (a - 1) / (b + 1)),
245
+ "check_pinv_params": beta_valid_params,
246
+ },
247
+ "bradford": {
248
+ "pdf": bradford_pdf,
249
+ "check_pinv_params": lambda a: 1.0e-6 <= a <= 1e9,
250
+ "center": 0.5,
251
+ },
252
+ "burr": {
253
+ "pdf": burr_pdf,
254
+ "center": lambda a, b: (2 ** (1 / b) - 1) ** (-1 / a),
255
+ "check_pinv_params": lambda a, b: (min(a, b) >= 0.3) and (max(a, b) <= 50),
256
+ },
257
+ "burr12": {
258
+ "pdf": burr12_pdf,
259
+ "center": lambda a, b: (2 ** (1 / b) - 1) ** (1 / a),
260
+ "check_pinv_params": lambda a, b: (min(a, b) >= 0.2) and (max(a, b) <= 50),
261
+ },
262
+ "cauchy": {
263
+ "pdf": lambda x: 1 / (1 + (x * x)),
264
+ "center": 0,
265
+ },
266
+ "chi": {
267
+ "pdf": chi_pdf,
268
+ "check_pinv_params": lambda df: 0.05 <= df <= 1.0e6,
269
+ "center": lambda a: math.sqrt(a),
270
+ },
271
+ "chi2": {
272
+ "pdf": chi2_pdf,
273
+ "check_pinv_params": lambda df: 0.07 <= df <= 1e6,
274
+ "center": lambda a: a,
275
+ },
276
+ "cosine": {
277
+ "pdf": lambda x: 1 + math.cos(x),
278
+ "center": 0,
279
+ },
280
+ "crystalball": {
281
+ "pdf": crystalball_pdf,
282
+ "check_pinv_params": lambda b, m: (0.01 <= b <= 5.5)
283
+ and (1.1 <= m <= 75.1),
284
+ "center": 0.0,
285
+ },
286
+ "expon": {
287
+ "pdf": lambda x: math.exp(-x),
288
+ "center": 1.0,
289
+ },
290
+ "gamma": {
291
+ "pdf": gamma_pdf,
292
+ "check_pinv_params": lambda a: 0.04 <= a <= 1e6,
293
+ "center": lambda a: a,
294
+ },
295
+ "gennorm": {
296
+ "pdf": lambda x, b: math.exp(-abs(x) ** b),
297
+ "check_pinv_params": lambda b: 0.081 <= b <= 45.0,
298
+ "center": 0.0,
299
+ },
300
+ "geninvgauss": {
301
+ "pdf": geninvgauss_pdf,
302
+ "check_pinv_params": lambda p, b: (abs(p) <= 1200.0)
303
+ and (1.0e-10 <= b <= 1200.0),
304
+ "center": geninvgauss_mode,
305
+ },
306
+ "gumbel_l": {
307
+ "pdf": lambda x: math.exp(x - math.exp(x)),
308
+ "center": -0.6,
309
+ },
310
+ "gumbel_r": {
311
+ "pdf": lambda x: math.exp(-x - math.exp(-x)),
312
+ "center": 0.6,
313
+ },
314
+ "hypsecant": {
315
+ "pdf": lambda x: 1.0 / (math.exp(x) + math.exp(-x)),
316
+ "center": 0.0,
317
+ },
318
+ "invgamma": {
319
+ "pdf": invgamma_pdf,
320
+ "check_pinv_params": lambda a: 0.04 <= a <= 1e6,
321
+ "center": lambda a: 1 / a,
322
+ },
323
+ "invgauss": {
324
+ "pdf": invgauss_pdf,
325
+ "check_pinv_params": lambda mu: 1.0e-10 <= mu <= 1.0e9,
326
+ "center": invgauss_mode,
327
+ },
328
+ "invweibull": {
329
+ "pdf": invweibull_pdf,
330
+ "check_pinv_params": lambda a: 0.12 <= a <= 512,
331
+ "center": 1.0,
332
+ },
333
+ "laplace": {
334
+ "pdf": lambda x: math.exp(-abs(x)),
335
+ "center": 0.0,
336
+ },
337
+ "logistic": {
338
+ "pdf": lambda x: math.exp(-x) / (1 + math.exp(-x)) ** 2,
339
+ "center": 0.0,
340
+ },
341
+ "maxwell": {
342
+ "pdf": lambda x: x * x * math.exp(-0.5 * x * x),
343
+ "center": 1.41421,
344
+ },
345
+ "moyal": {
346
+ "pdf": lambda x: math.exp(-(x + math.exp(-x)) / 2),
347
+ "center": 1.2,
348
+ },
349
+ "norm": {
350
+ "pdf": lambda x: math.exp(-x * x / 2),
351
+ "center": 0.0,
352
+ },
353
+ "pareto": {
354
+ "pdf": lambda x, b: x ** -(b + 1),
355
+ "center": lambda b: b / (b - 1) if b > 2 else 1.5,
356
+ "check_pinv_params": lambda b: 0.08 <= b <= 400000,
357
+ },
358
+ "powerlaw": {
359
+ "pdf": powerlaw_pdf,
360
+ "center": 1.0,
361
+ "check_pinv_params": lambda a: 0.06 <= a <= 1.0e5,
362
+ },
363
+ "t": {
364
+ "pdf": lambda x, df: (1 + x * x / df) ** (-0.5 * (df + 1)),
365
+ "check_pinv_params": lambda a: 0.07 <= a <= 1e6,
366
+ "center": 0.0,
367
+ },
368
+ "rayleigh": {
369
+ "pdf": lambda x: x * math.exp(-0.5 * (x * x)),
370
+ "center": 1.0,
371
+ },
372
+ "semicircular": {
373
+ "pdf": lambda x: math.sqrt(1.0 - (x * x)),
374
+ "center": 0,
375
+ },
376
+ "wald": {
377
+ "pdf": wald_pdf,
378
+ "center": 1.0,
379
+ },
380
+ "weibull_max": {
381
+ "pdf": weibull_max_pdf,
382
+ "check_pinv_params": lambda a: 0.25 <= a <= 512,
383
+ "center": -1.0,
384
+ },
385
+ "weibull_min": {
386
+ "pdf": weibull_min_pdf,
387
+ "check_pinv_params": lambda a: 0.25 <= a <= 512,
388
+ "center": 1.0,
389
+ },
390
+ }
391
+
392
+
393
+ def _validate_qmc_input(qmc_engine, d, seed):
394
+ # Input validation for `qmc_engine` and `d`
395
+ # Error messages for invalid `d` are raised by QMCEngine
396
+ # we could probably use a stats.qmc.check_qrandom_state
397
+ if isinstance(qmc_engine, QMCEngine):
398
+ if d is not None and qmc_engine.d != d:
399
+ message = "`d` must be consistent with dimension of `qmc_engine`."
400
+ raise ValueError(message)
401
+ d = qmc_engine.d if d is None else d
402
+ elif qmc_engine is None:
403
+ d = 1 if d is None else d
404
+ qmc_engine = Halton(d, seed=seed)
405
+ else:
406
+ message = (
407
+ "`qmc_engine` must be an instance of "
408
+ "`scipy.stats.qmc.QMCEngine` or `None`."
409
+ )
410
+ raise ValueError(message)
411
+
412
+ return qmc_engine, d
413
+
414
+
415
+ class CustomDistPINV:
416
+ def __init__(self, pdf, args):
417
+ self._pdf = lambda x: pdf(x, *args)
418
+
419
+ def pdf(self, x):
420
+ return self._pdf(x)
421
+
422
+
423
+ class FastGeneratorInversion:
424
+ """
425
+ Fast sampling by numerical inversion of the CDF for a large class of
426
+ continuous distributions in `scipy.stats`.
427
+
428
+ Parameters
429
+ ----------
430
+ dist : rv_frozen object
431
+ Frozen distribution object from `scipy.stats`. The list of supported
432
+ distributions can be found in the Notes section. The shape parameters,
433
+ `loc` and `scale` used to create the distributions must be scalars.
434
+ For example, for the Gamma distribution with shape parameter `p`,
435
+ `p` has to be a float, and for the beta distribution with shape
436
+ parameters (a, b), both a and b have to be floats.
437
+ domain : tuple of floats, optional
438
+ If one wishes to sample from a truncated/conditional distribution,
439
+ the domain has to be specified.
440
+ The default is None. In that case, the random variates are not
441
+ truncated, and the domain is inferred from the support of the
442
+ distribution.
443
+ ignore_shape_range : boolean, optional.
444
+ If False, shape parameters that are outside of the valid range
445
+ of values to ensure that the numerical accuracy (see Notes) is
446
+ high, raise a ValueError. If True, any shape parameters that are valid
447
+ for the distribution are accepted. This can be useful for testing.
448
+ The default is False.
449
+ random_state : {None, int, `numpy.random.Generator`,
450
+ `numpy.random.RandomState`}, optional
451
+
452
+ A NumPy random number generator or seed for the underlying NumPy
453
+ random number generator used to generate the stream of uniform
454
+ random numbers.
455
+ If `random_state` is None, it uses ``self.random_state``.
456
+ If `random_state` is an int,
457
+ ``np.random.default_rng(random_state)`` is used.
458
+ If `random_state` is already a ``Generator`` or ``RandomState``
459
+ instance then that instance is used.
460
+
461
+ Attributes
462
+ ----------
463
+ loc : float
464
+ The location parameter.
465
+ random_state : {`numpy.random.Generator`, `numpy.random.RandomState`}
466
+ The random state used in relevant methods like `rvs` (unless
467
+ another `random_state` is passed as an argument to these methods).
468
+ scale : float
469
+ The scale parameter.
470
+
471
+ Methods
472
+ -------
473
+ cdf
474
+ evaluate_error
475
+ ppf
476
+ qrvs
477
+ rvs
478
+ support
479
+
480
+ Notes
481
+ -----
482
+ The class creates an object for continuous distributions specified
483
+ by `dist`. The method `rvs` uses a generator from
484
+ `scipy.stats.sampling` that is created when the object is instantiated.
485
+ In addition, the methods `qrvs` and `ppf` are added.
486
+ `qrvs` generate samples based on quasi-random numbers from
487
+ `scipy.stats.qmc`. `ppf` is the PPF based on the
488
+ numerical inversion method in [1]_ (`NumericalInversePolynomial`) that is
489
+ used to generate random variates.
490
+
491
+ Supported distributions (`distname`) are:
492
+ ``alpha``, ``anglit``, ``argus``, ``beta``, ``betaprime``, ``bradford``,
493
+ ``burr``, ``burr12``, ``cauchy``, ``chi``, ``chi2``, ``cosine``,
494
+ ``crystalball``, ``expon``, ``gamma``, ``gennorm``, ``geninvgauss``,
495
+ ``gumbel_l``, ``gumbel_r``, ``hypsecant``, ``invgamma``, ``invgauss``,
496
+ ``invweibull``, ``laplace``, ``logistic``, ``maxwell``, ``moyal``,
497
+ ``norm``, ``pareto``, ``powerlaw``, ``t``, ``rayleigh``, ``semicircular``,
498
+ ``wald``, ``weibull_max``, ``weibull_min``.
499
+
500
+ `rvs` relies on the accuracy of the numerical inversion. If very extreme
501
+ shape parameters are used, the numerical inversion might not work. However,
502
+ for all implemented distributions, the admissible shape parameters have
503
+ been tested, and an error will be raised if the user supplies values
504
+ outside of the allowed range. The u-error should not exceed 1e-10 for all
505
+ valid parameters. Note that warnings might be raised even if parameters
506
+ are within the valid range when the object is instantiated.
507
+ To check numerical accuracy, the method `evaluate_error` can be used.
508
+
509
+ Note that all implemented distributions are also part of `scipy.stats`, and
510
+ the object created by `FastGeneratorInversion` relies on methods like
511
+ `ppf`, `cdf` and `pdf` from `rv_frozen`. The main benefit of using this
512
+ class can be summarized as follows: Once the generator to sample random
513
+ variates is created in the setup step, sampling and evaluation of
514
+ the PPF using `ppf` are very fast,
515
+ and performance is essentially independent of the distribution. Therefore,
516
+ a substantial speed-up can be achieved for many distributions if large
517
+ numbers of random variates are required. It is important to know that this
518
+ fast sampling is achieved by inversion of the CDF. Thus, one uniform
519
+ random variate is transformed into a non-uniform variate, which is an
520
+ advantage for several simulation methods, e.g., when
521
+ the variance reduction methods of common random variates or
522
+ antithetic variates are be used ([2]_).
523
+
524
+ In addition, inversion makes it possible to
525
+ - to use a QMC generator from `scipy.stats.qmc` (method `qrvs`),
526
+ - to generate random variates truncated to an interval. For example, if
527
+ one aims to sample standard normal random variates from
528
+ the interval (2, 4), this can be easily achieved by using the parameter
529
+ `domain`.
530
+
531
+ The location and scale that are initially defined by `dist`
532
+ can be reset without having to rerun the setup
533
+ step to create the generator that is used for sampling. The relation
534
+ of the distribution `Y` with `loc` and `scale` to the standard
535
+ distribution `X` (i.e., ``loc=0`` and ``scale=1``) is given by
536
+ ``Y = loc + scale * X``.
537
+
538
+ References
539
+ ----------
540
+ .. [1] Derflinger, Gerhard, Wolfgang Hörmann, and Josef Leydold.
541
+ "Random variate generation by numerical inversion when only the
542
+ density is known." ACM Transactions on Modeling and Computer
543
+ Simulation (TOMACS) 20.4 (2010): 1-25.
544
+ .. [2] Hörmann, Wolfgang, Josef Leydold and Gerhard Derflinger.
545
+ "Automatic nonuniform random number generation."
546
+ Springer, 2004.
547
+
548
+ Examples
549
+ --------
550
+ >>> import numpy as np
551
+ >>> from scipy import stats
552
+ >>> from scipy.stats.sampling import FastGeneratorInversion
553
+
554
+ Let's start with a simple example to illustrate the main features:
555
+
556
+ >>> gamma_frozen = stats.gamma(1.5)
557
+ >>> gamma_dist = FastGeneratorInversion(gamma_frozen)
558
+ >>> r = gamma_dist.rvs(size=1000)
559
+
560
+ The mean should be approximately equal to the shape parameter 1.5:
561
+
562
+ >>> r.mean()
563
+ 1.52423591130436 # may vary
564
+
565
+ Similarly, we can draw a sample based on quasi-random numbers:
566
+
567
+ >>> r = gamma_dist.qrvs(size=1000)
568
+ >>> r.mean()
569
+ 1.4996639255942914 # may vary
570
+
571
+ Compare the PPF against approximation `ppf`.
572
+
573
+ >>> q = [0.001, 0.2, 0.5, 0.8, 0.999]
574
+ >>> np.max(np.abs(gamma_frozen.ppf(q) - gamma_dist.ppf(q)))
575
+ 4.313394796895409e-08
576
+
577
+ To confirm that the numerical inversion is accurate, we evaluate the
578
+ approximation error (u-error), which should be below 1e-10 (for more
579
+ details, refer to the documentation of `evaluate_error`):
580
+
581
+ >>> gamma_dist.evaluate_error()
582
+ (7.446320551265581e-11, nan) # may vary
583
+
584
+ Note that the location and scale can be changed without instantiating a
585
+ new generator:
586
+
587
+ >>> gamma_dist.loc = 2
588
+ >>> gamma_dist.scale = 3
589
+ >>> r = gamma_dist.rvs(size=1000)
590
+
591
+ The mean should be approximately 2 + 3*1.5 = 6.5.
592
+
593
+ >>> r.mean()
594
+ 6.399549295242894 # may vary
595
+
596
+ Let us also illustrate how truncation can be applied:
597
+
598
+ >>> trunc_norm = FastGeneratorInversion(stats.norm(), domain=(3, 4))
599
+ >>> r = trunc_norm.rvs(size=1000)
600
+ >>> 3 < r.min() < r.max() < 4
601
+ True
602
+
603
+ Check the mean:
604
+
605
+ >>> r.mean()
606
+ 3.250433367078603 # may vary
607
+
608
+ >>> stats.norm.expect(lb=3, ub=4, conditional=True)
609
+ 3.260454285589997
610
+
611
+ In this particular, case, `scipy.stats.truncnorm` could also be used to
612
+ generate truncated normal random variates.
613
+
614
+ """
615
+
616
+ def __init__(
617
+ self,
618
+ dist,
619
+ *,
620
+ domain=None,
621
+ ignore_shape_range=False,
622
+ random_state=None,
623
+ ):
624
+
625
+ if isinstance(dist, stats.distributions.rv_frozen):
626
+ distname = dist.dist.name
627
+ if distname not in PINV_CONFIG.keys():
628
+ raise ValueError(
629
+ f"Distribution '{distname}' is not supported."
630
+ f"It must be one of {list(PINV_CONFIG.keys())}"
631
+ )
632
+ else:
633
+ raise ValueError("`dist` must be a frozen distribution object")
634
+
635
+ loc = dist.kwds.get("loc", 0)
636
+ scale = dist.kwds.get("scale", 1)
637
+ args = dist.args
638
+ if not np.isscalar(loc):
639
+ raise ValueError("loc must be scalar.")
640
+ if not np.isscalar(scale):
641
+ raise ValueError("scale must be scalar.")
642
+
643
+ self._frozendist = getattr(stats, distname)(
644
+ *args,
645
+ loc=loc,
646
+ scale=scale,
647
+ )
648
+ self._distname = distname
649
+
650
+ nargs = np.broadcast_arrays(args)[0].size
651
+ nargs_expected = self._frozendist.dist.numargs
652
+ if nargs != nargs_expected:
653
+ raise ValueError(
654
+ f"Each of the {nargs_expected} shape parameters must be a "
655
+ f"scalar, but {nargs} values are provided."
656
+ )
657
+
658
+ self.random_state = random_state
659
+
660
+ if domain is None:
661
+ self._domain = self._frozendist.support()
662
+ self._p_lower = 0.0
663
+ self._p_domain = 1.0
664
+ else:
665
+ self._domain = domain
666
+ self._p_lower = self._frozendist.cdf(self._domain[0])
667
+ _p_domain = self._frozendist.cdf(self._domain[1]) - self._p_lower
668
+ self._p_domain = _p_domain
669
+ self._set_domain_adj()
670
+ self._ignore_shape_range = ignore_shape_range
671
+
672
+ # the domain to be passed to NumericalInversePolynomial
673
+ # define a separate variable since in case of a transformation,
674
+ # domain_pinv will not be the same as self._domain
675
+ self._domain_pinv = self._domain
676
+
677
+ # get information about the distribution from the config to set up
678
+ # the generator
679
+ dist = self._process_config(distname, args)
680
+
681
+ if self._rvs_transform_inv is not None:
682
+ d0 = self._rvs_transform_inv(self._domain[0], *args)
683
+ d1 = self._rvs_transform_inv(self._domain[1], *args)
684
+ if d0 > d1:
685
+ # swap values if transformation if decreasing
686
+ d0, d1 = d1, d0
687
+ # only update _domain_pinv and not _domain
688
+ # _domain refers to the original distribution, _domain_pinv
689
+ # to the transformed distribution
690
+ self._domain_pinv = d0, d1
691
+
692
+ # self._center has been set by the call self._process_config
693
+ # check if self._center is inside the transformed domain
694
+ # _domain_pinv, otherwise move it to the endpoint that is closer
695
+ if self._center is not None:
696
+ if self._center < self._domain_pinv[0]:
697
+ self._center = self._domain_pinv[0]
698
+ elif self._center > self._domain_pinv[1]:
699
+ self._center = self._domain_pinv[1]
700
+
701
+ self._rng = NumericalInversePolynomial(
702
+ dist,
703
+ random_state=self.random_state,
704
+ domain=self._domain_pinv,
705
+ center=self._center,
706
+ )
707
+
708
+ @property
709
+ def random_state(self):
710
+ return self._random_state
711
+
712
+ @random_state.setter
713
+ def random_state(self, random_state):
714
+ self._random_state = check_random_state_qmc(random_state)
715
+
716
+ @property
717
+ def loc(self):
718
+ return self._frozendist.kwds.get("loc", 0)
719
+
720
+ @loc.setter
721
+ def loc(self, loc):
722
+ if not np.isscalar(loc):
723
+ raise ValueError("loc must be scalar.")
724
+ self._frozendist.kwds["loc"] = loc
725
+ # update the adjusted domain that depends on loc and scale
726
+ self._set_domain_adj()
727
+
728
+ @property
729
+ def scale(self):
730
+ return self._frozendist.kwds.get("scale", 0)
731
+
732
+ @scale.setter
733
+ def scale(self, scale):
734
+ if not np.isscalar(scale):
735
+ raise ValueError("scale must be scalar.")
736
+ self._frozendist.kwds["scale"] = scale
737
+ # update the adjusted domain that depends on loc and scale
738
+ self._set_domain_adj()
739
+
740
+ def _set_domain_adj(self):
741
+ """ Adjust the domain based on loc and scale. """
742
+ loc = self.loc
743
+ scale = self.scale
744
+ lb = self._domain[0] * scale + loc
745
+ ub = self._domain[1] * scale + loc
746
+ self._domain_adj = (lb, ub)
747
+
748
+ def _process_config(self, distname, args):
749
+ cfg = PINV_CONFIG[distname]
750
+ if "check_pinv_params" in cfg:
751
+ if not self._ignore_shape_range:
752
+ if not cfg["check_pinv_params"](*args):
753
+ msg = ("No generator is defined for the shape parameters "
754
+ f"{args}. Use ignore_shape_range to proceed "
755
+ "with the selected values.")
756
+ raise ValueError(msg)
757
+
758
+ if "center" in cfg.keys():
759
+ if not np.isscalar(cfg["center"]):
760
+ self._center = cfg["center"](*args)
761
+ else:
762
+ self._center = cfg["center"]
763
+ else:
764
+ self._center = None
765
+ self._rvs_transform = cfg.get("rvs_transform", None)
766
+ self._rvs_transform_inv = cfg.get("rvs_transform_inv", None)
767
+ _mirror_uniform = cfg.get("mirror_uniform", None)
768
+ if _mirror_uniform is None:
769
+ self._mirror_uniform = False
770
+ else:
771
+ self._mirror_uniform = _mirror_uniform(*args)
772
+
773
+ return CustomDistPINV(cfg["pdf"], args)
774
+
775
+ def rvs(self, size=None):
776
+ """
777
+ Sample from the distribution by inversion.
778
+
779
+ Parameters
780
+ ----------
781
+ size : int or tuple, optional
782
+ The shape of samples. Default is ``None`` in which case a scalar
783
+ sample is returned.
784
+
785
+ Returns
786
+ -------
787
+ rvs : array_like
788
+ A NumPy array of random variates.
789
+
790
+ Notes
791
+ -----
792
+ Random variates are generated by numerical inversion of the CDF, i.e.,
793
+ `ppf` computed by `NumericalInversePolynomial` when the class
794
+ is instantiated. Note that the
795
+ default ``rvs`` method of the rv_continuous class is
796
+ overwritten. Hence, a different stream of random numbers is generated
797
+ even if the same seed is used.
798
+ """
799
+ # note: we cannot use self._rng.rvs directly in case
800
+ # self._mirror_uniform is true
801
+ u = self.random_state.uniform(size=size)
802
+ if self._mirror_uniform:
803
+ u = 1 - u
804
+ r = self._rng.ppf(u)
805
+ if self._rvs_transform is not None:
806
+ r = self._rvs_transform(r, *self._frozendist.args)
807
+ return self.loc + self.scale * r
808
+
809
+ def ppf(self, q):
810
+ """
811
+ Very fast PPF (inverse CDF) of the distribution which
812
+ is a very close approximation of the exact PPF values.
813
+
814
+ Parameters
815
+ ----------
816
+ u : array_like
817
+ Array with probabilities.
818
+
819
+ Returns
820
+ -------
821
+ ppf : array_like
822
+ Quantiles corresponding to the values in `u`.
823
+
824
+ Notes
825
+ -----
826
+ The evaluation of the PPF is very fast but it may have a large
827
+ relative error in the far tails. The numerical precision of the PPF
828
+ is controlled by the u-error, that is,
829
+ ``max |u - CDF(PPF(u))|`` where the max is taken over points in
830
+ the interval [0,1], see `evaluate_error`.
831
+
832
+ Note that this PPF is designed to generate random samples.
833
+ """
834
+ q = np.asarray(q)
835
+ if self._mirror_uniform:
836
+ x = self._rng.ppf(1 - q)
837
+ else:
838
+ x = self._rng.ppf(q)
839
+ if self._rvs_transform is not None:
840
+ x = self._rvs_transform(x, *self._frozendist.args)
841
+ return self.scale * x + self.loc
842
+
843
+ def qrvs(self, size=None, d=None, qmc_engine=None):
844
+ """
845
+ Quasi-random variates of the given distribution.
846
+
847
+ The `qmc_engine` is used to draw uniform quasi-random variates, and
848
+ these are converted to quasi-random variates of the given distribution
849
+ using inverse transform sampling.
850
+
851
+ Parameters
852
+ ----------
853
+ size : int, tuple of ints, or None; optional
854
+ Defines shape of random variates array. Default is ``None``.
855
+ d : int or None, optional
856
+ Defines dimension of uniform quasi-random variates to be
857
+ transformed. Default is ``None``.
858
+ qmc_engine : scipy.stats.qmc.QMCEngine(d=1), optional
859
+ Defines the object to use for drawing
860
+ quasi-random variates. Default is ``None``, which uses
861
+ `scipy.stats.qmc.Halton(1)`.
862
+
863
+ Returns
864
+ -------
865
+ rvs : ndarray or scalar
866
+ Quasi-random variates. See Notes for shape information.
867
+
868
+ Notes
869
+ -----
870
+ The shape of the output array depends on `size`, `d`, and `qmc_engine`.
871
+ The intent is for the interface to be natural, but the detailed rules
872
+ to achieve this are complicated.
873
+
874
+ - If `qmc_engine` is ``None``, a `scipy.stats.qmc.Halton` instance is
875
+ created with dimension `d`. If `d` is not provided, ``d=1``.
876
+ - If `qmc_engine` is not ``None`` and `d` is ``None``, `d` is
877
+ determined from the dimension of the `qmc_engine`.
878
+ - If `qmc_engine` is not ``None`` and `d` is not ``None`` but the
879
+ dimensions are inconsistent, a ``ValueError`` is raised.
880
+ - After `d` is determined according to the rules above, the output
881
+ shape is ``tuple_shape + d_shape``, where:
882
+
883
+ - ``tuple_shape = tuple()`` if `size` is ``None``,
884
+ - ``tuple_shape = (size,)`` if `size` is an ``int``,
885
+ - ``tuple_shape = size`` if `size` is a sequence,
886
+ - ``d_shape = tuple()`` if `d` is ``None`` or `d` is 1, and
887
+ - ``d_shape = (d,)`` if `d` is greater than 1.
888
+
889
+ The elements of the returned array are part of a low-discrepancy
890
+ sequence. If `d` is 1, this means that none of the samples are truly
891
+ independent. If `d` > 1, each slice ``rvs[..., i]`` will be of a
892
+ quasi-independent sequence; see `scipy.stats.qmc.QMCEngine` for
893
+ details. Note that when `d` > 1, the samples returned are still those
894
+ of the provided univariate distribution, not a multivariate
895
+ generalization of that distribution.
896
+
897
+ """
898
+ qmc_engine, d = _validate_qmc_input(qmc_engine, d, self.random_state)
899
+ # mainly copied from unuran_wrapper.pyx.templ
900
+ # `rvs` is flexible about whether `size` is an int or tuple, so this
901
+ # should be, too.
902
+ try:
903
+ if size is None:
904
+ tuple_size = (1,)
905
+ else:
906
+ tuple_size = tuple(size)
907
+ except TypeError:
908
+ tuple_size = (size,)
909
+ # we do not use rng.qrvs directly since we need to be
910
+ # able to apply the ppf to 1 - u
911
+ N = 1 if size is None else np.prod(size)
912
+ u = qmc_engine.random(N)
913
+ if self._mirror_uniform:
914
+ u = 1 - u
915
+ qrvs = self._ppf(u)
916
+ if self._rvs_transform is not None:
917
+ qrvs = self._rvs_transform(qrvs, *self._frozendist.args)
918
+ if size is None:
919
+ qrvs = qrvs.squeeze()[()]
920
+ else:
921
+ if d == 1:
922
+ qrvs = qrvs.reshape(tuple_size)
923
+ else:
924
+ qrvs = qrvs.reshape(tuple_size + (d,))
925
+ return self.loc + self.scale * qrvs
926
+
927
+ def evaluate_error(self, size=100000, random_state=None, x_error=False):
928
+ """
929
+ Evaluate the numerical accuracy of the inversion (u- and x-error).
930
+
931
+ Parameters
932
+ ----------
933
+ size : int, optional
934
+ The number of random points over which the error is estimated.
935
+ Default is ``100000``.
936
+ random_state : {None, int, `numpy.random.Generator`,
937
+ `numpy.random.RandomState`}, optional
938
+
939
+ A NumPy random number generator or seed for the underlying NumPy
940
+ random number generator used to generate the stream of uniform
941
+ random numbers.
942
+ If `random_state` is None, use ``self.random_state``.
943
+ If `random_state` is an int,
944
+ ``np.random.default_rng(random_state)`` is used.
945
+ If `random_state` is already a ``Generator`` or ``RandomState``
946
+ instance then that instance is used.
947
+
948
+ Returns
949
+ -------
950
+ u_error, x_error : tuple of floats
951
+ A NumPy array of random variates.
952
+
953
+ Notes
954
+ -----
955
+ The numerical precision of the inverse CDF `ppf` is controlled by
956
+ the u-error. It is computed as follows:
957
+ ``max |u - CDF(PPF(u))|`` where the max is taken `size` random
958
+ points in the interval [0,1]. `random_state` determines the random
959
+ sample. Note that if `ppf` was exact, the u-error would be zero.
960
+
961
+ The x-error measures the direct distance between the exact PPF
962
+ and `ppf`. If ``x_error`` is set to ``True`, it is
963
+ computed as the maximum of the minimum of the relative and absolute
964
+ x-error:
965
+ ``max(min(x_error_abs[i], x_error_rel[i]))`` where
966
+ ``x_error_abs[i] = |PPF(u[i]) - PPF_fast(u[i])|``,
967
+ ``x_error_rel[i] = max |(PPF(u[i]) - PPF_fast(u[i])) / PPF(u[i])|``.
968
+ Note that it is important to consider the relative x-error in the case
969
+ that ``PPF(u)`` is close to zero or very large.
970
+
971
+ By default, only the u-error is evaluated and the x-error is set to
972
+ ``np.nan``. Note that the evaluation of the x-error will be very slow
973
+ if the implementation of the PPF is slow.
974
+
975
+ Further information about these error measures can be found in [1]_.
976
+
977
+ References
978
+ ----------
979
+ .. [1] Derflinger, Gerhard, Wolfgang Hörmann, and Josef Leydold.
980
+ "Random variate generation by numerical inversion when only the
981
+ density is known." ACM Transactions on Modeling and Computer
982
+ Simulation (TOMACS) 20.4 (2010): 1-25.
983
+
984
+ Examples
985
+ --------
986
+
987
+ >>> import numpy as np
988
+ >>> from scipy import stats
989
+ >>> from scipy.stats.sampling import FastGeneratorInversion
990
+
991
+ Create an object for the normal distribution:
992
+
993
+ >>> d_norm_frozen = stats.norm()
994
+ >>> d_norm = FastGeneratorInversion(d_norm_frozen)
995
+
996
+ To confirm that the numerical inversion is accurate, we evaluate the
997
+ approximation error (u-error and x-error).
998
+
999
+ >>> u_error, x_error = d_norm.evaluate_error(x_error=True)
1000
+
1001
+ The u-error should be below 1e-10:
1002
+
1003
+ >>> u_error
1004
+ 8.785783212061915e-11 # may vary
1005
+
1006
+ Compare the PPF against approximation `ppf`:
1007
+
1008
+ >>> q = [0.001, 0.2, 0.4, 0.6, 0.8, 0.999]
1009
+ >>> diff = np.abs(d_norm_frozen.ppf(q) - d_norm.ppf(q))
1010
+ >>> x_error_abs = np.max(diff)
1011
+ >>> x_error_abs
1012
+ 1.2937954707581412e-08
1013
+
1014
+ This is the absolute x-error evaluated at the points q. The relative
1015
+ error is given by
1016
+
1017
+ >>> x_error_rel = np.max(diff / np.abs(d_norm_frozen.ppf(q)))
1018
+ >>> x_error_rel
1019
+ 4.186725600453555e-09
1020
+
1021
+ The x_error computed above is derived in a very similar way over a
1022
+ much larger set of random values q. At each value q[i], the minimum
1023
+ of the relative and absolute error is taken. The final value is then
1024
+ derived as the maximum of these values. In our example, we get the
1025
+ following value:
1026
+
1027
+ >>> x_error
1028
+ 4.507068014335139e-07 # may vary
1029
+
1030
+ """
1031
+ if not isinstance(size, numbers.Integral | np.integer):
1032
+ raise ValueError("size must be an integer.")
1033
+ # urng will be used to draw the samples for testing the error
1034
+ # it must not interfere with self.random_state. therefore, do not
1035
+ # call self.rvs, but draw uniform random numbers and apply
1036
+ # self.ppf (note: like in rvs, consider self._mirror_uniform)
1037
+ urng = check_random_state_qmc(random_state)
1038
+ u = urng.uniform(size=size)
1039
+ if self._mirror_uniform:
1040
+ u = 1 - u
1041
+ x = self.ppf(u)
1042
+ uerr = np.max(np.abs(self._cdf(x) - u))
1043
+ if not x_error:
1044
+ return uerr, np.nan
1045
+ ppf_u = self._ppf(u)
1046
+ x_error_abs = np.abs(self.ppf(u)-ppf_u)
1047
+ x_error_rel = x_error_abs / np.abs(ppf_u)
1048
+ x_error_combined = np.array([x_error_abs, x_error_rel]).min(axis=0)
1049
+ return uerr, np.max(x_error_combined)
1050
+
1051
+ def support(self):
1052
+ """Support of the distribution.
1053
+
1054
+ Returns
1055
+ -------
1056
+ a, b : float
1057
+ end-points of the distribution's support.
1058
+
1059
+ Notes
1060
+ -----
1061
+
1062
+ Note that the support of the distribution depends on `loc`,
1063
+ `scale` and `domain`.
1064
+
1065
+ Examples
1066
+ --------
1067
+
1068
+ >>> from scipy import stats
1069
+ >>> from scipy.stats.sampling import FastGeneratorInversion
1070
+
1071
+ Define a truncated normal distribution:
1072
+
1073
+ >>> d_norm = FastGeneratorInversion(stats.norm(), domain=(0, 1))
1074
+ >>> d_norm.support()
1075
+ (0, 1)
1076
+
1077
+ Shift the distribution:
1078
+
1079
+ >>> d_norm.loc = 2.5
1080
+ >>> d_norm.support()
1081
+ (2.5, 3.5)
1082
+
1083
+ """
1084
+ return self._domain_adj
1085
+
1086
+ def _cdf(self, x):
1087
+ """Cumulative distribution function (CDF)
1088
+
1089
+ Parameters
1090
+ ----------
1091
+ x : array_like
1092
+ The values where the CDF is evaluated
1093
+
1094
+ Returns
1095
+ -------
1096
+ y : ndarray
1097
+ CDF evaluated at x
1098
+
1099
+ """
1100
+ y = self._frozendist.cdf(x)
1101
+ if self._p_domain == 1.0:
1102
+ return y
1103
+ return np.clip((y - self._p_lower) / self._p_domain, 0, 1)
1104
+
1105
+ def _ppf(self, q):
1106
+ """Percent point function (inverse of `cdf`)
1107
+
1108
+ Parameters
1109
+ ----------
1110
+ q : array_like
1111
+ lower tail probability
1112
+
1113
+ Returns
1114
+ -------
1115
+ x : array_like
1116
+ quantile corresponding to the lower tail probability q.
1117
+
1118
+ """
1119
+ if self._p_domain == 1.0:
1120
+ return self._frozendist.ppf(q)
1121
+ x = self._frozendist.ppf(self._p_domain * np.array(q) + self._p_lower)
1122
+ return np.clip(x, self._domain_adj[0], self._domain_adj[1])
1123
+
1124
+
1125
+ class RatioUniforms:
1126
+ """
1127
+ Generate random samples from a probability density function using the
1128
+ ratio-of-uniforms method.
1129
+
1130
+ Parameters
1131
+ ----------
1132
+ pdf : callable
1133
+ A function with signature `pdf(x)` that is proportional to the
1134
+ probability density function of the distribution.
1135
+ umax : float
1136
+ The upper bound of the bounding rectangle in the u-direction.
1137
+ vmin : float
1138
+ The lower bound of the bounding rectangle in the v-direction.
1139
+ vmax : float
1140
+ The upper bound of the bounding rectangle in the v-direction.
1141
+ c : float, optional.
1142
+ Shift parameter of ratio-of-uniforms method, see Notes. Default is 0.
1143
+ random_state : {None, int, `numpy.random.Generator`,
1144
+ `numpy.random.RandomState`}, optional
1145
+
1146
+ If `seed` is None (or `np.random`), the `numpy.random.RandomState`
1147
+ singleton is used.
1148
+ If `seed` is an int, a new ``RandomState`` instance is used,
1149
+ seeded with `seed`.
1150
+ If `seed` is already a ``Generator`` or ``RandomState`` instance then
1151
+ that instance is used.
1152
+
1153
+ Methods
1154
+ -------
1155
+ rvs
1156
+
1157
+ Notes
1158
+ -----
1159
+ Given a univariate probability density function `pdf` and a constant `c`,
1160
+ define the set ``A = {(u, v) : 0 < u <= sqrt(pdf(v/u + c))}``.
1161
+ If ``(U, V)`` is a random vector uniformly distributed over ``A``,
1162
+ then ``V/U + c`` follows a distribution according to `pdf`.
1163
+
1164
+ The above result (see [1]_, [2]_) can be used to sample random variables
1165
+ using only the PDF, i.e. no inversion of the CDF is required. Typical
1166
+ choices of `c` are zero or the mode of `pdf`. The set ``A`` is a subset of
1167
+ the rectangle ``R = [0, umax] x [vmin, vmax]`` where
1168
+
1169
+ - ``umax = sup sqrt(pdf(x))``
1170
+ - ``vmin = inf (x - c) sqrt(pdf(x))``
1171
+ - ``vmax = sup (x - c) sqrt(pdf(x))``
1172
+
1173
+ In particular, these values are finite if `pdf` is bounded and
1174
+ ``x**2 * pdf(x)`` is bounded (i.e. subquadratic tails).
1175
+ One can generate ``(U, V)`` uniformly on ``R`` and return
1176
+ ``V/U + c`` if ``(U, V)`` are also in ``A`` which can be directly
1177
+ verified.
1178
+
1179
+ The algorithm is not changed if one replaces `pdf` by k * `pdf` for any
1180
+ constant k > 0. Thus, it is often convenient to work with a function
1181
+ that is proportional to the probability density function by dropping
1182
+ unnecessary normalization factors.
1183
+
1184
+ Intuitively, the method works well if ``A`` fills up most of the
1185
+ enclosing rectangle such that the probability is high that ``(U, V)``
1186
+ lies in ``A`` whenever it lies in ``R`` as the number of required
1187
+ iterations becomes too large otherwise. To be more precise, note that
1188
+ the expected number of iterations to draw ``(U, V)`` uniformly
1189
+ distributed on ``R`` such that ``(U, V)`` is also in ``A`` is given by
1190
+ the ratio ``area(R) / area(A) = 2 * umax * (vmax - vmin) / area(pdf)``,
1191
+ where `area(pdf)` is the integral of `pdf` (which is equal to one if the
1192
+ probability density function is used but can take on other values if a
1193
+ function proportional to the density is used). The equality holds since
1194
+ the area of ``A`` is equal to ``0.5 * area(pdf)`` (Theorem 7.1 in [1]_).
1195
+ If the sampling fails to generate a single random variate after 50000
1196
+ iterations (i.e. not a single draw is in ``A``), an exception is raised.
1197
+
1198
+ If the bounding rectangle is not correctly specified (i.e. if it does not
1199
+ contain ``A``), the algorithm samples from a distribution different from
1200
+ the one given by `pdf`. It is therefore recommended to perform a
1201
+ test such as `~scipy.stats.kstest` as a check.
1202
+
1203
+ References
1204
+ ----------
1205
+ .. [1] L. Devroye, "Non-Uniform Random Variate Generation",
1206
+ Springer-Verlag, 1986.
1207
+
1208
+ .. [2] W. Hoermann and J. Leydold, "Generating generalized inverse Gaussian
1209
+ random variates", Statistics and Computing, 24(4), p. 547--557, 2014.
1210
+
1211
+ .. [3] A.J. Kinderman and J.F. Monahan, "Computer Generation of Random
1212
+ Variables Using the Ratio of Uniform Deviates",
1213
+ ACM Transactions on Mathematical Software, 3(3), p. 257--260, 1977.
1214
+
1215
+ Examples
1216
+ --------
1217
+ >>> import numpy as np
1218
+ >>> from scipy import stats
1219
+
1220
+ >>> from scipy.stats.sampling import RatioUniforms
1221
+ >>> rng = np.random.default_rng()
1222
+
1223
+ Simulate normally distributed random variables. It is easy to compute the
1224
+ bounding rectangle explicitly in that case. For simplicity, we drop the
1225
+ normalization factor of the density.
1226
+
1227
+ >>> f = lambda x: np.exp(-x**2 / 2)
1228
+ >>> v = np.sqrt(f(np.sqrt(2))) * np.sqrt(2)
1229
+ >>> umax = np.sqrt(f(0))
1230
+ >>> gen = RatioUniforms(f, umax=umax, vmin=-v, vmax=v, random_state=rng)
1231
+ >>> r = gen.rvs(size=2500)
1232
+
1233
+ The K-S test confirms that the random variates are indeed normally
1234
+ distributed (normality is not rejected at 5% significance level):
1235
+
1236
+ >>> stats.kstest(r, 'norm')[1]
1237
+ 0.250634764150542
1238
+
1239
+ The exponential distribution provides another example where the bounding
1240
+ rectangle can be determined explicitly.
1241
+
1242
+ >>> gen = RatioUniforms(lambda x: np.exp(-x), umax=1, vmin=0,
1243
+ ... vmax=2*np.exp(-1), random_state=rng)
1244
+ >>> r = gen.rvs(1000)
1245
+ >>> stats.kstest(r, 'expon')[1]
1246
+ 0.21121052054580314
1247
+
1248
+ """
1249
+
1250
+ def __init__(self, pdf, *, umax, vmin, vmax, c=0, random_state=None):
1251
+ if vmin >= vmax:
1252
+ raise ValueError("vmin must be smaller than vmax.")
1253
+
1254
+ if umax <= 0:
1255
+ raise ValueError("umax must be positive.")
1256
+
1257
+ self._pdf = pdf
1258
+ self._umax = umax
1259
+ self._vmin = vmin
1260
+ self._vmax = vmax
1261
+ self._c = c
1262
+ self._rng = check_random_state(random_state)
1263
+
1264
+ def rvs(self, size=1):
1265
+ """Sampling of random variates
1266
+
1267
+ Parameters
1268
+ ----------
1269
+ size : int or tuple of ints, optional
1270
+ Number of random variates to be generated (default is 1).
1271
+
1272
+ Returns
1273
+ -------
1274
+ rvs : ndarray
1275
+ The random variates distributed according to the probability
1276
+ distribution defined by the pdf.
1277
+
1278
+ """
1279
+ size1d = tuple(np.atleast_1d(size))
1280
+ N = np.prod(size1d) # number of rvs needed, reshape upon return
1281
+
1282
+ # start sampling using ratio of uniforms method
1283
+ x = np.zeros(N)
1284
+ simulated, i = 0, 1
1285
+
1286
+ # loop until N rvs have been generated: expected runtime is finite.
1287
+ # to avoid infinite loop, raise exception if not a single rv has been
1288
+ # generated after 50000 tries. even if the expected number of iterations
1289
+ # is 1000, the probability of this event is (1-1/1000)**50000
1290
+ # which is of order 10e-22
1291
+ while simulated < N:
1292
+ k = N - simulated
1293
+ # simulate uniform rvs on [0, umax] and [vmin, vmax]
1294
+ u1 = self._umax * self._rng.uniform(size=k)
1295
+ v1 = self._rng.uniform(self._vmin, self._vmax, size=k)
1296
+ # apply rejection method
1297
+ rvs = v1 / u1 + self._c
1298
+ accept = (u1**2 <= self._pdf(rvs))
1299
+ num_accept = np.sum(accept)
1300
+ if num_accept > 0:
1301
+ x[simulated:(simulated + num_accept)] = rvs[accept]
1302
+ simulated += num_accept
1303
+
1304
+ if (simulated == 0) and (i*N >= 50000):
1305
+ msg = (
1306
+ f"Not a single random variate could be generated in {i*N} "
1307
+ "attempts. The ratio of uniforms method does not appear "
1308
+ "to work for the provided parameters. Please check the "
1309
+ "pdf and the bounds."
1310
+ )
1311
+ raise RuntimeError(msg)
1312
+ i += 1
1313
+
1314
+ return np.reshape(x, size1d)