scipy 1.15.3__cp313-cp313-win_amd64.whl → 1.16.0rc2__cp313-cp313-win_amd64.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 (759) hide show
  1. scipy/__config__.py +8 -8
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cp313-win_amd64.dll.a +0 -0
  4. scipy/_cyutility.cp313-win_amd64.pyd +0 -0
  5. scipy/_lib/_array_api.py +486 -161
  6. scipy/_lib/_array_api_compat_vendor.py +9 -0
  7. scipy/_lib/_bunch.py +4 -0
  8. scipy/_lib/_ccallback_c.cp313-win_amd64.dll.a +0 -0
  9. scipy/_lib/_ccallback_c.cp313-win_amd64.pyd +0 -0
  10. scipy/_lib/_docscrape.py +1 -1
  11. scipy/_lib/_elementwise_iterative_method.py +15 -26
  12. scipy/_lib/_fpumode.cp313-win_amd64.dll.a +0 -0
  13. scipy/_lib/_fpumode.cp313-win_amd64.pyd +0 -0
  14. scipy/_lib/_sparse.py +41 -0
  15. scipy/_lib/_test_ccallback.cp313-win_amd64.dll.a +0 -0
  16. scipy/_lib/_test_ccallback.cp313-win_amd64.pyd +0 -0
  17. scipy/_lib/_test_deprecation_call.cp313-win_amd64.dll.a +0 -0
  18. scipy/_lib/_test_deprecation_call.cp313-win_amd64.pyd +0 -0
  19. scipy/_lib/_test_deprecation_def.cp313-win_amd64.dll.a +0 -0
  20. scipy/_lib/_test_deprecation_def.cp313-win_amd64.pyd +0 -0
  21. scipy/_lib/_testutils.py +6 -2
  22. scipy/_lib/_uarray/_uarray.cp313-win_amd64.dll.a +0 -0
  23. scipy/_lib/_uarray/_uarray.cp313-win_amd64.pyd +0 -0
  24. scipy/_lib/_util.py +222 -125
  25. scipy/_lib/array_api_compat/__init__.py +4 -4
  26. scipy/_lib/array_api_compat/_internal.py +19 -6
  27. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  28. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  29. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  30. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  31. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  32. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  33. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  34. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  35. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  36. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  37. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  38. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  39. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  40. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  41. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  42. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  43. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  44. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  45. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  46. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  47. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  48. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  49. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  50. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  51. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  52. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  53. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  54. scipy/_lib/array_api_extra/__init__.py +26 -3
  55. scipy/_lib/array_api_extra/_delegation.py +171 -0
  56. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  57. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  58. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  59. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  60. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  61. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  62. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  63. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  64. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  65. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  66. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  67. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  68. scipy/_lib/array_api_extra/testing.py +359 -0
  69. scipy/_lib/decorator.py +2 -2
  70. scipy/_lib/doccer.py +1 -7
  71. scipy/_lib/messagestream.cp313-win_amd64.dll.a +0 -0
  72. scipy/_lib/messagestream.cp313-win_amd64.pyd +0 -0
  73. scipy/_lib/pyprima/__init__.py +212 -0
  74. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  75. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  76. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  77. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  78. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  79. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  80. scipy/_lib/pyprima/cobyla/update.py +289 -0
  81. scipy/_lib/pyprima/common/__init__.py +0 -0
  82. scipy/_lib/pyprima/common/_bounds.py +34 -0
  83. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  84. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  85. scipy/_lib/pyprima/common/_project.py +173 -0
  86. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  87. scipy/_lib/pyprima/common/consts.py +47 -0
  88. scipy/_lib/pyprima/common/evaluate.py +99 -0
  89. scipy/_lib/pyprima/common/history.py +38 -0
  90. scipy/_lib/pyprima/common/infos.py +30 -0
  91. scipy/_lib/pyprima/common/linalg.py +435 -0
  92. scipy/_lib/pyprima/common/message.py +290 -0
  93. scipy/_lib/pyprima/common/powalg.py +131 -0
  94. scipy/_lib/pyprima/common/preproc.py +277 -0
  95. scipy/_lib/pyprima/common/present.py +5 -0
  96. scipy/_lib/pyprima/common/ratio.py +54 -0
  97. scipy/_lib/pyprima/common/redrho.py +47 -0
  98. scipy/_lib/pyprima/common/selectx.py +296 -0
  99. scipy/_lib/tests/test__util.py +105 -121
  100. scipy/_lib/tests/test_array_api.py +166 -35
  101. scipy/_lib/tests/test_bunch.py +7 -0
  102. scipy/_lib/tests/test_ccallback.py +2 -10
  103. scipy/_lib/tests/test_public_api.py +13 -0
  104. scipy/cluster/_hierarchy.cp313-win_amd64.dll.a +0 -0
  105. scipy/cluster/_hierarchy.cp313-win_amd64.pyd +0 -0
  106. scipy/cluster/_optimal_leaf_ordering.cp313-win_amd64.dll.a +0 -0
  107. scipy/cluster/_optimal_leaf_ordering.cp313-win_amd64.pyd +0 -0
  108. scipy/cluster/_vq.cp313-win_amd64.dll.a +0 -0
  109. scipy/cluster/_vq.cp313-win_amd64.pyd +0 -0
  110. scipy/cluster/hierarchy.py +393 -223
  111. scipy/cluster/tests/test_hierarchy.py +273 -335
  112. scipy/cluster/tests/test_vq.py +45 -61
  113. scipy/cluster/vq.py +39 -35
  114. scipy/conftest.py +263 -157
  115. scipy/constants/_constants.py +4 -1
  116. scipy/constants/tests/test_codata.py +2 -2
  117. scipy/constants/tests/test_constants.py +11 -18
  118. scipy/datasets/_download_all.py +15 -1
  119. scipy/datasets/_fetchers.py +7 -1
  120. scipy/datasets/_utils.py +1 -1
  121. scipy/differentiate/_differentiate.py +25 -25
  122. scipy/differentiate/tests/test_differentiate.py +24 -25
  123. scipy/fft/_basic.py +20 -0
  124. scipy/fft/_helper.py +3 -34
  125. scipy/fft/_pocketfft/helper.py +29 -1
  126. scipy/fft/_pocketfft/pypocketfft.cp313-win_amd64.dll.a +0 -0
  127. scipy/fft/_pocketfft/pypocketfft.cp313-win_amd64.pyd +0 -0
  128. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  129. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  130. scipy/fft/_realtransforms.py +13 -0
  131. scipy/fft/tests/test_basic.py +27 -25
  132. scipy/fft/tests/test_fftlog.py +16 -7
  133. scipy/fft/tests/test_helper.py +18 -34
  134. scipy/fft/tests/test_real_transforms.py +8 -10
  135. scipy/fftpack/convolve.cp313-win_amd64.dll.a +0 -0
  136. scipy/fftpack/convolve.cp313-win_amd64.pyd +0 -0
  137. scipy/fftpack/tests/test_basic.py +2 -4
  138. scipy/fftpack/tests/test_real_transforms.py +8 -9
  139. scipy/integrate/_bvp.py +9 -3
  140. scipy/integrate/_cubature.py +3 -2
  141. scipy/integrate/_dop.cp313-win_amd64.dll.a +0 -0
  142. scipy/integrate/_dop.cp313-win_amd64.pyd +0 -0
  143. scipy/integrate/_lsoda.cp313-win_amd64.dll.a +0 -0
  144. scipy/integrate/_lsoda.cp313-win_amd64.pyd +0 -0
  145. scipy/integrate/_ode.py +9 -2
  146. scipy/integrate/_odepack.cp313-win_amd64.dll.a +0 -0
  147. scipy/integrate/_odepack.cp313-win_amd64.pyd +0 -0
  148. scipy/integrate/_quad_vec.py +21 -29
  149. scipy/integrate/_quadpack.cp313-win_amd64.dll.a +0 -0
  150. scipy/integrate/_quadpack.cp313-win_amd64.pyd +0 -0
  151. scipy/integrate/_quadpack_py.py +11 -7
  152. scipy/integrate/_quadrature.py +3 -3
  153. scipy/integrate/_rules/_base.py +2 -2
  154. scipy/integrate/_tanhsinh.py +48 -47
  155. scipy/integrate/_test_multivariate.cp313-win_amd64.dll.a +0 -0
  156. scipy/integrate/_test_multivariate.cp313-win_amd64.pyd +0 -0
  157. scipy/integrate/_test_odeint_banded.cp313-win_amd64.dll.a +0 -0
  158. scipy/integrate/_test_odeint_banded.cp313-win_amd64.pyd +0 -0
  159. scipy/integrate/_vode.cp313-win_amd64.dll.a +0 -0
  160. scipy/integrate/_vode.cp313-win_amd64.pyd +0 -0
  161. scipy/integrate/tests/test__quad_vec.py +0 -6
  162. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  163. scipy/integrate/tests/test_cubature.py +21 -35
  164. scipy/integrate/tests/test_quadrature.py +6 -8
  165. scipy/integrate/tests/test_tanhsinh.py +56 -48
  166. scipy/interpolate/__init__.py +70 -58
  167. scipy/interpolate/_bary_rational.py +22 -22
  168. scipy/interpolate/_bsplines.py +119 -66
  169. scipy/interpolate/_cubic.py +65 -50
  170. scipy/interpolate/_dfitpack.cp313-win_amd64.dll.a +0 -0
  171. scipy/interpolate/_dfitpack.cp313-win_amd64.pyd +0 -0
  172. scipy/interpolate/_dierckx.cp313-win_amd64.dll.a +0 -0
  173. scipy/interpolate/_dierckx.cp313-win_amd64.pyd +0 -0
  174. scipy/interpolate/_fitpack.cp313-win_amd64.dll.a +0 -0
  175. scipy/interpolate/_fitpack.cp313-win_amd64.pyd +0 -0
  176. scipy/interpolate/_fitpack2.py +9 -6
  177. scipy/interpolate/_fitpack_impl.py +32 -26
  178. scipy/interpolate/_fitpack_repro.py +23 -19
  179. scipy/interpolate/_interpnd.cp313-win_amd64.dll.a +0 -0
  180. scipy/interpolate/_interpnd.cp313-win_amd64.pyd +0 -0
  181. scipy/interpolate/_interpolate.py +30 -12
  182. scipy/interpolate/_ndbspline.py +13 -18
  183. scipy/interpolate/_ndgriddata.py +5 -8
  184. scipy/interpolate/_polyint.py +95 -31
  185. scipy/interpolate/_ppoly.cp313-win_amd64.dll.a +0 -0
  186. scipy/interpolate/_ppoly.cp313-win_amd64.pyd +0 -0
  187. scipy/interpolate/_rbf.py +2 -2
  188. scipy/interpolate/_rbfinterp.py +1 -1
  189. scipy/interpolate/_rbfinterp_pythran.cp313-win_amd64.dll.a +0 -0
  190. scipy/interpolate/_rbfinterp_pythran.cp313-win_amd64.pyd +0 -0
  191. scipy/interpolate/_rgi.py +31 -26
  192. scipy/interpolate/_rgi_cython.cp313-win_amd64.dll.a +0 -0
  193. scipy/interpolate/_rgi_cython.cp313-win_amd64.pyd +0 -0
  194. scipy/interpolate/dfitpack.py +0 -20
  195. scipy/interpolate/interpnd.py +1 -2
  196. scipy/interpolate/tests/test_bary_rational.py +2 -2
  197. scipy/interpolate/tests/test_bsplines.py +97 -1
  198. scipy/interpolate/tests/test_fitpack2.py +39 -1
  199. scipy/interpolate/tests/test_interpnd.py +32 -20
  200. scipy/interpolate/tests/test_interpolate.py +48 -4
  201. scipy/interpolate/tests/test_rgi.py +2 -1
  202. scipy/io/_fast_matrix_market/__init__.py +2 -0
  203. scipy/io/_fast_matrix_market/_fmm_core.cp313-win_amd64.dll.a +0 -0
  204. scipy/io/_fast_matrix_market/_fmm_core.cp313-win_amd64.pyd +0 -0
  205. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  206. scipy/io/_harwell_boeing/hb.py +7 -11
  207. scipy/io/_idl.py +5 -7
  208. scipy/io/_netcdf.py +15 -5
  209. scipy/io/_test_fortran.cp313-win_amd64.dll.a +0 -0
  210. scipy/io/_test_fortran.cp313-win_amd64.pyd +0 -0
  211. scipy/io/arff/tests/test_arffread.py +3 -3
  212. scipy/io/matlab/__init__.py +5 -3
  213. scipy/io/matlab/_mio.py +4 -1
  214. scipy/io/matlab/_mio5.py +19 -13
  215. scipy/io/matlab/_mio5_utils.cp313-win_amd64.dll.a +0 -0
  216. scipy/io/matlab/_mio5_utils.cp313-win_amd64.pyd +0 -0
  217. scipy/io/matlab/_mio_utils.cp313-win_amd64.dll.a +0 -0
  218. scipy/io/matlab/_mio_utils.cp313-win_amd64.pyd +0 -0
  219. scipy/io/matlab/_miobase.py +4 -1
  220. scipy/io/matlab/_streams.cp313-win_amd64.dll.a +0 -0
  221. scipy/io/matlab/_streams.cp313-win_amd64.pyd +0 -0
  222. scipy/io/matlab/tests/test_mio.py +46 -18
  223. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  224. scipy/io/tests/test_mmio.py +7 -1
  225. scipy/io/tests/test_wavfile.py +41 -0
  226. scipy/io/wavfile.py +57 -10
  227. scipy/linalg/_basic.py +113 -86
  228. scipy/linalg/_cythonized_array_utils.cp313-win_amd64.dll.a +0 -0
  229. scipy/linalg/_cythonized_array_utils.cp313-win_amd64.pyd +0 -0
  230. scipy/linalg/_decomp.py +22 -9
  231. scipy/linalg/_decomp_cholesky.py +28 -13
  232. scipy/linalg/_decomp_cossin.py +45 -30
  233. scipy/linalg/_decomp_interpolative.cp313-win_amd64.dll.a +0 -0
  234. scipy/linalg/_decomp_interpolative.cp313-win_amd64.pyd +0 -0
  235. scipy/linalg/_decomp_ldl.py +4 -1
  236. scipy/linalg/_decomp_lu.py +18 -6
  237. scipy/linalg/_decomp_lu_cython.cp313-win_amd64.dll.a +0 -0
  238. scipy/linalg/_decomp_lu_cython.cp313-win_amd64.pyd +0 -0
  239. scipy/linalg/_decomp_polar.py +2 -0
  240. scipy/linalg/_decomp_qr.py +6 -2
  241. scipy/linalg/_decomp_qz.py +3 -0
  242. scipy/linalg/_decomp_schur.py +3 -1
  243. scipy/linalg/_decomp_svd.py +13 -2
  244. scipy/linalg/_decomp_update.cp313-win_amd64.dll.a +0 -0
  245. scipy/linalg/_decomp_update.cp313-win_amd64.pyd +0 -0
  246. scipy/linalg/_expm_frechet.py +4 -0
  247. scipy/linalg/_fblas.cp313-win_amd64.dll.a +0 -0
  248. scipy/linalg/_fblas.cp313-win_amd64.pyd +0 -0
  249. scipy/linalg/_flapack.cp313-win_amd64.dll.a +0 -0
  250. scipy/linalg/_flapack.cp313-win_amd64.pyd +0 -0
  251. scipy/linalg/_linalg_pythran.cp313-win_amd64.dll.a +0 -0
  252. scipy/linalg/_linalg_pythran.cp313-win_amd64.pyd +0 -0
  253. scipy/linalg/_matfuncs.py +187 -4
  254. scipy/linalg/_matfuncs_expm.cp313-win_amd64.dll.a +0 -0
  255. scipy/linalg/_matfuncs_expm.cp313-win_amd64.pyd +0 -0
  256. scipy/linalg/_matfuncs_schur_sqrtm.cp313-win_amd64.dll.a +0 -0
  257. scipy/linalg/_matfuncs_schur_sqrtm.cp313-win_amd64.pyd +0 -0
  258. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  259. scipy/linalg/_matfuncs_sqrtm_triu.cp313-win_amd64.dll.a +0 -0
  260. scipy/linalg/_matfuncs_sqrtm_triu.cp313-win_amd64.pyd +0 -0
  261. scipy/linalg/_procrustes.py +2 -0
  262. scipy/linalg/_sketches.py +17 -6
  263. scipy/linalg/_solve_toeplitz.cp313-win_amd64.dll.a +0 -0
  264. scipy/linalg/_solve_toeplitz.cp313-win_amd64.pyd +0 -0
  265. scipy/linalg/_solvers.py +7 -2
  266. scipy/linalg/_special_matrices.py +26 -36
  267. scipy/linalg/cython_blas.cp313-win_amd64.dll.a +0 -0
  268. scipy/linalg/cython_blas.cp313-win_amd64.pyd +0 -0
  269. scipy/linalg/cython_lapack.cp313-win_amd64.dll.a +0 -0
  270. scipy/linalg/cython_lapack.cp313-win_amd64.pyd +0 -0
  271. scipy/linalg/lapack.py +22 -2
  272. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  273. scipy/linalg/tests/test_basic.py +31 -16
  274. scipy/linalg/tests/test_batch.py +588 -0
  275. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  276. scipy/linalg/tests/test_decomp.py +40 -3
  277. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  278. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  279. scipy/linalg/tests/test_lapack.py +115 -7
  280. scipy/linalg/tests/test_matfuncs.py +157 -102
  281. scipy/linalg/tests/test_procrustes.py +0 -7
  282. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  283. scipy/linalg/tests/test_special_matrices.py +1 -5
  284. scipy/ndimage/__init__.py +1 -0
  285. scipy/ndimage/_ctest.cp313-win_amd64.dll.a +0 -0
  286. scipy/ndimage/_ctest.cp313-win_amd64.pyd +0 -0
  287. scipy/ndimage/_cytest.cp313-win_amd64.dll.a +0 -0
  288. scipy/ndimage/_cytest.cp313-win_amd64.pyd +0 -0
  289. scipy/ndimage/_delegators.py +8 -2
  290. scipy/ndimage/_filters.py +453 -5
  291. scipy/ndimage/_interpolation.py +36 -6
  292. scipy/ndimage/_measurements.py +4 -2
  293. scipy/ndimage/_morphology.py +5 -0
  294. scipy/ndimage/_nd_image.cp313-win_amd64.dll.a +0 -0
  295. scipy/ndimage/_nd_image.cp313-win_amd64.pyd +0 -0
  296. scipy/ndimage/_ni_docstrings.py +5 -1
  297. scipy/ndimage/_ni_label.cp313-win_amd64.dll.a +0 -0
  298. scipy/ndimage/_ni_label.cp313-win_amd64.pyd +0 -0
  299. scipy/ndimage/_ni_support.py +1 -5
  300. scipy/ndimage/_rank_filter_1d.cp313-win_amd64.dll.a +0 -0
  301. scipy/ndimage/_rank_filter_1d.cp313-win_amd64.pyd +0 -0
  302. scipy/ndimage/_support_alternative_backends.py +18 -6
  303. scipy/ndimage/tests/test_filters.py +370 -259
  304. scipy/ndimage/tests/test_fourier.py +7 -9
  305. scipy/ndimage/tests/test_interpolation.py +68 -61
  306. scipy/ndimage/tests/test_measurements.py +18 -35
  307. scipy/ndimage/tests/test_morphology.py +143 -131
  308. scipy/ndimage/tests/test_splines.py +1 -3
  309. scipy/odr/__odrpack.cp313-win_amd64.dll.a +0 -0
  310. scipy/odr/__odrpack.cp313-win_amd64.pyd +0 -0
  311. scipy/optimize/_basinhopping.py +13 -7
  312. scipy/optimize/_bglu_dense.cp313-win_amd64.dll.a +0 -0
  313. scipy/optimize/_bglu_dense.cp313-win_amd64.pyd +0 -0
  314. scipy/optimize/_bracket.py +17 -24
  315. scipy/optimize/_chandrupatla.py +9 -10
  316. scipy/optimize/_cobyla_py.py +104 -123
  317. scipy/optimize/_constraints.py +14 -10
  318. scipy/optimize/_differentiable_functions.py +371 -230
  319. scipy/optimize/_differentialevolution.py +4 -3
  320. scipy/optimize/_direct.cp313-win_amd64.dll.a +0 -0
  321. scipy/optimize/_direct.cp313-win_amd64.pyd +0 -0
  322. scipy/optimize/_dual_annealing.py +1 -1
  323. scipy/optimize/_elementwise.py +1 -4
  324. scipy/optimize/_group_columns.cp313-win_amd64.dll.a +0 -0
  325. scipy/optimize/_group_columns.cp313-win_amd64.pyd +0 -0
  326. scipy/optimize/_highspy/_core.cp313-win_amd64.dll.a +0 -0
  327. scipy/optimize/_highspy/_core.cp313-win_amd64.pyd +0 -0
  328. scipy/optimize/_highspy/_highs_options.cp313-win_amd64.dll.a +0 -0
  329. scipy/optimize/_highspy/_highs_options.cp313-win_amd64.pyd +0 -0
  330. scipy/optimize/_lbfgsb.cp313-win_amd64.dll.a +0 -0
  331. scipy/optimize/_lbfgsb.cp313-win_amd64.pyd +0 -0
  332. scipy/optimize/_lbfgsb_py.py +57 -16
  333. scipy/optimize/_linprog_doc.py +2 -2
  334. scipy/optimize/_linprog_highs.py +2 -2
  335. scipy/optimize/_linprog_ip.py +25 -10
  336. scipy/optimize/_linprog_util.py +14 -16
  337. scipy/optimize/_lsap.cp313-win_amd64.dll.a +0 -0
  338. scipy/optimize/_lsap.cp313-win_amd64.pyd +0 -0
  339. scipy/optimize/_lsq/common.py +3 -3
  340. scipy/optimize/_lsq/dogbox.py +16 -2
  341. scipy/optimize/_lsq/givens_elimination.cp313-win_amd64.dll.a +0 -0
  342. scipy/optimize/_lsq/givens_elimination.cp313-win_amd64.pyd +0 -0
  343. scipy/optimize/_lsq/least_squares.py +198 -126
  344. scipy/optimize/_lsq/lsq_linear.py +6 -6
  345. scipy/optimize/_lsq/trf.py +35 -8
  346. scipy/optimize/_milp.py +3 -1
  347. scipy/optimize/_minimize.py +105 -36
  348. scipy/optimize/_minpack.cp313-win_amd64.dll.a +0 -0
  349. scipy/optimize/_minpack.cp313-win_amd64.pyd +0 -0
  350. scipy/optimize/_minpack_py.py +21 -14
  351. scipy/optimize/_moduleTNC.cp313-win_amd64.dll.a +0 -0
  352. scipy/optimize/_moduleTNC.cp313-win_amd64.pyd +0 -0
  353. scipy/optimize/_nnls.py +20 -21
  354. scipy/optimize/_nonlin.py +34 -3
  355. scipy/optimize/_numdiff.py +288 -110
  356. scipy/optimize/_optimize.py +86 -48
  357. scipy/optimize/_pava_pybind.cp313-win_amd64.dll.a +0 -0
  358. scipy/optimize/_pava_pybind.cp313-win_amd64.pyd +0 -0
  359. scipy/optimize/_remove_redundancy.py +5 -5
  360. scipy/optimize/_root_scalar.py +1 -1
  361. scipy/optimize/_shgo.py +6 -0
  362. scipy/optimize/_shgo_lib/_complex.py +1 -1
  363. scipy/optimize/_slsqp_py.py +216 -124
  364. scipy/optimize/_slsqplib.cp313-win_amd64.dll.a +0 -0
  365. scipy/optimize/_slsqplib.cp313-win_amd64.pyd +0 -0
  366. scipy/optimize/_spectral.py +1 -1
  367. scipy/optimize/_tnc.py +8 -1
  368. scipy/optimize/_trlib/_trlib.cp313-win_amd64.dll.a +0 -0
  369. scipy/optimize/_trlib/_trlib.cp313-win_amd64.pyd +0 -0
  370. scipy/optimize/_trustregion.py +20 -6
  371. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  372. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  373. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  374. scipy/optimize/_trustregion_constr/projections.py +12 -8
  375. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  376. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  377. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  378. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  379. scipy/optimize/_trustregion_exact.py +0 -1
  380. scipy/optimize/_zeros.cp313-win_amd64.dll.a +0 -0
  381. scipy/optimize/_zeros.cp313-win_amd64.pyd +0 -0
  382. scipy/optimize/_zeros_py.py +97 -17
  383. scipy/optimize/cython_optimize/_zeros.cp313-win_amd64.dll.a +0 -0
  384. scipy/optimize/cython_optimize/_zeros.cp313-win_amd64.pyd +0 -0
  385. scipy/optimize/slsqp.py +0 -1
  386. scipy/optimize/tests/test__basinhopping.py +1 -1
  387. scipy/optimize/tests/test__differential_evolution.py +4 -4
  388. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  389. scipy/optimize/tests/test__numdiff.py +66 -22
  390. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  391. scipy/optimize/tests/test__shgo.py +9 -1
  392. scipy/optimize/tests/test_bracket.py +36 -46
  393. scipy/optimize/tests/test_chandrupatla.py +133 -135
  394. scipy/optimize/tests/test_cobyla.py +74 -45
  395. scipy/optimize/tests/test_constraints.py +1 -1
  396. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  397. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  398. scipy/optimize/tests/test_least_squares.py +125 -13
  399. scipy/optimize/tests/test_linear_assignment.py +3 -3
  400. scipy/optimize/tests/test_linprog.py +3 -3
  401. scipy/optimize/tests/test_lsq_linear.py +6 -6
  402. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  403. scipy/optimize/tests/test_minpack.py +4 -4
  404. scipy/optimize/tests/test_nnls.py +43 -3
  405. scipy/optimize/tests/test_nonlin.py +36 -0
  406. scipy/optimize/tests/test_optimize.py +95 -17
  407. scipy/optimize/tests/test_slsqp.py +36 -4
  408. scipy/optimize/tests/test_zeros.py +34 -1
  409. scipy/signal/__init__.py +12 -23
  410. scipy/signal/_delegators.py +568 -0
  411. scipy/signal/_filter_design.py +459 -241
  412. scipy/signal/_fir_filter_design.py +262 -90
  413. scipy/signal/_lti_conversion.py +3 -2
  414. scipy/signal/_ltisys.py +118 -91
  415. scipy/signal/_max_len_seq_inner.cp313-win_amd64.dll.a +0 -0
  416. scipy/signal/_max_len_seq_inner.cp313-win_amd64.pyd +0 -0
  417. scipy/signal/_peak_finding_utils.cp313-win_amd64.dll.a +0 -0
  418. scipy/signal/_peak_finding_utils.cp313-win_amd64.pyd +0 -0
  419. scipy/signal/_polyutils.py +172 -0
  420. scipy/signal/_short_time_fft.py +519 -70
  421. scipy/signal/_signal_api.py +30 -0
  422. scipy/signal/_signaltools.py +719 -399
  423. scipy/signal/_sigtools.cp313-win_amd64.dll.a +0 -0
  424. scipy/signal/_sigtools.cp313-win_amd64.pyd +0 -0
  425. scipy/signal/_sosfilt.cp313-win_amd64.dll.a +0 -0
  426. scipy/signal/_sosfilt.cp313-win_amd64.pyd +0 -0
  427. scipy/signal/_spectral_py.py +230 -50
  428. scipy/signal/_spline.cp313-win_amd64.dll.a +0 -0
  429. scipy/signal/_spline.cp313-win_amd64.pyd +0 -0
  430. scipy/signal/_spline_filters.py +108 -68
  431. scipy/signal/_support_alternative_backends.py +73 -0
  432. scipy/signal/_upfirdn.py +4 -1
  433. scipy/signal/_upfirdn_apply.cp313-win_amd64.dll.a +0 -0
  434. scipy/signal/_upfirdn_apply.cp313-win_amd64.pyd +0 -0
  435. scipy/signal/_waveforms.py +2 -11
  436. scipy/signal/_wavelets.py +1 -1
  437. scipy/signal/fir_filter_design.py +1 -0
  438. scipy/signal/spline.py +4 -11
  439. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  440. scipy/signal/tests/test_bsplines.py +114 -79
  441. scipy/signal/tests/test_cont2discrete.py +9 -2
  442. scipy/signal/tests/test_filter_design.py +721 -481
  443. scipy/signal/tests/test_fir_filter_design.py +332 -140
  444. scipy/signal/tests/test_savitzky_golay.py +4 -3
  445. scipy/signal/tests/test_short_time_fft.py +221 -3
  446. scipy/signal/tests/test_signaltools.py +2144 -1348
  447. scipy/signal/tests/test_spectral.py +50 -6
  448. scipy/signal/tests/test_splines.py +161 -96
  449. scipy/signal/tests/test_upfirdn.py +84 -50
  450. scipy/signal/tests/test_waveforms.py +20 -0
  451. scipy/signal/tests/test_windows.py +607 -466
  452. scipy/signal/windows/_windows.py +287 -148
  453. scipy/sparse/__init__.py +23 -4
  454. scipy/sparse/_base.py +270 -108
  455. scipy/sparse/_bsr.py +7 -4
  456. scipy/sparse/_compressed.py +59 -231
  457. scipy/sparse/_construct.py +90 -38
  458. scipy/sparse/_coo.py +115 -181
  459. scipy/sparse/_csc.py +4 -4
  460. scipy/sparse/_csparsetools.cp313-win_amd64.dll.a +0 -0
  461. scipy/sparse/_csparsetools.cp313-win_amd64.pyd +0 -0
  462. scipy/sparse/_csr.py +2 -2
  463. scipy/sparse/_data.py +48 -48
  464. scipy/sparse/_dia.py +105 -18
  465. scipy/sparse/_dok.py +0 -23
  466. scipy/sparse/_index.py +4 -4
  467. scipy/sparse/_matrix.py +23 -0
  468. scipy/sparse/_sparsetools.cp313-win_amd64.dll.a +0 -0
  469. scipy/sparse/_sparsetools.cp313-win_amd64.pyd +0 -0
  470. scipy/sparse/_sputils.py +37 -22
  471. scipy/sparse/base.py +0 -9
  472. scipy/sparse/bsr.py +0 -14
  473. scipy/sparse/compressed.py +0 -23
  474. scipy/sparse/construct.py +0 -6
  475. scipy/sparse/coo.py +0 -14
  476. scipy/sparse/csc.py +0 -3
  477. scipy/sparse/csgraph/_flow.cp313-win_amd64.dll.a +0 -0
  478. scipy/sparse/csgraph/_flow.cp313-win_amd64.pyd +0 -0
  479. scipy/sparse/csgraph/_matching.cp313-win_amd64.dll.a +0 -0
  480. scipy/sparse/csgraph/_matching.cp313-win_amd64.pyd +0 -0
  481. scipy/sparse/csgraph/_min_spanning_tree.cp313-win_amd64.dll.a +0 -0
  482. scipy/sparse/csgraph/_min_spanning_tree.cp313-win_amd64.pyd +0 -0
  483. scipy/sparse/csgraph/_reordering.cp313-win_amd64.dll.a +0 -0
  484. scipy/sparse/csgraph/_reordering.cp313-win_amd64.pyd +0 -0
  485. scipy/sparse/csgraph/_shortest_path.cp313-win_amd64.dll.a +0 -0
  486. scipy/sparse/csgraph/_shortest_path.cp313-win_amd64.pyd +0 -0
  487. scipy/sparse/csgraph/_tools.cp313-win_amd64.dll.a +0 -0
  488. scipy/sparse/csgraph/_tools.cp313-win_amd64.pyd +0 -0
  489. scipy/sparse/csgraph/_traversal.cp313-win_amd64.dll.a +0 -0
  490. scipy/sparse/csgraph/_traversal.cp313-win_amd64.pyd +0 -0
  491. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  492. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  493. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  494. scipy/sparse/csr.py +0 -5
  495. scipy/sparse/data.py +1 -6
  496. scipy/sparse/dia.py +0 -7
  497. scipy/sparse/dok.py +0 -10
  498. scipy/sparse/linalg/_dsolve/_superlu.cp313-win_amd64.dll.a +0 -0
  499. scipy/sparse/linalg/_dsolve/_superlu.cp313-win_amd64.pyd +0 -0
  500. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  501. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  502. scipy/sparse/linalg/_eigen/arpack/_arpack.cp313-win_amd64.dll.a +0 -0
  503. scipy/sparse/linalg/_eigen/arpack/_arpack.cp313-win_amd64.pyd +0 -0
  504. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  505. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  506. scipy/sparse/linalg/_interface.py +17 -18
  507. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  508. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  509. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  510. scipy/sparse/linalg/_isolve/minres.py +5 -5
  511. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  512. scipy/sparse/linalg/_isolve/utils.py +2 -8
  513. scipy/sparse/linalg/_matfuncs.py +1 -1
  514. scipy/sparse/linalg/_norm.py +1 -1
  515. scipy/sparse/linalg/_propack/_cpropack.cp313-win_amd64.dll.a +0 -0
  516. scipy/sparse/linalg/_propack/_cpropack.cp313-win_amd64.pyd +0 -0
  517. scipy/sparse/linalg/_propack/_dpropack.cp313-win_amd64.dll.a +0 -0
  518. scipy/sparse/linalg/_propack/_dpropack.cp313-win_amd64.pyd +0 -0
  519. scipy/sparse/linalg/_propack/_spropack.cp313-win_amd64.dll.a +0 -0
  520. scipy/sparse/linalg/_propack/_spropack.cp313-win_amd64.pyd +0 -0
  521. scipy/sparse/linalg/_propack/_zpropack.cp313-win_amd64.dll.a +0 -0
  522. scipy/sparse/linalg/_propack/_zpropack.cp313-win_amd64.pyd +0 -0
  523. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  524. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  525. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  526. scipy/sparse/tests/test_base.py +214 -42
  527. scipy/sparse/tests/test_common1d.py +7 -7
  528. scipy/sparse/tests/test_construct.py +1 -1
  529. scipy/sparse/tests/test_coo.py +272 -4
  530. scipy/sparse/tests/test_sparsetools.py +5 -0
  531. scipy/sparse/tests/test_sputils.py +36 -7
  532. scipy/spatial/_ckdtree.cp313-win_amd64.dll.a +0 -0
  533. scipy/spatial/_ckdtree.cp313-win_amd64.pyd +0 -0
  534. scipy/spatial/_distance_pybind.cp313-win_amd64.dll.a +0 -0
  535. scipy/spatial/_distance_pybind.cp313-win_amd64.pyd +0 -0
  536. scipy/spatial/_distance_wrap.cp313-win_amd64.dll.a +0 -0
  537. scipy/spatial/_distance_wrap.cp313-win_amd64.pyd +0 -0
  538. scipy/spatial/_hausdorff.cp313-win_amd64.dll.a +0 -0
  539. scipy/spatial/_hausdorff.cp313-win_amd64.pyd +0 -0
  540. scipy/spatial/_qhull.cp313-win_amd64.dll.a +0 -0
  541. scipy/spatial/_qhull.cp313-win_amd64.pyd +0 -0
  542. scipy/spatial/_voronoi.cp313-win_amd64.dll.a +0 -0
  543. scipy/spatial/_voronoi.cp313-win_amd64.pyd +0 -0
  544. scipy/spatial/distance.py +49 -42
  545. scipy/spatial/tests/test_distance.py +15 -1
  546. scipy/spatial/tests/test_kdtree.py +1 -0
  547. scipy/spatial/tests/test_qhull.py +7 -2
  548. scipy/spatial/transform/__init__.py +5 -3
  549. scipy/spatial/transform/_rigid_transform.cp313-win_amd64.dll.a +0 -0
  550. scipy/spatial/transform/_rigid_transform.cp313-win_amd64.pyd +0 -0
  551. scipy/spatial/transform/_rotation.cp313-win_amd64.dll.a +0 -0
  552. scipy/spatial/transform/_rotation.cp313-win_amd64.pyd +0 -0
  553. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  554. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  555. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  556. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  557. scipy/special/__init__.py +1 -47
  558. scipy/special/_add_newdocs.py +34 -772
  559. scipy/special/_basic.py +22 -25
  560. scipy/special/_comb.cp313-win_amd64.dll.a +0 -0
  561. scipy/special/_comb.cp313-win_amd64.pyd +0 -0
  562. scipy/special/_ellip_harm_2.cp313-win_amd64.dll.a +0 -0
  563. scipy/special/_ellip_harm_2.cp313-win_amd64.pyd +0 -0
  564. scipy/special/_gufuncs.cp313-win_amd64.dll.a +0 -0
  565. scipy/special/_gufuncs.cp313-win_amd64.pyd +0 -0
  566. scipy/special/_logsumexp.py +67 -58
  567. scipy/special/_orthogonal.pyi +1 -1
  568. scipy/special/_specfun.cp313-win_amd64.dll.a +0 -0
  569. scipy/special/_specfun.cp313-win_amd64.pyd +0 -0
  570. scipy/special/_special_ufuncs.cp313-win_amd64.dll.a +0 -0
  571. scipy/special/_special_ufuncs.cp313-win_amd64.pyd +0 -0
  572. scipy/special/_spherical_bessel.py +4 -4
  573. scipy/special/_support_alternative_backends.py +212 -119
  574. scipy/special/_test_internal.cp313-win_amd64.dll.a +0 -0
  575. scipy/special/_test_internal.cp313-win_amd64.pyd +0 -0
  576. scipy/special/_testutils.py +4 -4
  577. scipy/special/_ufuncs.cp313-win_amd64.dll.a +0 -0
  578. scipy/special/_ufuncs.cp313-win_amd64.pyd +0 -0
  579. scipy/special/_ufuncs.pyi +1 -0
  580. scipy/special/_ufuncs.pyx +215 -1400
  581. scipy/special/_ufuncs_cxx.cp313-win_amd64.dll.a +0 -0
  582. scipy/special/_ufuncs_cxx.cp313-win_amd64.pyd +0 -0
  583. scipy/special/_ufuncs_cxx.pxd +2 -15
  584. scipy/special/_ufuncs_cxx.pyx +5 -44
  585. scipy/special/_ufuncs_cxx_defs.h +2 -16
  586. scipy/special/_ufuncs_defs.h +0 -8
  587. scipy/special/cython_special.cp313-win_amd64.dll.a +0 -0
  588. scipy/special/cython_special.cp313-win_amd64.pyd +0 -0
  589. scipy/special/cython_special.pxd +1 -1
  590. scipy/special/tests/_cython_examples/meson.build +10 -1
  591. scipy/special/tests/test_basic.py +153 -20
  592. scipy/special/tests/test_boost_ufuncs.py +3 -0
  593. scipy/special/tests/test_cdflib.py +35 -11
  594. scipy/special/tests/test_gammainc.py +16 -0
  595. scipy/special/tests/test_hyp2f1.py +2 -2
  596. scipy/special/tests/test_log1mexp.py +85 -0
  597. scipy/special/tests/test_logsumexp.py +206 -64
  598. scipy/special/tests/test_mpmath.py +1 -0
  599. scipy/special/tests/test_nan_inputs.py +1 -1
  600. scipy/special/tests/test_orthogonal.py +17 -18
  601. scipy/special/tests/test_sf_error.py +3 -2
  602. scipy/special/tests/test_sph_harm.py +6 -7
  603. scipy/special/tests/test_support_alternative_backends.py +211 -76
  604. scipy/stats/__init__.py +4 -1
  605. scipy/stats/_ansari_swilk_statistics.cp313-win_amd64.dll.a +0 -0
  606. scipy/stats/_ansari_swilk_statistics.cp313-win_amd64.pyd +0 -0
  607. scipy/stats/_axis_nan_policy.py +5 -12
  608. scipy/stats/_biasedurn.cp313-win_amd64.dll.a +0 -0
  609. scipy/stats/_biasedurn.cp313-win_amd64.pyd +0 -0
  610. scipy/stats/_continued_fraction.py +387 -0
  611. scipy/stats/_continuous_distns.py +277 -310
  612. scipy/stats/_correlation.py +1 -1
  613. scipy/stats/_covariance.py +6 -3
  614. scipy/stats/_discrete_distns.py +39 -32
  615. scipy/stats/_distn_infrastructure.py +39 -12
  616. scipy/stats/_distribution_infrastructure.py +900 -238
  617. scipy/stats/_entropy.py +9 -10
  618. scipy/{_lib → stats}/_finite_differences.py +1 -1
  619. scipy/stats/_hypotests.py +83 -50
  620. scipy/stats/_kde.py +53 -49
  621. scipy/stats/_ksstats.py +1 -1
  622. scipy/stats/_levy_stable/__init__.py +7 -15
  623. scipy/stats/_levy_stable/levyst.cp313-win_amd64.dll.a +0 -0
  624. scipy/stats/_levy_stable/levyst.cp313-win_amd64.pyd +0 -0
  625. scipy/stats/_morestats.py +118 -73
  626. scipy/stats/_mstats_basic.py +13 -17
  627. scipy/stats/_mstats_extras.py +8 -8
  628. scipy/stats/_multivariate.py +89 -113
  629. scipy/stats/_new_distributions.py +97 -20
  630. scipy/stats/_page_trend_test.py +12 -5
  631. scipy/stats/_probability_distribution.py +265 -43
  632. scipy/stats/_qmc.py +14 -9
  633. scipy/stats/_qmc_cy.cp313-win_amd64.dll.a +0 -0
  634. scipy/stats/_qmc_cy.cp313-win_amd64.pyd +0 -0
  635. scipy/stats/_qmvnt.py +16 -95
  636. scipy/stats/_qmvnt_cy.cp313-win_amd64.dll.a +0 -0
  637. scipy/stats/_qmvnt_cy.cp313-win_amd64.pyd +0 -0
  638. scipy/stats/_quantile.py +335 -0
  639. scipy/stats/_rcont/rcont.cp313-win_amd64.dll.a +0 -0
  640. scipy/stats/_rcont/rcont.cp313-win_amd64.pyd +0 -0
  641. scipy/stats/_resampling.py +4 -29
  642. scipy/stats/_sampling.py +1 -1
  643. scipy/stats/_sobol.cp313-win_amd64.dll.a +0 -0
  644. scipy/stats/_sobol.cp313-win_amd64.pyd +0 -0
  645. scipy/stats/_stats.cp313-win_amd64.dll.a +0 -0
  646. scipy/stats/_stats.cp313-win_amd64.pyd +0 -0
  647. scipy/stats/_stats_mstats_common.py +21 -2
  648. scipy/stats/_stats_py.py +550 -476
  649. scipy/stats/_stats_pythran.cp313-win_amd64.dll.a +0 -0
  650. scipy/stats/_stats_pythran.cp313-win_amd64.pyd +0 -0
  651. scipy/stats/_unuran/unuran_wrapper.cp313-win_amd64.dll.a +0 -0
  652. scipy/stats/_unuran/unuran_wrapper.cp313-win_amd64.pyd +0 -0
  653. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  654. scipy/stats/_variation.py +6 -8
  655. scipy/stats/_wilcoxon.py +13 -7
  656. scipy/stats/tests/common_tests.py +6 -4
  657. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  658. scipy/stats/tests/test_continued_fraction.py +173 -0
  659. scipy/stats/tests/test_continuous.py +379 -60
  660. scipy/stats/tests/test_continuous_basic.py +18 -12
  661. scipy/stats/tests/test_discrete_basic.py +14 -8
  662. scipy/stats/tests/test_discrete_distns.py +16 -16
  663. scipy/stats/tests/test_distributions.py +95 -75
  664. scipy/stats/tests/test_entropy.py +40 -48
  665. scipy/stats/tests/test_fit.py +4 -3
  666. scipy/stats/tests/test_hypotests.py +153 -24
  667. scipy/stats/tests/test_kdeoth.py +109 -41
  668. scipy/stats/tests/test_marray.py +289 -0
  669. scipy/stats/tests/test_morestats.py +79 -47
  670. scipy/stats/tests/test_mstats_basic.py +3 -3
  671. scipy/stats/tests/test_multivariate.py +434 -83
  672. scipy/stats/tests/test_qmc.py +13 -10
  673. scipy/stats/tests/test_quantile.py +199 -0
  674. scipy/stats/tests/test_rank.py +119 -112
  675. scipy/stats/tests/test_resampling.py +47 -56
  676. scipy/stats/tests/test_sampling.py +9 -4
  677. scipy/stats/tests/test_stats.py +799 -939
  678. scipy/stats/tests/test_variation.py +8 -6
  679. scipy/version.py +2 -2
  680. scipy-1.16.0rc2.dist-info/DELVEWHEEL +2 -0
  681. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  682. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  683. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +685 -693
  684. scipy/_lib/array_api_extra/_funcs.py +0 -484
  685. scipy/_lib/array_api_extra/_typing.py +0 -8
  686. scipy/interpolate/_bspl.cp313-win_amd64.dll.a +0 -0
  687. scipy/interpolate/_bspl.cp313-win_amd64.pyd +0 -0
  688. scipy/optimize/_cobyla.cp313-win_amd64.dll.a +0 -0
  689. scipy/optimize/_cobyla.cp313-win_amd64.pyd +0 -0
  690. scipy/optimize/_cython_nnls.cp313-win_amd64.dll.a +0 -0
  691. scipy/optimize/_cython_nnls.cp313-win_amd64.pyd +0 -0
  692. scipy/optimize/_slsqp.cp313-win_amd64.dll.a +0 -0
  693. scipy/optimize/_slsqp.cp313-win_amd64.pyd +0 -0
  694. scipy/spatial/qhull_src/COPYING.txt +0 -38
  695. scipy/special/libsf_error_state.dll +0 -0
  696. scipy/special/libsf_error_state.dll.a +0 -0
  697. scipy/special/tests/test_log_softmax.py +0 -109
  698. scipy/special/tests/test_xsf_cuda.py +0 -114
  699. scipy/special/xsf/binom.h +0 -89
  700. scipy/special/xsf/cdflib.h +0 -100
  701. scipy/special/xsf/cephes/airy.h +0 -307
  702. scipy/special/xsf/cephes/besselpoly.h +0 -51
  703. scipy/special/xsf/cephes/beta.h +0 -257
  704. scipy/special/xsf/cephes/cbrt.h +0 -131
  705. scipy/special/xsf/cephes/chbevl.h +0 -85
  706. scipy/special/xsf/cephes/chdtr.h +0 -193
  707. scipy/special/xsf/cephes/const.h +0 -87
  708. scipy/special/xsf/cephes/ellie.h +0 -293
  709. scipy/special/xsf/cephes/ellik.h +0 -251
  710. scipy/special/xsf/cephes/ellpe.h +0 -107
  711. scipy/special/xsf/cephes/ellpk.h +0 -117
  712. scipy/special/xsf/cephes/expn.h +0 -260
  713. scipy/special/xsf/cephes/gamma.h +0 -398
  714. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  715. scipy/special/xsf/cephes/hyperg.h +0 -361
  716. scipy/special/xsf/cephes/i0.h +0 -149
  717. scipy/special/xsf/cephes/i1.h +0 -158
  718. scipy/special/xsf/cephes/igam.h +0 -421
  719. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  720. scipy/special/xsf/cephes/igami.h +0 -313
  721. scipy/special/xsf/cephes/j0.h +0 -225
  722. scipy/special/xsf/cephes/j1.h +0 -198
  723. scipy/special/xsf/cephes/jv.h +0 -715
  724. scipy/special/xsf/cephes/k0.h +0 -164
  725. scipy/special/xsf/cephes/k1.h +0 -163
  726. scipy/special/xsf/cephes/kn.h +0 -243
  727. scipy/special/xsf/cephes/lanczos.h +0 -112
  728. scipy/special/xsf/cephes/ndtr.h +0 -275
  729. scipy/special/xsf/cephes/poch.h +0 -85
  730. scipy/special/xsf/cephes/polevl.h +0 -167
  731. scipy/special/xsf/cephes/psi.h +0 -194
  732. scipy/special/xsf/cephes/rgamma.h +0 -111
  733. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  734. scipy/special/xsf/cephes/shichi.h +0 -248
  735. scipy/special/xsf/cephes/sici.h +0 -224
  736. scipy/special/xsf/cephes/sindg.h +0 -221
  737. scipy/special/xsf/cephes/tandg.h +0 -139
  738. scipy/special/xsf/cephes/trig.h +0 -58
  739. scipy/special/xsf/cephes/unity.h +0 -186
  740. scipy/special/xsf/cephes/zeta.h +0 -172
  741. scipy/special/xsf/config.h +0 -304
  742. scipy/special/xsf/digamma.h +0 -205
  743. scipy/special/xsf/error.h +0 -57
  744. scipy/special/xsf/evalpoly.h +0 -47
  745. scipy/special/xsf/expint.h +0 -266
  746. scipy/special/xsf/hyp2f1.h +0 -694
  747. scipy/special/xsf/iv_ratio.h +0 -173
  748. scipy/special/xsf/lambertw.h +0 -150
  749. scipy/special/xsf/loggamma.h +0 -163
  750. scipy/special/xsf/sici.h +0 -200
  751. scipy/special/xsf/tools.h +0 -427
  752. scipy/special/xsf/trig.h +0 -164
  753. scipy/special/xsf/wright_bessel.h +0 -843
  754. scipy/special/xsf/zlog1.h +0 -35
  755. scipy/stats/_mvn.cp313-win_amd64.dll.a +0 -0
  756. scipy/stats/_mvn.cp313-win_amd64.pyd +0 -0
  757. scipy-1.15.3.dist-info/DELVEWHEEL +0 -2
  758. /scipy-1.15.3-cp313-cp313-win_amd64.whl → /scipy-1.16.0rc2-cp313-cp313-win_amd64.whl +0 -0
  759. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
@@ -3,6 +3,7 @@ Test functions for multivariate normal distributions.
3
3
 
4
4
  """
5
5
  import pickle
6
+ from dataclasses import dataclass
6
7
 
7
8
  from numpy.testing import (assert_allclose, assert_almost_equal,
8
9
  assert_array_almost_equal, assert_equal,
@@ -29,11 +30,13 @@ from scipy.stats import (multivariate_normal, multivariate_hypergeom,
29
30
  dirichlet_multinomial, vonmises)
30
31
 
31
32
  from scipy.stats import _covariance, Covariance
33
+ from scipy.stats._continuous_distns import _norm_pdf as norm_pdf
32
34
  from scipy import stats
33
35
 
34
- from scipy.integrate import tanhsinh
36
+ from scipy.integrate import tanhsinh, cubature, quad
35
37
  from scipy.integrate import romb, qmc_quad, dblquad, tplquad
36
38
  from scipy.special import multigammaln
39
+ import scipy.special as special
37
40
 
38
41
  from .common_tests import check_random_state_property
39
42
  from .data._mvt import _qsimvtv
@@ -291,6 +294,231 @@ def _sample_orthonormal_matrix(n):
291
294
  return u
292
295
 
293
296
 
297
+ @dataclass
298
+ class MVNProblem:
299
+ """Instantiate a multivariate normal integration problem with special structure.
300
+
301
+ When covariance matrix is a correlation matrix where the off-diagonal entries
302
+ ``covar[i, j] == lambdas[i]*lambdas[j]`` for ``i != j``, then the multidimensional
303
+ integral reduces to a simpler univariate integral that can be numerically integrated
304
+ easily.
305
+
306
+ The ``generate_*()`` classmethods provide a few options for creating variations
307
+ of this problem.
308
+
309
+ References
310
+ ----------
311
+ .. [1] Tong, Y.L. "The Multivariate Normal Distribution".
312
+ Springer-Verlag. p192. 1990.
313
+ """
314
+ ndim : int
315
+ low : np.ndarray
316
+ high : np.ndarray
317
+ lambdas : np.ndarray
318
+ covar : np.ndarray
319
+ target_val : float
320
+ target_err : float
321
+
322
+ #: The `generator_halves()` case has an analytically-known true value that we'll
323
+ #: record here. It remain None for most cases, though.
324
+ true_val : float | None = None
325
+
326
+ def __init__(self, ndim, low, high, lambdas):
327
+ super().__init__()
328
+ self.ndim = ndim
329
+ self.low = low
330
+ self.high = high
331
+ self.lambdas = lambdas
332
+
333
+ self.covar = np.outer(self.lambdas, self.lambdas)
334
+ np.fill_diagonal(self.covar, 1.0)
335
+ self.find_target()
336
+
337
+ @classmethod
338
+ def generate_semigeneral(cls, ndim, rng=None):
339
+ """Random lambdas, random upper bounds, infinite lower bounds.
340
+ """
341
+ rng = np.random.default_rng(rng)
342
+ low = np.full(ndim, -np.inf)
343
+ high = rng.uniform(0.0, np.sqrt(ndim), size=ndim)
344
+ lambdas = rng.uniform(-1.0, 1.0, size=ndim)
345
+
346
+ self = cls(
347
+ ndim=ndim,
348
+ low=low,
349
+ high=high,
350
+ lambdas=lambdas,
351
+ )
352
+ return self
353
+
354
+ @classmethod
355
+ def generate_constant(cls, ndim, rng=None):
356
+ """Constant off-diagonal covariance, random upper bounds, infinite lower bounds.
357
+ """
358
+ rng = np.random.default_rng(rng)
359
+ low = np.full(ndim, -np.inf)
360
+ high = rng.uniform(0.0, np.sqrt(ndim), size=ndim)
361
+ sigma = np.sqrt(rng.uniform(0.0, 1.0))
362
+ lambdas = np.full(ndim, sigma)
363
+
364
+ self = cls(
365
+ ndim=ndim,
366
+ low=low,
367
+ high=high,
368
+ lambdas=lambdas,
369
+ )
370
+ return self
371
+
372
+ @classmethod
373
+ def generate_halves(cls, ndim, rng=None):
374
+ """Off-diagonal covariance of 0.5, negative orthant bounds.
375
+
376
+ True analytically-derived answer is 1/(ndim+1).
377
+ """
378
+ low = np.full(ndim, -np.inf)
379
+ high = np.zeros(ndim)
380
+ lambdas = np.sqrt(0.5)
381
+
382
+ self = cls(
383
+ ndim=ndim,
384
+ low=low,
385
+ high=high,
386
+ lambdas=lambdas,
387
+ )
388
+ self.true_val = 1 / (ndim+1)
389
+ return self
390
+
391
+ def find_target(self, **kwds):
392
+ """Perform the simplified integral and store the results.
393
+ """
394
+ d = dict(
395
+ a=-9.0,
396
+ b=+9.0,
397
+ )
398
+ d.update(kwds)
399
+ self.target_val, self.target_err = quad(self.univariate_func, **d)
400
+
401
+ def _univariate_term(self, t):
402
+ """The parameter-specific term of the univariate integrand,
403
+ for separate plotting.
404
+ """
405
+ denom = np.sqrt(1 - self.lambdas**2)
406
+ return np.prod(
407
+ special.ndtr((self.high + self.lambdas*t[:, np.newaxis]) / denom) -
408
+ special.ndtr((self.low + self.lambdas*t[:, np.newaxis]) / denom),
409
+ axis=1,
410
+ )
411
+
412
+ def univariate_func(self, t):
413
+ """Univariate integrand.
414
+ """
415
+ t = np.atleast_1d(t)
416
+ return np.squeeze(norm_pdf(t) * self._univariate_term(t))
417
+
418
+ def plot_integrand(self):
419
+ """Plot the univariate integrand and its component terms for understanding.
420
+ """
421
+ from matplotlib import pyplot as plt
422
+
423
+ t = np.linspace(-9.0, 9.0, 1001)
424
+ plt.plot(t, norm_pdf(t), label=r'$\phi(t)$')
425
+ plt.plot(t, self._univariate_term(t), label=r'$f(t)$')
426
+ plt.plot(t, self.univariate_func(t), label=r'$f(t)*phi(t)$')
427
+ plt.legend()
428
+
429
+
430
+ @dataclass
431
+ class SingularMVNProblem:
432
+ """Instantiate a multivariate normal integration problem with a special singular
433
+ covariance structure.
434
+
435
+ When covariance matrix is a correlation matrix where the off-diagonal entries
436
+ ``covar[i, j] == -lambdas[i]*lambdas[j]`` for ``i != j``, and
437
+ ``sum(lambdas**2 / (1+lambdas**2)) == 1``, then the matrix is singular, and
438
+ the multidimensional integral reduces to a simpler univariate integral that
439
+ can be numerically integrated fairly easily.
440
+
441
+ The lower bound must be infinite, though the upper bounds can be general.
442
+
443
+ References
444
+ ----------
445
+ .. [1] Kwong, K.-S. (1995). "Evaluation of the one-sided percentage points of the
446
+ singular multivariate normal distribution." Journal of Statistical
447
+ Computation and Simulation, 51(2-4), 121-135. doi:10.1080/00949659508811627
448
+ """
449
+ ndim : int
450
+ low : np.ndarray
451
+ high : np.ndarray
452
+ lambdas : np.ndarray
453
+ covar : np.ndarray
454
+ target_val : float
455
+ target_err : float
456
+
457
+ def __init__(self, ndim, high, lambdas):
458
+ self.ndim = ndim
459
+ self.high = high
460
+ self.lambdas = lambdas
461
+
462
+ self.low = np.full(ndim, -np.inf)
463
+ self.covar = -np.outer(self.lambdas, self.lambdas)
464
+ np.fill_diagonal(self.covar, 1.0)
465
+ self.find_target()
466
+
467
+ @classmethod
468
+ def generate_semiinfinite(cls, ndim, rng=None):
469
+ """Singular lambdas, random upper bounds.
470
+ """
471
+ rng = np.random.default_rng(rng)
472
+ high = rng.uniform(0.0, np.sqrt(ndim), size=ndim)
473
+ p = rng.dirichlet(np.full(ndim, 1.0))
474
+ lambdas = np.sqrt(p / (1-p)) * rng.choice([-1.0, 1.0], size=ndim)
475
+
476
+ self = cls(
477
+ ndim=ndim,
478
+ high=high,
479
+ lambdas=lambdas,
480
+ )
481
+ return self
482
+
483
+ def find_target(self, **kwds):
484
+ d = dict(
485
+ a=-9.0,
486
+ b=+9.0,
487
+ )
488
+ d.update(kwds)
489
+ self.target_val, self.target_err = quad(self.univariate_func, **d)
490
+
491
+ def _univariate_term(self, t):
492
+ denom = np.sqrt(1 + self.lambdas**2)
493
+ i1 = np.prod(
494
+ special.ndtr((self.high - 1j*self.lambdas*t[:, np.newaxis]) / denom),
495
+ axis=1,
496
+ )
497
+ i2 = np.prod(
498
+ special.ndtr((-self.high + 1j*self.lambdas*t[:, np.newaxis]) / denom),
499
+ axis=1,
500
+ )
501
+ # The imaginary part is an odd function, so it can be ignored; it will integrate
502
+ # out to 0.
503
+ return (i1 - (-1)**self.ndim * i2).real
504
+
505
+ def univariate_func(self, t):
506
+ t = np.atleast_1d(t)
507
+ return (norm_pdf(t) * self._univariate_term(t)).squeeze()
508
+
509
+ def plot_integrand(self):
510
+ """Plot the univariate integrand and its component terms for understanding.
511
+ """
512
+ from matplotlib import pyplot as plt
513
+
514
+ t = np.linspace(-9.0, 9.0, 1001)
515
+ plt.plot(t, norm_pdf(t), label=r'$\phi(t)$')
516
+ plt.plot(t, self._univariate_term(t), label=r'$f(t)$')
517
+ plt.plot(t, self.univariate_func(t), label=r'$f(t)*phi(t)$')
518
+ plt.ylim(-0.1, 1.1)
519
+ plt.legend()
520
+
521
+
294
522
  class TestMultivariateNormal:
295
523
  def test_input_shape(self):
296
524
  mu = np.arange(3)
@@ -483,17 +711,17 @@ class TestMultivariateNormal:
483
711
  assert_allclose(psd.log_pdet, large_total_log)
484
712
 
485
713
  def test_broadcasting(self):
486
- np.random.seed(1234)
714
+ rng = np.random.RandomState(1234)
487
715
  n = 4
488
716
 
489
717
  # Construct a random covariance matrix.
490
- data = np.random.randn(n, n)
718
+ data = rng.randn(n, n)
491
719
  cov = np.dot(data, data.T)
492
- mean = np.random.randn(n)
720
+ mean = rng.randn(n)
493
721
 
494
722
  # Construct an ndarray which can be interpreted as
495
723
  # a 2x3 array whose elements are random data vectors.
496
- X = np.random.randn(2, 3, n)
724
+ X = rng.randn(2, 3, n)
497
725
 
498
726
  # Check that multiple data points can be evaluated at once.
499
727
  desired_pdf = multivariate_normal.pdf(X, mean, cov)
@@ -724,25 +952,25 @@ class TestMultivariateNormal:
724
952
  # Generate large sample and compare sample mean and sample covariance
725
953
  # with mean and covariance matrix.
726
954
 
727
- np.random.seed(2846)
955
+ rng = np.random.RandomState(2846)
728
956
 
729
957
  n = 3
730
- mean = np.random.randn(n)
731
- M = np.random.randn(n, n)
958
+ mean = rng.randn(n)
959
+ M = rng.randn(n, n)
732
960
  cov = np.dot(M, M.T)
733
961
  size = 5000
734
962
 
735
- sample = multivariate_normal.rvs(mean, cov, size)
963
+ sample = multivariate_normal.rvs(mean, cov, size, random_state=rng)
736
964
 
737
965
  assert_allclose(np.cov(sample.T), cov, rtol=1e-1)
738
966
  assert_allclose(sample.mean(0), mean, rtol=1e-1)
739
967
 
740
968
  def test_entropy(self):
741
- np.random.seed(2846)
969
+ rng = np.random.RandomState(2846)
742
970
 
743
971
  n = 3
744
- mean = np.random.randn(n)
745
- M = np.random.randn(n, n)
972
+ mean = rng.randn(n)
973
+ M = rng.randn(n, n)
746
974
  cov = np.dot(M, M.T)
747
975
 
748
976
  rv = multivariate_normal(mean, cov)
@@ -810,6 +1038,70 @@ class TestMultivariateNormal:
810
1038
  cdf = multivariate_normal.cdf(b, mean, cov, lower_limit=a)
811
1039
  assert_allclose(cdf, cdf[0]*expected_signs)
812
1040
 
1041
+ @pytest.mark.slow
1042
+ def test_cdf_vs_cubature(self):
1043
+ ndim = 3
1044
+ rng = np.random.default_rng(123)
1045
+ a = rng.uniform(size=(ndim, ndim))
1046
+ cov = a.T @ a
1047
+ m = rng.uniform(size=ndim)
1048
+ dist = multivariate_normal(mean=m, cov=cov)
1049
+ x = rng.uniform(low=-3, high=3, size=(ndim,))
1050
+ cdf = dist.cdf(x)
1051
+ dist_i = multivariate_normal(mean=[0]*ndim, cov=cov)
1052
+ cdf_i = cubature(dist_i.pdf, [-np.inf]*ndim, x - m).estimate
1053
+ assert_allclose(cdf, cdf_i, atol=5e-6)
1054
+
1055
+ def test_cdf_known(self):
1056
+ # https://github.com/scipy/scipy/pull/17410#issuecomment-1312628547
1057
+ for ndim in range(2, 12):
1058
+ cov = np.full((ndim, ndim), 0.5)
1059
+ np.fill_diagonal(cov, 1.)
1060
+ dist = multivariate_normal([0]*ndim, cov=cov)
1061
+ assert_allclose(
1062
+ dist.cdf([0]*ndim),
1063
+ 1. / (1. + ndim),
1064
+ atol=5e-5
1065
+ )
1066
+
1067
+ @pytest.mark.parametrize("ndim", range(2, 10))
1068
+ @pytest.mark.parametrize("seed", [0xdeadbeef, 0xdd24528764c9773579731c6b022b48e2])
1069
+ def test_cdf_vs_univariate(self, seed, ndim):
1070
+ rng = np.random.default_rng(seed)
1071
+ case = MVNProblem.generate_semigeneral(ndim=ndim, rng=rng)
1072
+ assert (case.low == -np.inf).all()
1073
+
1074
+ dist = multivariate_normal(mean=[0]*ndim, cov=case.covar)
1075
+ cdf_val = dist.cdf(case.high, rng=rng)
1076
+ assert_allclose(cdf_val, case.target_val, atol=5e-5)
1077
+
1078
+ @pytest.mark.parametrize("ndim", range(2, 11))
1079
+ @pytest.mark.parametrize("seed", [0xdeadbeef, 0xdd24528764c9773579731c6b022b48e2])
1080
+ def test_cdf_vs_univariate_2(self, seed, ndim):
1081
+ rng = np.random.default_rng(seed)
1082
+ case = MVNProblem.generate_constant(ndim=ndim, rng=rng)
1083
+ assert (case.low == -np.inf).all()
1084
+
1085
+ dist = multivariate_normal(mean=[0]*ndim, cov=case.covar)
1086
+ cdf_val = dist.cdf(case.high, rng=rng)
1087
+ assert_allclose(cdf_val, case.target_val, atol=5e-5)
1088
+
1089
+ @pytest.mark.parametrize("ndim", range(4, 11))
1090
+ @pytest.mark.parametrize("seed", [0xdeadbeef, 0xdd24528764c9773579731c6b022b48e4])
1091
+ def test_cdf_vs_univariate_singular(self, seed, ndim):
1092
+ # NB: ndim = 2, 3 has much poorer accuracy than ndim > 3 for many seeds.
1093
+ # No idea why.
1094
+ rng = np.random.default_rng(seed)
1095
+ case = SingularMVNProblem.generate_semiinfinite(ndim=ndim, rng=rng)
1096
+ assert (case.low == -np.inf).all()
1097
+
1098
+ dist = multivariate_normal(mean=[0]*ndim, cov=case.covar, allow_singular=True,
1099
+ # default maxpts is too slow, limit it here
1100
+ maxpts=10_000*case.covar.shape[0]
1101
+ )
1102
+ cdf_val = dist.cdf(case.high, rng=rng)
1103
+ assert_allclose(cdf_val, case.target_val, atol=1e-3)
1104
+
813
1105
  def test_mean_cov(self):
814
1106
  # test the interaction between a Covariance object and mean
815
1107
  P = np.diag(1 / np.array([1, 2, 3]))
@@ -1495,22 +1787,22 @@ class TestWishart:
1495
1787
  w = wishart(df, scale)
1496
1788
 
1497
1789
  # Get the generated random variables from a known seed
1498
- np.random.seed(248042)
1499
- w_rvs = wishart.rvs(df, scale)
1500
- np.random.seed(248042)
1501
- frozen_w_rvs = w.rvs()
1790
+ rng = np.random.RandomState(248042)
1791
+ w_rvs = wishart.rvs(df, scale, random_state=rng)
1792
+ rng = np.random.RandomState(248042)
1793
+ frozen_w_rvs = w.rvs(random_state=rng)
1502
1794
 
1503
1795
  # Manually calculate what it should be, based on the Bartlett (1933)
1504
1796
  # decomposition of a Wishart into D A A' D', where D is the Cholesky
1505
1797
  # factorization of the scale matrix and A is the lower triangular matrix
1506
1798
  # with the square root of chi^2 variates on the diagonal and N(0,1)
1507
1799
  # variates in the lower triangle.
1508
- np.random.seed(248042)
1509
- covariances = np.random.normal(size=3)
1800
+ rng = np.random.RandomState(248042)
1801
+ covariances = rng.normal(size=3)
1510
1802
  variances = np.r_[
1511
- np.random.chisquare(df),
1512
- np.random.chisquare(df-1),
1513
- np.random.chisquare(df-2),
1803
+ rng.chisquare(df),
1804
+ rng.chisquare(df-1),
1805
+ rng.chisquare(df-2),
1514
1806
  ]**0.5
1515
1807
 
1516
1808
  # Construct the lower-triangular A matrix
@@ -1531,7 +1823,7 @@ class TestWishart:
1531
1823
  # chi-squared distribution.
1532
1824
  # Test variance, mean, entropy, pdf
1533
1825
  # Kolgomorov-Smirnov test for rvs
1534
- np.random.seed(482974)
1826
+ rng = np.random.default_rng(482974)
1535
1827
 
1536
1828
  sn = 500
1537
1829
  dim = 1
@@ -1552,7 +1844,7 @@ class TestWishart:
1552
1844
  assert_allclose(w.pdf(X), c.pdf(X))
1553
1845
 
1554
1846
  # rvs
1555
- rvs = w.rvs(size=sn)
1847
+ rvs = w.rvs(size=sn, random_state=rng)
1556
1848
  args = (df,)
1557
1849
  alpha = 0.01
1558
1850
  check_distribution_rvs('chi2', args, alpha, rvs)
@@ -1562,7 +1854,7 @@ class TestWishart:
1562
1854
  # transformed to a scaled chi-squared distribution.
1563
1855
  # For :math:`S \sim W_p(V,n)` and :math:`\lambda \in \mathbb{R}^p` we have
1564
1856
  # :math:`\lambda' S \lambda \sim \lambda' V \lambda \times \chi^2(n)`
1565
- np.random.seed(482974)
1857
+ rng = np.random.default_rng(482974)
1566
1858
 
1567
1859
  sn = 500
1568
1860
  df = 10
@@ -1587,7 +1879,7 @@ class TestWishart:
1587
1879
  assert_allclose(w.pdf(X), c.pdf(X))
1588
1880
 
1589
1881
  # rvs
1590
- rvs = w.rvs(size=sn)
1882
+ rvs = w.rvs(size=sn, random_state=rng)
1591
1883
  args = (df,0,sigma_lamda)
1592
1884
  alpha = 0.01
1593
1885
  check_distribution_rvs('chi2', args, alpha, rvs)
@@ -1637,10 +1929,17 @@ class TestMultinomial:
1637
1929
  @pytest.mark.parametrize("n", [0, 3])
1638
1930
  def test_rvs_np(self, n):
1639
1931
  # test that .rvs agrees w/numpy
1640
- sc_rvs = multinomial.rvs(n, [1/4.]*3, size=7, random_state=123)
1641
- rndm = np.random.RandomState(123)
1642
- np_rvs = rndm.multinomial(n, [1/4.]*3, size=7)
1643
- assert_equal(sc_rvs, np_rvs)
1932
+ message = "Some rows of `p` do not sum to 1.0 within..."
1933
+ with pytest.warns(FutureWarning, match=message):
1934
+ rndm = np.random.RandomState(123)
1935
+ sc_rvs = multinomial.rvs(n, [1/4.]*3, size=7, random_state=123)
1936
+ np_rvs = rndm.multinomial(n, [1/4.]*3, size=7)
1937
+ assert_equal(sc_rvs, np_rvs)
1938
+ with pytest.warns(FutureWarning, match=message):
1939
+ rndm = np.random.RandomState(123)
1940
+ sc_rvs = multinomial.rvs(n, [1/4.]*5, size=7, random_state=123)
1941
+ np_rvs = rndm.multinomial(n, [1/4.]*5, size=7)
1942
+ assert_equal(sc_rvs, np_rvs)
1644
1943
 
1645
1944
  def test_pmf(self):
1646
1945
  vals0 = multinomial.pmf((5,), 5, (1,))
@@ -1715,7 +2014,7 @@ class TestMultinomial:
1715
2014
  assert_allclose(ent0, binom.entropy(n, .2), rtol=1e-8)
1716
2015
 
1717
2016
  def test_entropy_broadcasting(self):
1718
- ent0 = multinomial.entropy([2, 3], [.2, .3])
2017
+ ent0 = multinomial.entropy([2, 3], [.2, .8])
1719
2018
  assert_allclose(ent0, [binom.entropy(2, .2), binom.entropy(3, .2)],
1720
2019
  rtol=1e-8)
1721
2020
 
@@ -1764,6 +2063,17 @@ class TestMultinomial:
1764
2063
  logpmf = multinomial.logpmf(x, n, p)
1765
2064
  assert np.isfinite(logpmf)
1766
2065
 
2066
+ @pytest.mark.parametrize('dtype', [np.float32, np.float64])
2067
+ def test_gh_22565(self, dtype):
2068
+ # Same issue as gh-11860 above, essentially, but the original
2069
+ # fix didn't completely solve the problem.
2070
+ n = 19
2071
+ p = np.asarray([0.2, 0.2, 0.2, 0.2, 0.2], dtype=dtype)
2072
+ res1 = multinomial.pmf(x=[1, 2, 5, 7, 4], n=n, p=p)
2073
+ res2 = multinomial.pmf(x=[1, 2, 4, 5, 7], n=n, p=p)
2074
+ np.testing.assert_allclose(res1, res2, rtol=1e-15)
2075
+
2076
+
1767
2077
  class TestInvwishart:
1768
2078
  def test_frozen(self):
1769
2079
  # Test that the frozen and non-frozen inverse Wishart gives the same
@@ -1802,7 +2112,7 @@ class TestInvwishart:
1802
2112
  # just an inverse gamma distribution.
1803
2113
  # Test variance, mean, pdf, entropy
1804
2114
  # Kolgomorov-Smirnov test for rvs
1805
- np.random.seed(482974)
2115
+ rng = np.random.RandomState(482974)
1806
2116
 
1807
2117
  sn = 500
1808
2118
  dim = 1
@@ -1822,7 +2132,7 @@ class TestInvwishart:
1822
2132
  assert_allclose(iw.pdf(X), ig.pdf(X))
1823
2133
 
1824
2134
  # rvs
1825
- rvs = iw.rvs(size=sn)
2135
+ rvs = iw.rvs(size=sn, random_state=rng)
1826
2136
  args = (df/2, 0, 1./2)
1827
2137
  alpha = 0.01
1828
2138
  check_distribution_rvs('invgamma', args, alpha, rvs)
@@ -1843,10 +2153,10 @@ class TestInvwishart:
1843
2153
  iw = invwishart(df, scale)
1844
2154
 
1845
2155
  # Get the generated random variables from a known seed
1846
- np.random.seed(608072)
1847
- iw_rvs = invwishart.rvs(df, scale)
1848
- np.random.seed(608072)
1849
- frozen_iw_rvs = iw.rvs()
2156
+ rng = np.random.RandomState(608072)
2157
+ iw_rvs = invwishart.rvs(df, scale, random_state=rng)
2158
+ rng = np.random.RandomState(608072)
2159
+ frozen_iw_rvs = iw.rvs(random_state=rng)
1850
2160
 
1851
2161
  # Manually calculate what it should be, based on the decomposition in
1852
2162
  # https://arxiv.org/abs/2310.15884 of an invers-Wishart into L L',
@@ -1855,12 +2165,12 @@ class TestInvwishart:
1855
2165
  # variates on the diagonal and N(0,1) variates in the lower triangle.
1856
2166
  # the diagonal chi^2 variates in this A are reversed compared to those
1857
2167
  # in the Bartlett decomposition A for Wishart rvs.
1858
- np.random.seed(608072)
1859
- covariances = np.random.normal(size=3)
2168
+ rng = np.random.RandomState(608072)
2169
+ covariances = rng.normal(size=3)
1860
2170
  variances = np.r_[
1861
- np.random.chisquare(df-2),
1862
- np.random.chisquare(df-1),
1863
- np.random.chisquare(df),
2171
+ rng.chisquare(df-2),
2172
+ rng.chisquare(df-1),
2173
+ rng.chisquare(df),
1864
2174
  ]**0.5
1865
2175
 
1866
2176
  # Construct the lower-triangular A matrix
@@ -1930,21 +2240,16 @@ class TestInvwishart:
1930
2240
 
1931
2241
  class TestSpecialOrthoGroup:
1932
2242
  def test_reproducibility(self):
1933
- np.random.seed(514)
1934
- x = special_ortho_group.rvs(3)
1935
- expected = np.array([[-0.99394515, -0.04527879, 0.10011432],
1936
- [0.04821555, -0.99846897, 0.02711042],
1937
- [0.09873351, 0.03177334, 0.99460653]])
1938
- assert_array_almost_equal(x, expected)
1939
-
1940
- random_state = np.random.RandomState(seed=514)
1941
- x = special_ortho_group.rvs(3, random_state=random_state)
2243
+ x = special_ortho_group.rvs(3, random_state=np.random.default_rng(514))
2244
+ expected = np.array([[-0.93200988, 0.01533561, -0.36210826],
2245
+ [0.35742128, 0.20446501, -0.91128705],
2246
+ [0.06006333, -0.97875374, -0.19604469]])
1942
2247
  assert_array_almost_equal(x, expected)
1943
2248
 
1944
2249
  def test_invalid_dim(self):
1945
2250
  assert_raises(ValueError, special_ortho_group.rvs, None)
1946
2251
  assert_raises(ValueError, special_ortho_group.rvs, (2, 2))
1947
- assert_raises(ValueError, special_ortho_group.rvs, 1)
2252
+ assert_raises(ValueError, special_ortho_group.rvs, -1)
1948
2253
  assert_raises(ValueError, special_ortho_group.rvs, 2.5)
1949
2254
 
1950
2255
  def test_frozen_matrix(self):
@@ -1979,8 +2284,9 @@ class TestSpecialOrthoGroup:
1979
2284
  dim = 5
1980
2285
  samples = 1000 # Not too many, or the test takes too long
1981
2286
  ks_prob = .05
1982
- np.random.seed(514)
1983
- xs = special_ortho_group.rvs(dim, size=samples)
2287
+ xs = special_ortho_group.rvs(
2288
+ dim, size=samples, random_state=np.random.default_rng(513)
2289
+ )
1984
2290
 
1985
2291
  # Dot a few rows (0, 1, 2) with unit vectors (0, 2, 4, 3),
1986
2292
  # effectively picking off entries in the matrices of xs.
@@ -1997,12 +2303,20 @@ class TestSpecialOrthoGroup:
1997
2303
  ks_tests = [ks_2samp(proj[p0], proj[p1])[1] for (p0, p1) in pairs]
1998
2304
  assert_array_less([ks_prob]*len(pairs), ks_tests)
1999
2305
 
2306
+ def test_one_by_one(self):
2307
+ # Test that the distribution is a delta function at the identity matrix
2308
+ # when dim=1
2309
+ assert_allclose(special_ortho_group.rvs(1, size=1000), 1, rtol=1e-13)
2310
+
2311
+ def test_zero_by_zero(self):
2312
+ assert_equal(special_ortho_group.rvs(0, size=4).shape, (4, 0, 0))
2313
+
2000
2314
 
2001
2315
  class TestOrthoGroup:
2002
2316
  def test_reproducibility(self):
2003
2317
  seed = 514
2004
- np.random.seed(seed)
2005
- x = ortho_group.rvs(3)
2318
+ rng = np.random.RandomState(seed)
2319
+ x = ortho_group.rvs(3, random_state=rng)
2006
2320
  x2 = ortho_group.rvs(3, random_state=seed)
2007
2321
  # Note this matrix has det -1, distinguishing O(N) from SO(N)
2008
2322
  assert_almost_equal(np.linalg.det(x), -1)
@@ -2015,7 +2329,7 @@ class TestOrthoGroup:
2015
2329
  def test_invalid_dim(self):
2016
2330
  assert_raises(ValueError, ortho_group.rvs, None)
2017
2331
  assert_raises(ValueError, ortho_group.rvs, (2, 2))
2018
- assert_raises(ValueError, ortho_group.rvs, 1)
2332
+ assert_raises(ValueError, ortho_group.rvs, -1)
2019
2333
  assert_raises(ValueError, ortho_group.rvs, 2.5)
2020
2334
 
2021
2335
  def test_frozen_matrix(self):
@@ -2067,8 +2381,8 @@ class TestOrthoGroup:
2067
2381
  dim = 5
2068
2382
  samples = 1000 # Not too many, or the test takes too long
2069
2383
  ks_prob = .05
2070
- np.random.seed(518) # Note that the test is sensitive to seed too
2071
- xs = ortho_group.rvs(dim, size=samples)
2384
+ rng = np.random.RandomState(518) # Note that the test is sensitive to seed too
2385
+ xs = ortho_group.rvs(dim, size=samples, random_state=rng)
2072
2386
 
2073
2387
  # Dot a few rows (0, 1, 2) with unit vectors (0, 2, 4, 3),
2074
2388
  # effectively picking off entries in the matrices of xs.
@@ -2085,19 +2399,34 @@ class TestOrthoGroup:
2085
2399
  ks_tests = [ks_2samp(proj[p0], proj[p1])[1] for (p0, p1) in pairs]
2086
2400
  assert_array_less([ks_prob]*len(pairs), ks_tests)
2087
2401
 
2402
+ def test_one_by_one(self):
2403
+ # Test that the 1x1 distribution gives ±1 with equal probability.
2404
+ dim = 1
2405
+ xs = ortho_group.rvs(dim, size=5000, random_state=np.random.default_rng(514))
2406
+ assert_allclose(np.abs(xs), 1, rtol=1e-13)
2407
+ k = np.sum(xs > 0)
2408
+ n = len(xs)
2409
+ res = stats.binomtest(k, n)
2410
+ low, high = res.proportion_ci(confidence_level=0.95)
2411
+ assert low < 0.5 < high
2412
+
2413
+ def test_zero_by_zero(self):
2414
+ assert_equal(special_ortho_group.rvs(0, size=4).shape, (4, 0, 0))
2415
+
2088
2416
  @pytest.mark.slow
2089
2417
  def test_pairwise_distances(self):
2090
2418
  # Test that the distribution of pairwise distances is close to correct.
2091
- np.random.seed(514)
2419
+ rng = np.random.RandomState(514)
2092
2420
 
2093
- def random_ortho(dim):
2094
- u, _s, v = np.linalg.svd(np.random.normal(size=(dim, dim)))
2421
+ def random_ortho(dim, random_state=None):
2422
+ u, _s, v = np.linalg.svd(rng.normal(size=(dim, dim)))
2095
2423
  return np.dot(u, v)
2096
2424
 
2097
2425
  for dim in range(2, 6):
2098
2426
  def generate_test_statistics(rvs, N=1000, eps=1e-10):
2099
2427
  stats = np.array([
2100
- np.sum((rvs(dim=dim) - rvs(dim=dim))**2)
2428
+ np.sum((rvs(dim=dim, random_state=rng) -
2429
+ rvs(dim=dim, random_state=rng))**2)
2101
2430
  for _ in range(N)
2102
2431
  ])
2103
2432
  # Add a bit of noise to account for numeric accuracy.
@@ -2114,9 +2443,9 @@ class TestOrthoGroup:
2114
2443
 
2115
2444
  class TestRandomCorrelation:
2116
2445
  def test_reproducibility(self):
2117
- np.random.seed(514)
2446
+ rng = np.random.RandomState(514)
2118
2447
  eigs = (.5, .8, 1.2, 1.5)
2119
- x = random_correlation.rvs(eigs)
2448
+ x = random_correlation.rvs(eigs, random_state=rng)
2120
2449
  x2 = random_correlation.rvs(eigs, random_state=514)
2121
2450
  expected = np.array([[1., -0.184851, 0.109017, -0.227494],
2122
2451
  [-0.184851, 1., 0.231236, 0.326669],
@@ -2157,13 +2486,13 @@ class TestRandomCorrelation:
2157
2486
  def norm(i, e):
2158
2487
  return i*e/sum(e)
2159
2488
 
2160
- np.random.seed(123)
2489
+ rng = np.random.RandomState(123)
2161
2490
 
2162
- eigs = [norm(i, np.random.uniform(size=i)) for i in range(2, 6)]
2491
+ eigs = [norm(i, rng.uniform(size=i)) for i in range(2, 6)]
2163
2492
  eigs.append([4,0,0,0])
2164
2493
 
2165
2494
  ones = [[1.]*len(e) for e in eigs]
2166
- xs = [random_correlation.rvs(e) for e in eigs]
2495
+ xs = [random_correlation.rvs(e, random_state=rng) for e in eigs]
2167
2496
 
2168
2497
  # Test that determinants are products of eigenvalues
2169
2498
  # These are positive by construction
@@ -2274,8 +2603,8 @@ class TestUniformDirection:
2274
2603
 
2275
2604
  class TestUnitaryGroup:
2276
2605
  def test_reproducibility(self):
2277
- np.random.seed(514)
2278
- x = unitary_group.rvs(3)
2606
+ rng = np.random.RandomState(514)
2607
+ x = unitary_group.rvs(3, random_state=rng)
2279
2608
  x2 = unitary_group.rvs(3, random_state=514)
2280
2609
 
2281
2610
  expected = np.array(
@@ -2290,7 +2619,7 @@ class TestUnitaryGroup:
2290
2619
  def test_invalid_dim(self):
2291
2620
  assert_raises(ValueError, unitary_group.rvs, None)
2292
2621
  assert_raises(ValueError, unitary_group.rvs, (2, 2))
2293
- assert_raises(ValueError, unitary_group.rvs, 1)
2622
+ assert_raises(ValueError, unitary_group.rvs, -1)
2294
2623
  assert_raises(ValueError, unitary_group.rvs, 2.5)
2295
2624
 
2296
2625
  def test_frozen_matrix(self):
@@ -2319,17 +2648,22 @@ class TestUnitaryGroup:
2319
2648
  # the complex plane, are uncorrelated.
2320
2649
 
2321
2650
  # Generate samples
2322
- dim = 5
2323
- samples = 1000 # Not too many, or the test takes too long
2324
- np.random.seed(514) # Note that the test is sensitive to seed too
2325
- xs = unitary_group.rvs(dim, size=samples)
2651
+ for dim in (1, 5):
2652
+ samples = 1000 # Not too many, or the test takes too long
2653
+ # Note that the test is sensitive to seed too
2654
+ xs = unitary_group.rvs(
2655
+ dim, size=samples, random_state=np.random.default_rng(514)
2656
+ )
2657
+
2658
+ # The angles "x" of the eigenvalues should be uniformly distributed
2659
+ # Overall this seems to be a necessary but weak test of the distribution.
2660
+ eigs = np.vstack([scipy.linalg.eigvals(x) for x in xs])
2661
+ x = np.arctan2(eigs.imag, eigs.real)
2662
+ res = kstest(x.ravel(), uniform(-np.pi, 2*np.pi).cdf)
2663
+ assert_(res.pvalue > 0.05)
2326
2664
 
2327
- # The angles "x" of the eigenvalues should be uniformly distributed
2328
- # Overall this seems to be a necessary but weak test of the distribution.
2329
- eigs = np.vstack([scipy.linalg.eigvals(x) for x in xs])
2330
- x = np.arctan2(eigs.imag, eigs.real)
2331
- res = kstest(x.ravel(), uniform(-np.pi, 2*np.pi).cdf)
2332
- assert_(res.pvalue > 0.05)
2665
+ def test_zero_by_zero(self):
2666
+ assert_equal(unitary_group.rvs(0, size=4).shape, (4, 0, 0))
2333
2667
 
2334
2668
 
2335
2669
  class TestMultivariateT:
@@ -2443,6 +2777,7 @@ class TestMultivariateT:
2443
2777
  _, p = normaltest(samples)
2444
2778
  assert ((p > P_VAL_MIN).all())
2445
2779
 
2780
+ @pytest.mark.thread_unsafe
2446
2781
  @patch('scipy.stats.multivariate_normal._logpdf')
2447
2782
  def test_mvt_with_inf_df_calls_normal(self, mock):
2448
2783
  dist = multivariate_t(0, 1, df=np.inf, seed=7)
@@ -3393,7 +3728,8 @@ def check_pickling(distfn, args):
3393
3728
  distfn.random_state = rndm
3394
3729
 
3395
3730
 
3396
- def test_random_state_property():
3731
+ @pytest.mark.thread_unsafe
3732
+ def test_random_state_property(num_parallel_threads):
3397
3733
  scale = np.eye(3)
3398
3734
  scale[0, 1] = 0.5
3399
3735
  scale[1, 0] = 0.5
@@ -3753,6 +4089,21 @@ class TestDirichletMultinomial:
3753
4089
  assert_equal(dist.var(), 0)
3754
4090
  assert_equal(dist.cov(), 0)
3755
4091
 
4092
+ def test_n_is_zero(self):
4093
+ # similarly, only one possible outcome if n is zero
4094
+ n = 0
4095
+ alpha = np.asarray([1., 1.])
4096
+ x = np.asarray([0, 0])
4097
+ dist = dirichlet_multinomial(alpha, n)
4098
+
4099
+ assert_equal(dist.pmf(x), 1)
4100
+ assert_equal(dist.pmf(x+1), 0)
4101
+ assert_equal(dist.logpmf(x), 0)
4102
+ assert_equal(dist.logpmf(x+1), -np.inf)
4103
+ assert_equal(dist.mean(), [0, 0])
4104
+ assert_equal(dist.var(), [0, 0])
4105
+ assert_equal(dist.cov(), [[0, 0], [0, 0]])
4106
+
3756
4107
  @pytest.mark.parametrize('method_name', ['pmf', 'logpmf'])
3757
4108
  def test_against_betabinom_pmf(self, method_name):
3758
4109
  rng, m, alpha, n, x = self.get_params(100)
@@ -3815,11 +4166,11 @@ class TestDirichletMultinomial:
3815
4166
  with assert_raises(ValueError, match=text):
3816
4167
  dirichlet_multinomial.logpmf(x0, [3, -1, 4], n0)
3817
4168
 
3818
- text = "`n` must be a positive integer."
4169
+ text = "`n` must be a non-negative integer."
3819
4170
  with assert_raises(ValueError, match=text):
3820
4171
  dirichlet_multinomial.logpmf(x0, alpha0, 49.1)
3821
4172
  with assert_raises(ValueError, match=text):
3822
- dirichlet_multinomial.logpmf(x0, alpha0, 0)
4173
+ dirichlet_multinomial.logpmf(x0, alpha0, -1)
3823
4174
 
3824
4175
  x = np.array([1, 2, 3, 4])
3825
4176
  alpha = np.array([3, 4, 5])