scipy 1.15.3__cp313-cp313t-win_amd64.whl → 1.16.0rc2__cp313-cp313t-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 +7 -7
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cp313t-win_amd64.dll.a +0 -0
  4. scipy/_cyutility.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  9. scipy/_lib/_ccallback_c.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  13. scipy/_lib/_fpumode.cp313t-win_amd64.pyd +0 -0
  14. scipy/_lib/_sparse.py +41 -0
  15. scipy/_lib/_test_ccallback.cp313t-win_amd64.dll.a +0 -0
  16. scipy/_lib/_test_ccallback.cp313t-win_amd64.pyd +0 -0
  17. scipy/_lib/_test_deprecation_call.cp313t-win_amd64.dll.a +0 -0
  18. scipy/_lib/_test_deprecation_call.cp313t-win_amd64.pyd +0 -0
  19. scipy/_lib/_test_deprecation_def.cp313t-win_amd64.dll.a +0 -0
  20. scipy/_lib/_test_deprecation_def.cp313t-win_amd64.pyd +0 -0
  21. scipy/_lib/_testutils.py +6 -2
  22. scipy/_lib/_uarray/_uarray.cp313t-win_amd64.dll.a +0 -0
  23. scipy/_lib/_uarray/_uarray.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  72. scipy/_lib/messagestream.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  105. scipy/cluster/_hierarchy.cp313t-win_amd64.pyd +0 -0
  106. scipy/cluster/_optimal_leaf_ordering.cp313t-win_amd64.dll.a +0 -0
  107. scipy/cluster/_optimal_leaf_ordering.cp313t-win_amd64.pyd +0 -0
  108. scipy/cluster/_vq.cp313t-win_amd64.dll.a +0 -0
  109. scipy/cluster/_vq.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  127. scipy/fft/_pocketfft/pypocketfft.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  136. scipy/fftpack/convolve.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  142. scipy/integrate/_dop.cp313t-win_amd64.pyd +0 -0
  143. scipy/integrate/_lsoda.cp313t-win_amd64.dll.a +0 -0
  144. scipy/integrate/_lsoda.cp313t-win_amd64.pyd +0 -0
  145. scipy/integrate/_ode.py +9 -2
  146. scipy/integrate/_odepack.cp313t-win_amd64.dll.a +0 -0
  147. scipy/integrate/_odepack.cp313t-win_amd64.pyd +0 -0
  148. scipy/integrate/_quad_vec.py +21 -29
  149. scipy/integrate/_quadpack.cp313t-win_amd64.dll.a +0 -0
  150. scipy/integrate/_quadpack.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  156. scipy/integrate/_test_multivariate.cp313t-win_amd64.pyd +0 -0
  157. scipy/integrate/_test_odeint_banded.cp313t-win_amd64.dll.a +0 -0
  158. scipy/integrate/_test_odeint_banded.cp313t-win_amd64.pyd +0 -0
  159. scipy/integrate/_vode.cp313t-win_amd64.dll.a +0 -0
  160. scipy/integrate/_vode.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  171. scipy/interpolate/_dfitpack.cp313t-win_amd64.pyd +0 -0
  172. scipy/interpolate/_dierckx.cp313t-win_amd64.dll.a +0 -0
  173. scipy/interpolate/_dierckx.cp313t-win_amd64.pyd +0 -0
  174. scipy/interpolate/_fitpack.cp313t-win_amd64.dll.a +0 -0
  175. scipy/interpolate/_fitpack.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  180. scipy/interpolate/_interpnd.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  186. scipy/interpolate/_ppoly.cp313t-win_amd64.pyd +0 -0
  187. scipy/interpolate/_rbf.py +2 -2
  188. scipy/interpolate/_rbfinterp.py +1 -1
  189. scipy/interpolate/_rbfinterp_pythran.cp313t-win_amd64.dll.a +0 -0
  190. scipy/interpolate/_rbfinterp_pythran.cp313t-win_amd64.pyd +0 -0
  191. scipy/interpolate/_rgi.py +31 -26
  192. scipy/interpolate/_rgi_cython.cp313t-win_amd64.dll.a +0 -0
  193. scipy/interpolate/_rgi_cython.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  204. scipy/io/_fast_matrix_market/_fmm_core.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  210. scipy/io/_test_fortran.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  216. scipy/io/matlab/_mio5_utils.cp313t-win_amd64.pyd +0 -0
  217. scipy/io/matlab/_mio_utils.cp313t-win_amd64.dll.a +0 -0
  218. scipy/io/matlab/_mio_utils.cp313t-win_amd64.pyd +0 -0
  219. scipy/io/matlab/_miobase.py +4 -1
  220. scipy/io/matlab/_streams.cp313t-win_amd64.dll.a +0 -0
  221. scipy/io/matlab/_streams.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  229. scipy/linalg/_cythonized_array_utils.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  234. scipy/linalg/_decomp_interpolative.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  238. scipy/linalg/_decomp_lu_cython.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  245. scipy/linalg/_decomp_update.cp313t-win_amd64.pyd +0 -0
  246. scipy/linalg/_expm_frechet.py +4 -0
  247. scipy/linalg/_fblas.cp313t-win_amd64.dll.a +0 -0
  248. scipy/linalg/_fblas.cp313t-win_amd64.pyd +0 -0
  249. scipy/linalg/_flapack.cp313t-win_amd64.dll.a +0 -0
  250. scipy/linalg/_flapack.cp313t-win_amd64.pyd +0 -0
  251. scipy/linalg/_linalg_pythran.cp313t-win_amd64.dll.a +0 -0
  252. scipy/linalg/_linalg_pythran.cp313t-win_amd64.pyd +0 -0
  253. scipy/linalg/_matfuncs.py +187 -4
  254. scipy/linalg/_matfuncs_expm.cp313t-win_amd64.dll.a +0 -0
  255. scipy/linalg/_matfuncs_expm.cp313t-win_amd64.pyd +0 -0
  256. scipy/linalg/_matfuncs_schur_sqrtm.cp313t-win_amd64.dll.a +0 -0
  257. scipy/linalg/_matfuncs_schur_sqrtm.cp313t-win_amd64.pyd +0 -0
  258. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  259. scipy/linalg/_matfuncs_sqrtm_triu.cp313t-win_amd64.dll.a +0 -0
  260. scipy/linalg/_matfuncs_sqrtm_triu.cp313t-win_amd64.pyd +0 -0
  261. scipy/linalg/_procrustes.py +2 -0
  262. scipy/linalg/_sketches.py +17 -6
  263. scipy/linalg/_solve_toeplitz.cp313t-win_amd64.dll.a +0 -0
  264. scipy/linalg/_solve_toeplitz.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  268. scipy/linalg/cython_blas.cp313t-win_amd64.pyd +0 -0
  269. scipy/linalg/cython_lapack.cp313t-win_amd64.dll.a +0 -0
  270. scipy/linalg/cython_lapack.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  286. scipy/ndimage/_ctest.cp313t-win_amd64.pyd +0 -0
  287. scipy/ndimage/_cytest.cp313t-win_amd64.dll.a +0 -0
  288. scipy/ndimage/_cytest.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  295. scipy/ndimage/_nd_image.cp313t-win_amd64.pyd +0 -0
  296. scipy/ndimage/_ni_docstrings.py +5 -1
  297. scipy/ndimage/_ni_label.cp313t-win_amd64.dll.a +0 -0
  298. scipy/ndimage/_ni_label.cp313t-win_amd64.pyd +0 -0
  299. scipy/ndimage/_ni_support.py +1 -5
  300. scipy/ndimage/_rank_filter_1d.cp313t-win_amd64.dll.a +0 -0
  301. scipy/ndimage/_rank_filter_1d.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  310. scipy/odr/__odrpack.cp313t-win_amd64.pyd +0 -0
  311. scipy/optimize/_basinhopping.py +13 -7
  312. scipy/optimize/_bglu_dense.cp313t-win_amd64.dll.a +0 -0
  313. scipy/optimize/_bglu_dense.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  321. scipy/optimize/_direct.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  325. scipy/optimize/_group_columns.cp313t-win_amd64.pyd +0 -0
  326. scipy/optimize/_highspy/_core.cp313t-win_amd64.dll.a +0 -0
  327. scipy/optimize/_highspy/_core.cp313t-win_amd64.pyd +0 -0
  328. scipy/optimize/_highspy/_highs_options.cp313t-win_amd64.dll.a +0 -0
  329. scipy/optimize/_highspy/_highs_options.cp313t-win_amd64.pyd +0 -0
  330. scipy/optimize/_lbfgsb.cp313t-win_amd64.dll.a +0 -0
  331. scipy/optimize/_lbfgsb.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  338. scipy/optimize/_lsap.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  342. scipy/optimize/_lsq/givens_elimination.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  349. scipy/optimize/_minpack.cp313t-win_amd64.pyd +0 -0
  350. scipy/optimize/_minpack_py.py +21 -14
  351. scipy/optimize/_moduleTNC.cp313t-win_amd64.dll.a +0 -0
  352. scipy/optimize/_moduleTNC.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  358. scipy/optimize/_pava_pybind.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  365. scipy/optimize/_slsqplib.cp313t-win_amd64.pyd +0 -0
  366. scipy/optimize/_spectral.py +1 -1
  367. scipy/optimize/_tnc.py +8 -1
  368. scipy/optimize/_trlib/_trlib.cp313t-win_amd64.dll.a +0 -0
  369. scipy/optimize/_trlib/_trlib.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  381. scipy/optimize/_zeros.cp313t-win_amd64.pyd +0 -0
  382. scipy/optimize/_zeros_py.py +97 -17
  383. scipy/optimize/cython_optimize/_zeros.cp313t-win_amd64.dll.a +0 -0
  384. scipy/optimize/cython_optimize/_zeros.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  416. scipy/signal/_max_len_seq_inner.cp313t-win_amd64.pyd +0 -0
  417. scipy/signal/_peak_finding_utils.cp313t-win_amd64.dll.a +0 -0
  418. scipy/signal/_peak_finding_utils.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  424. scipy/signal/_sigtools.cp313t-win_amd64.pyd +0 -0
  425. scipy/signal/_sosfilt.cp313t-win_amd64.dll.a +0 -0
  426. scipy/signal/_sosfilt.cp313t-win_amd64.pyd +0 -0
  427. scipy/signal/_spectral_py.py +230 -50
  428. scipy/signal/_spline.cp313t-win_amd64.dll.a +0 -0
  429. scipy/signal/_spline.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  434. scipy/signal/_upfirdn_apply.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  461. scipy/sparse/_csparsetools.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  469. scipy/sparse/_sparsetools.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  478. scipy/sparse/csgraph/_flow.cp313t-win_amd64.pyd +0 -0
  479. scipy/sparse/csgraph/_matching.cp313t-win_amd64.dll.a +0 -0
  480. scipy/sparse/csgraph/_matching.cp313t-win_amd64.pyd +0 -0
  481. scipy/sparse/csgraph/_min_spanning_tree.cp313t-win_amd64.dll.a +0 -0
  482. scipy/sparse/csgraph/_min_spanning_tree.cp313t-win_amd64.pyd +0 -0
  483. scipy/sparse/csgraph/_reordering.cp313t-win_amd64.dll.a +0 -0
  484. scipy/sparse/csgraph/_reordering.cp313t-win_amd64.pyd +0 -0
  485. scipy/sparse/csgraph/_shortest_path.cp313t-win_amd64.dll.a +0 -0
  486. scipy/sparse/csgraph/_shortest_path.cp313t-win_amd64.pyd +0 -0
  487. scipy/sparse/csgraph/_tools.cp313t-win_amd64.dll.a +0 -0
  488. scipy/sparse/csgraph/_tools.cp313t-win_amd64.pyd +0 -0
  489. scipy/sparse/csgraph/_traversal.cp313t-win_amd64.dll.a +0 -0
  490. scipy/sparse/csgraph/_traversal.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  499. scipy/sparse/linalg/_dsolve/_superlu.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  503. scipy/sparse/linalg/_eigen/arpack/_arpack.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  516. scipy/sparse/linalg/_propack/_cpropack.cp313t-win_amd64.pyd +0 -0
  517. scipy/sparse/linalg/_propack/_dpropack.cp313t-win_amd64.dll.a +0 -0
  518. scipy/sparse/linalg/_propack/_dpropack.cp313t-win_amd64.pyd +0 -0
  519. scipy/sparse/linalg/_propack/_spropack.cp313t-win_amd64.dll.a +0 -0
  520. scipy/sparse/linalg/_propack/_spropack.cp313t-win_amd64.pyd +0 -0
  521. scipy/sparse/linalg/_propack/_zpropack.cp313t-win_amd64.dll.a +0 -0
  522. scipy/sparse/linalg/_propack/_zpropack.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  533. scipy/spatial/_ckdtree.cp313t-win_amd64.pyd +0 -0
  534. scipy/spatial/_distance_pybind.cp313t-win_amd64.dll.a +0 -0
  535. scipy/spatial/_distance_pybind.cp313t-win_amd64.pyd +0 -0
  536. scipy/spatial/_distance_wrap.cp313t-win_amd64.dll.a +0 -0
  537. scipy/spatial/_distance_wrap.cp313t-win_amd64.pyd +0 -0
  538. scipy/spatial/_hausdorff.cp313t-win_amd64.dll.a +0 -0
  539. scipy/spatial/_hausdorff.cp313t-win_amd64.pyd +0 -0
  540. scipy/spatial/_qhull.cp313t-win_amd64.dll.a +0 -0
  541. scipy/spatial/_qhull.cp313t-win_amd64.pyd +0 -0
  542. scipy/spatial/_voronoi.cp313t-win_amd64.dll.a +0 -0
  543. scipy/spatial/_voronoi.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  550. scipy/spatial/transform/_rigid_transform.cp313t-win_amd64.pyd +0 -0
  551. scipy/spatial/transform/_rotation.cp313t-win_amd64.dll.a +0 -0
  552. scipy/spatial/transform/_rotation.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  561. scipy/special/_comb.cp313t-win_amd64.pyd +0 -0
  562. scipy/special/_ellip_harm_2.cp313t-win_amd64.dll.a +0 -0
  563. scipy/special/_ellip_harm_2.cp313t-win_amd64.pyd +0 -0
  564. scipy/special/_gufuncs.cp313t-win_amd64.dll.a +0 -0
  565. scipy/special/_gufuncs.cp313t-win_amd64.pyd +0 -0
  566. scipy/special/_logsumexp.py +67 -58
  567. scipy/special/_orthogonal.pyi +1 -1
  568. scipy/special/_specfun.cp313t-win_amd64.dll.a +0 -0
  569. scipy/special/_specfun.cp313t-win_amd64.pyd +0 -0
  570. scipy/special/_special_ufuncs.cp313t-win_amd64.dll.a +0 -0
  571. scipy/special/_special_ufuncs.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  575. scipy/special/_test_internal.cp313t-win_amd64.pyd +0 -0
  576. scipy/special/_testutils.py +4 -4
  577. scipy/special/_ufuncs.cp313t-win_amd64.dll.a +0 -0
  578. scipy/special/_ufuncs.cp313t-win_amd64.pyd +0 -0
  579. scipy/special/_ufuncs.pyi +1 -0
  580. scipy/special/_ufuncs.pyx +215 -1400
  581. scipy/special/_ufuncs_cxx.cp313t-win_amd64.dll.a +0 -0
  582. scipy/special/_ufuncs_cxx.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  588. scipy/special/cython_special.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  606. scipy/stats/_ansari_swilk_statistics.cp313t-win_amd64.pyd +0 -0
  607. scipy/stats/_axis_nan_policy.py +5 -12
  608. scipy/stats/_biasedurn.cp313t-win_amd64.dll.a +0 -0
  609. scipy/stats/_biasedurn.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  624. scipy/stats/_levy_stable/levyst.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  634. scipy/stats/_qmc_cy.cp313t-win_amd64.pyd +0 -0
  635. scipy/stats/_qmvnt.py +16 -95
  636. scipy/stats/_qmvnt_cy.cp313t-win_amd64.dll.a +0 -0
  637. scipy/stats/_qmvnt_cy.cp313t-win_amd64.pyd +0 -0
  638. scipy/stats/_quantile.py +335 -0
  639. scipy/stats/_rcont/rcont.cp313t-win_amd64.dll.a +0 -0
  640. scipy/stats/_rcont/rcont.cp313t-win_amd64.pyd +0 -0
  641. scipy/stats/_resampling.py +4 -29
  642. scipy/stats/_sampling.py +1 -1
  643. scipy/stats/_sobol.cp313t-win_amd64.dll.a +0 -0
  644. scipy/stats/_sobol.cp313t-win_amd64.pyd +0 -0
  645. scipy/stats/_stats.cp313t-win_amd64.dll.a +0 -0
  646. scipy/stats/_stats.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  650. scipy/stats/_stats_pythran.cp313t-win_amd64.pyd +0 -0
  651. scipy/stats/_unuran/unuran_wrapper.cp313t-win_amd64.dll.a +0 -0
  652. scipy/stats/_unuran/unuran_wrapper.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  687. scipy/interpolate/_bspl.cp313t-win_amd64.pyd +0 -0
  688. scipy/optimize/_cobyla.cp313t-win_amd64.dll.a +0 -0
  689. scipy/optimize/_cobyla.cp313t-win_amd64.pyd +0 -0
  690. scipy/optimize/_cython_nnls.cp313t-win_amd64.dll.a +0 -0
  691. scipy/optimize/_cython_nnls.cp313t-win_amd64.pyd +0 -0
  692. scipy/optimize/_slsqp.cp313t-win_amd64.dll.a +0 -0
  693. scipy/optimize/_slsqp.cp313t-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.cp313t-win_amd64.dll.a +0 -0
  756. scipy/stats/_mvn.cp313t-win_amd64.pyd +0 -0
  757. scipy-1.15.3.dist-info/DELVEWHEEL +0 -2
  758. /scipy-1.15.3-cp313-cp313t-win_amd64.whl → /scipy-1.16.0rc2-cp313-cp313t-win_amd64.whl +0 -0
  759. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
@@ -31,6 +31,18 @@ def download_all(path=None):
31
31
  path : str, optional
32
32
  Directory path to download all the dataset files.
33
33
  If None, default to the system cache_dir detected by pooch.
34
+
35
+ Examples
36
+ --------
37
+ Download the datasets to the default cache location:
38
+
39
+ >>> from scipy import datasets
40
+ >>> datasets.download_all()
41
+
42
+ Download the datasets to the current directory:
43
+
44
+ >>> datasets.download_all(".")
45
+
34
46
  """
35
47
  if pooch is None:
36
48
  raise ImportError("Missing optional dependency 'pooch' required "
@@ -38,10 +50,12 @@ def download_all(path=None):
38
50
  "conda to install 'pooch'.")
39
51
  if path is None:
40
52
  path = pooch.os_cache('scipy-data')
53
+ # https://github.com/scipy/scipy/issues/21879
54
+ downloader = pooch.HTTPDownloader(headers={"User-Agent": "SciPy"})
41
55
  for dataset_name, dataset_hash in _registry.registry.items():
42
56
  pooch.retrieve(url=_registry.registry_urls[dataset_name],
43
57
  known_hash=dataset_hash,
44
- fname=dataset_name, path=path)
58
+ fname=dataset_name, path=path, downloader=downloader)
45
59
 
46
60
 
47
61
  def main():
@@ -1,3 +1,5 @@
1
+ import sys
2
+
1
3
  from numpy import array, frombuffer, load
2
4
  from ._registry import registry, registry_urls
3
5
 
@@ -27,8 +29,12 @@ def fetch_data(dataset_name, data_fetcher=data_fetcher):
27
29
  raise ImportError("Missing optional dependency 'pooch' required "
28
30
  "for scipy.datasets module. Please use pip or "
29
31
  "conda to install 'pooch'.")
32
+ # https://github.com/scipy/scipy/issues/21879
33
+ downloader = pooch.HTTPDownloader(
34
+ headers={"User-Agent": f"SciPy {sys.modules['scipy'].__version__}"}
35
+ )
30
36
  # The "fetch" method returns the full path to the downloaded data file.
31
- return data_fetcher.fetch(dataset_name)
37
+ return data_fetcher.fetch(dataset_name, downloader=downloader)
32
38
 
33
39
 
34
40
  def ascent():
scipy/datasets/_utils.py CHANGED
@@ -29,7 +29,7 @@ def _clear_cache(datasets, cache_dir=None, method_map=None):
29
29
  print(f"Cleaning the cache directory {cache_dir}!")
30
30
  shutil.rmtree(cache_dir)
31
31
  else:
32
- if not isinstance(datasets, (list, tuple)):
32
+ if not isinstance(datasets, list | tuple):
33
33
  # single dataset method passed should be converted to list
34
34
  datasets = [datasets, ]
35
35
  for dataset in datasets:
@@ -3,7 +3,8 @@ import warnings
3
3
  import numpy as np
4
4
  import scipy._lib._elementwise_iterative_method as eim
5
5
  from scipy._lib._util import _RichResult
6
- from scipy._lib._array_api import array_namespace, xp_sign, xp_copy, xp_take_along_axis
6
+ from scipy._lib._array_api import array_namespace, xp_copy, xp_promote
7
+ import scipy._lib.array_api_extra as xpx
7
8
 
8
9
  _EERRORINCREASE = -1 # used in derivative
9
10
 
@@ -400,11 +401,11 @@ def derivative(f, x, *, args=(), tolerances=None, maxiter=10,
400
401
  # that `hdir` can be broadcasted to the final shape. Same with `h0`.
401
402
  hdir = xp.broadcast_to(hdir, shape)
402
403
  hdir = xp.reshape(hdir, (-1,))
403
- hdir = xp.astype(xp_sign(hdir), dtype)
404
+ hdir = xp.astype(xp.sign(hdir), dtype)
404
405
  h0 = xp.broadcast_to(h0, shape)
405
406
  h0 = xp.reshape(h0, (-1,))
406
407
  h0 = xp.astype(h0, dtype)
407
- h0[h0 <= 0] = xp.asarray(xp.nan, dtype=dtype)
408
+ h0 = xpx.at(h0)[h0 <= 0].set(xp.nan)
408
409
 
409
410
  status = xp.full_like(x, eim._EINPROGRESS, dtype=xp.int32) # in progress
410
411
  nit, nfev = 0, 1 # one function evaluations performed above
@@ -477,9 +478,9 @@ def derivative(f, x, *, args=(), tolerances=None, maxiter=10,
477
478
  n_new = 2*n if work.nit == 0 else 2 # number of new abscissae
478
479
  x_eval = xp.zeros((work.hdir.shape[0], n_new), dtype=work.dtype)
479
480
  il, ic, ir = work.il, work.ic, work.ir
480
- x_eval[ir] = work.x[ir][:, xp.newaxis] + hr[ir]
481
- x_eval[ic] = work.x[ic][:, xp.newaxis] + hc[ic]
482
- x_eval[il] = work.x[il][:, xp.newaxis] - hr[il]
481
+ x_eval = xpx.at(x_eval)[ir].set(work.x[ir][:, xp.newaxis] + hr[ir])
482
+ x_eval = xpx.at(x_eval)[ic].set(work.x[ic][:, xp.newaxis] + hc[ic])
483
+ x_eval = xpx.at(x_eval)[il].set(work.x[il][:, xp.newaxis] - hr[il])
483
484
  return x_eval
484
485
 
485
486
  def post_func_eval(x, f, work):
@@ -529,14 +530,14 @@ def derivative(f, x, *, args=(), tolerances=None, maxiter=10,
529
530
  fo = xp.concat((work_fo[:, 0:1], work_fo[:, -2*n:]), axis=-1)
530
531
 
531
532
  work.fs = xp.zeros((ic.shape[0], work.fs.shape[-1] + 2*n_new), dtype=work.dtype)
532
- work.fs[ic] = work_fc
533
- work.fs[io] = work_fo
533
+ work.fs = xpx.at(work.fs)[ic].set(work_fc)
534
+ work.fs = xpx.at(work.fs)[io].set(work_fo)
534
535
 
535
536
  wc, wo = _derivative_weights(work, n, xp)
536
537
  work.df_last = xp.asarray(work.df, copy=True)
537
- work.df[ic] = fc @ wc / work.h[ic]
538
- work.df[io] = fo @ wo / work.h[io]
539
- work.df[il] *= -1
538
+ work.df = xpx.at(work.df)[ic].set(fc @ wc / work.h[ic])
539
+ work.df = xpx.at(work.df)[io].set(fo @ wo / work.h[io])
540
+ work.df = xpx.at(work.df)[il].multiply(-1)
540
541
 
541
542
  work.h /= work.fac
542
543
  work.error_last = work.error
@@ -554,13 +555,14 @@ def derivative(f, x, *, args=(), tolerances=None, maxiter=10,
554
555
  stop = xp.astype(xp.zeros_like(work.df), xp.bool)
555
556
 
556
557
  i = work.error < work.atol + work.rtol*abs(work.df)
557
- work.status[i] = eim._ECONVERGED
558
- stop[i] = True
558
+ work.status = xpx.at(work.status)[i].set(eim._ECONVERGED)
559
+ stop = xpx.at(stop)[i].set(True)
559
560
 
560
561
  if work.nit > 0:
561
562
  i = ~((xp.isfinite(work.x) & xp.isfinite(work.df)) | stop)
562
- work.df[i], work.status[i] = xp.nan, eim._EVALUEERR
563
- stop[i] = True
563
+ work.df = xpx.at(work.df)[i].set(xp.nan)
564
+ work.status = xpx.at(work.status)[i].set(eim._EVALUEERR)
565
+ stop = xpx.at(stop)[i].set(True)
564
566
 
565
567
  # With infinite precision, there is a step size below which
566
568
  # all smaller step sizes will reduce the error. But in floating point
@@ -570,8 +572,8 @@ def derivative(f, x, *, args=(), tolerances=None, maxiter=10,
570
572
  # detecting a step size that minimizes the total error, but this
571
573
  # heuristic seems simple and effective.
572
574
  i = (work.error > work.error_last*10) & ~stop
573
- work.status[i] = _EERRORINCREASE
574
- stop[i] = True
575
+ work.status = xpx.at(work.status)[i].set(_EERRORINCREASE)
576
+ stop = xpx.at(stop)[i].set(True)
575
577
 
576
578
  return stop
577
579
 
@@ -906,9 +908,7 @@ def jacobian(f, x, *, tolerances=None, maxiter=10, order=8, initial_step=0.5,
906
908
 
907
909
  """
908
910
  xp = array_namespace(x)
909
- x = xp.asarray(x)
910
- int_dtype = xp.isdtype(x.dtype, 'integral')
911
- x0 = xp.asarray(x, dtype=xp.asarray(1.0).dtype) if int_dtype else x
911
+ x0 = xp_promote(x, force_floating=True, xp=xp)
912
912
 
913
913
  if x0.ndim < 1:
914
914
  message = "Argument `x` must be at least 1-D."
@@ -925,7 +925,7 @@ def jacobian(f, x, *, tolerances=None, maxiter=10, order=8, initial_step=0.5,
925
925
  if x.ndim != x0.ndim:
926
926
  xph = xp.expand_dims(xph, axis=-1)
927
927
  xph = xp_copy(xp.broadcast_to(xph, new_shape), xp=xp)
928
- xph[i, i] = x
928
+ xph = xpx.at(xph)[i, i].set(x)
929
929
  return f(xph)
930
930
 
931
931
  res = derivative(wrapped, x, tolerances=tolerances,
@@ -1097,9 +1097,9 @@ def hessian(f, x, *, tolerances=None, maxiter=10,
1097
1097
  rtol = tolerances.get('rtol', None)
1098
1098
 
1099
1099
  xp = array_namespace(x)
1100
- x = xp.asarray(x)
1101
- dtype = x.dtype if not xp.isdtype(x.dtype, 'integral') else xp.asarray(1.).dtype
1102
- finfo = xp.finfo(dtype)
1100
+ x0 = xp_promote(x, force_floating=True, xp=xp)
1101
+
1102
+ finfo = xp.finfo(x0.dtype)
1103
1103
  rtol = finfo.eps**0.5 if rtol is None else rtol # keep same as `derivative`
1104
1104
 
1105
1105
  # tighten the inner tolerance to make the inner error negligible
@@ -1121,7 +1121,7 @@ def hessian(f, x, *, tolerances=None, maxiter=10,
1121
1121
 
1122
1122
  nfev = xp.cumulative_sum(xp.stack(nfev), axis=0)
1123
1123
  res_nit = xp.astype(res.nit[xp.newaxis, ...], xp.int64) # appease torch
1124
- res.nfev = xp_take_along_axis(nfev, res_nit, axis=0)[0]
1124
+ res.nfev = xp.take_along_axis(nfev, res_nit, axis=0)[0]
1125
1125
  res.ddf = res.df
1126
1126
  del res.df # this is renamed to ddf
1127
1127
  del res.nit # this is only the outer-jacobian nit
@@ -3,24 +3,20 @@ import pytest
3
3
 
4
4
  import numpy as np
5
5
 
6
- from scipy.conftest import array_api_compatible
7
6
  import scipy._lib._elementwise_iterative_method as eim
7
+ import scipy._lib.array_api_extra as xpx
8
8
  from scipy._lib._array_api_no_0d import xp_assert_close, xp_assert_equal, xp_assert_less
9
- from scipy._lib._array_api import is_numpy, is_torch, array_namespace
9
+ from scipy._lib._array_api import is_numpy, is_torch
10
10
 
11
11
  from scipy import stats, optimize, special
12
12
  from scipy.differentiate import derivative, jacobian, hessian
13
13
  from scipy.differentiate._differentiate import _EERRORINCREASE
14
14
 
15
-
16
- pytestmark = [array_api_compatible, pytest.mark.usefixtures("skip_xp_backends")]
17
-
18
15
  array_api_strict_skip_reason = 'Array API does not support fancy indexing assignment.'
19
- jax_skip_reason = 'JAX arrays do not support item assignment.'
20
16
 
21
17
 
22
18
  @pytest.mark.skip_xp_backends('array_api_strict', reason=array_api_strict_skip_reason)
23
- @pytest.mark.skip_xp_backends('jax.numpy',reason=jax_skip_reason)
19
+ @pytest.mark.skip_xp_backends('dask.array', reason='boolean indexing assignment')
24
20
  class TestDerivative:
25
21
 
26
22
  def f(self, x):
@@ -40,7 +36,7 @@ class TestDerivative:
40
36
 
41
37
  @pytest.mark.skip_xp_backends(np_only=True)
42
38
  @pytest.mark.parametrize('case', stats._distr_params.distcont)
43
- def test_accuracy(self, case):
39
+ def test_accuracy(self, case, xp):
44
40
  distname, params = case
45
41
  dist = getattr(stats, distname)(*params)
46
42
  x = dist.median() + 0.1
@@ -215,12 +211,13 @@ class TestDerivative:
215
211
  # test that `step_direction` works as expected
216
212
  def f(x):
217
213
  y = xp.exp(x)
218
- y[(x < 0) + (x > 2)] = xp.nan
214
+ y = xpx.at(y)[(x < 0) + (x > 2)].set(xp.nan)
219
215
  return y
220
216
 
221
217
  x = xp.linspace(0, 2, 10)
222
218
  step_direction = xp.zeros_like(x)
223
- step_direction[x < 0.6], step_direction[x > 1.4] = 1, -1
219
+ step_direction = xpx.at(step_direction)[x < 0.6].set(1)
220
+ step_direction = xpx.at(step_direction)[x > 1.4].set(-1)
224
221
  res = derivative(f, x, step_direction=step_direction)
225
222
  xp_assert_close(res.df, xp.exp(x))
226
223
  assert xp.all(res.success)
@@ -380,8 +377,7 @@ class TestDerivative:
380
377
  # Test that integers are not passed to `f`
381
378
  # (otherwise this would overflow)
382
379
  def f(x):
383
- xp_test = array_namespace(x) # needs `isdtype`
384
- assert xp_test.isdtype(x.dtype, 'real floating')
380
+ assert xp.isdtype(x.dtype, 'real floating')
385
381
  return x ** 99 - 1
386
382
 
387
383
  if not is_torch(xp): # torch defaults to float32
@@ -435,7 +431,7 @@ class TestDerivative:
435
431
  (lambda x: (x - 1) ** 3, 1),
436
432
  (lambda x: np.where(x > 1, (x - 1) ** 5, (x - 1) ** 3), 1)
437
433
  ))
438
- def test_saddle_gh18811(self, case):
434
+ def test_saddle_gh18811(self, case, xp):
439
435
  # With default settings, `derivative` will not always converge when
440
436
  # the true derivative is exactly zero. This tests that specifying a
441
437
  # (tight) `atol` alleviates the problem. See discussion in gh-18811.
@@ -476,7 +472,7 @@ class JacobianHessianTest:
476
472
 
477
473
 
478
474
  @pytest.mark.skip_xp_backends('array_api_strict', reason=array_api_strict_skip_reason)
479
- @pytest.mark.skip_xp_backends('jax.numpy',reason=jax_skip_reason)
475
+ @pytest.mark.skip_xp_backends('dask.array', reason='boolean indexing assignment')
480
476
  class TestJacobian(JacobianHessianTest):
481
477
  jh_func = jacobian
482
478
 
@@ -586,9 +582,10 @@ class TestJacobian(JacobianHessianTest):
586
582
  return xp.sin(2*x) * y**2
587
583
 
588
584
  res = jacobian(df1, z, initial_step=10)
589
- if is_numpy(xp):
590
- assert len(np.unique(res.nit)) == 4
591
- assert len(np.unique(res.nfev)) == 4
585
+ # FIXME https://github.com/scipy/scipy/pull/22320#discussion_r1914898175
586
+ if not is_torch(xp):
587
+ assert xpx.nunique(res.nit) == 4
588
+ assert xpx.nunique(res.nfev) == 4
592
589
 
593
590
  res00 = jacobian(lambda x: df1_0xy(x, z[1]), z[0:1], initial_step=10)
594
591
  res01 = jacobian(lambda y: df1_0xy(z[0], y), z[1:2], initial_step=10)
@@ -598,7 +595,10 @@ class TestJacobian(JacobianHessianTest):
598
595
  for attr in ['success', 'status', 'df', 'nit', 'nfev']:
599
596
  ref_attr = xp.asarray([[getattr(res00, attr), getattr(res01, attr)],
600
597
  [getattr(res10, attr), getattr(res11, attr)]])
601
- ref[attr] = xp.squeeze(ref_attr)
598
+ ref[attr] = xp.squeeze(
599
+ ref_attr,
600
+ axis=tuple(ax for ax, size in enumerate(ref_attr.shape) if size == 1)
601
+ )
602
602
  rtol = 1.5e-5 if res[attr].dtype == xp.float32 else 1.5e-14
603
603
  xp_assert_close(res[attr], ref[attr], rtol=rtol)
604
604
 
@@ -610,10 +610,10 @@ class TestJacobian(JacobianHessianTest):
610
610
  eps = 1e-7 # torch needs wiggle room?
611
611
 
612
612
  def f(x):
613
- x[0, x[0] < b[0]] = xp.nan
614
- x[0, x[0] > b[0] + 0.25] = xp.nan
615
- x[1, x[1] > b[1]] = xp.nan
616
- x[1, x[1] < b[1] - 0.1-eps] = xp.nan
613
+ x = xpx.at(x)[0, x[0] < b[0]].set(xp.nan)
614
+ x = xpx.at(x)[0, x[0] > b[0] + 0.25].set(xp.nan)
615
+ x = xpx.at(x)[1, x[1] > b[1]].set(xp.nan)
616
+ x = xpx.at(x)[1, x[1] < b[1] - 0.1-eps].set(xp.nan)
617
617
  return TestJacobian.f5(x, xp)
618
618
 
619
619
  dir = [1, -1, 0]
@@ -627,7 +627,7 @@ class TestJacobian(JacobianHessianTest):
627
627
 
628
628
 
629
629
  @pytest.mark.skip_xp_backends('array_api_strict', reason=array_api_strict_skip_reason)
630
- @pytest.mark.skip_xp_backends('jax.numpy',reason=jax_skip_reason)
630
+ @pytest.mark.skip_xp_backends('dask.array', reason='boolean indexing assignment')
631
631
  class TestHessian(JacobianHessianTest):
632
632
  jh_func = hessian
633
633
 
@@ -663,10 +663,9 @@ class TestHessian(JacobianHessianTest):
663
663
 
664
664
  def test_nfev(self, xp):
665
665
  z = xp.asarray([0.5, 0.25])
666
- xp_test = array_namespace(z)
667
666
 
668
667
  def f1(z):
669
- x, y = xp_test.broadcast_arrays(*z)
668
+ x, y = xp.broadcast_arrays(*z)
670
669
  f1.nfev = f1.nfev + (math.prod(x.shape[2:]) if x.ndim > 2 else 1)
671
670
  return xp.sin(x) * y ** 3
672
671
  f1.nfev = 0
scipy/fft/_basic.py CHANGED
@@ -1166,6 +1166,17 @@ def rfft2(x, s=None, axes=(-2, -1), norm=None, overwrite_x=False, workers=None,
1166
1166
  This is really just `rfftn` with different default behavior.
1167
1167
  For more details see `rfftn`.
1168
1168
 
1169
+ Examples
1170
+ --------
1171
+ >>> import scipy.fft
1172
+ >>> import numpy as np
1173
+ >>> x = np.broadcast_to([1, 0, -1, 0], (4, 4))
1174
+ >>> scipy.fft.rfft2(x)
1175
+ array([[0.+0.j, 8.+0.j, 0.+0.j],
1176
+ [0.+0.j, 0.+0.j, 0.+0.j],
1177
+ [0.+0.j, 0.+0.j, 0.+0.j],
1178
+ [0.+0.j, 0.+0.j, 0.+0.j]])
1179
+
1169
1180
  """
1170
1181
  return (Dispatchable(x, np.ndarray),)
1171
1182
 
@@ -1484,6 +1495,15 @@ def hfft2(x, s=None, axes=(-2, -1), norm=None, overwrite_x=False, workers=None,
1484
1495
  This is really just `hfftn` with different default behavior.
1485
1496
  For more details see `hfftn`.
1486
1497
 
1498
+ Examples
1499
+ --------
1500
+ >>> import scipy.fft
1501
+ >>> import numpy as np
1502
+ >>> x = np.array([[1+0j, 2+0j], [2+0j, 1+0j]]) # Hermitian-symmetric input
1503
+ >>> scipy.fft.hfft2(x, s=(2, 2))
1504
+ array([[ 6., 0.],
1505
+ [ 0., -2.]])
1506
+
1487
1507
  """
1488
1508
  return (Dispatchable(x, np.ndarray),)
1489
1509
 
scipy/fft/_helper.py CHANGED
@@ -7,6 +7,9 @@ import numpy as np
7
7
  from scipy._lib._array_api import array_namespace
8
8
 
9
9
 
10
+ _init_nd_shape_and_axes = _helper._init_nd_shape_and_axes
11
+
12
+
10
13
  def next_fast_len(target, real=False):
11
14
  """Find the next fast size of input data to ``fft``, for zero-padding, etc.
12
15
 
@@ -140,40 +143,6 @@ prev_fast_len.__wrapped__ = _helper.prev_good_size
140
143
  prev_fast_len.__signature__ = _sig_prev_fast_len
141
144
 
142
145
 
143
- def _init_nd_shape_and_axes(x, shape, axes):
144
- """Handle shape and axes arguments for N-D transforms.
145
-
146
- Returns the shape and axes in a standard form, taking into account negative
147
- values and checking for various potential errors.
148
-
149
- Parameters
150
- ----------
151
- x : array_like
152
- The input array.
153
- shape : int or array_like of ints or None
154
- The shape of the result. If both `shape` and `axes` (see below) are
155
- None, `shape` is ``x.shape``; if `shape` is None but `axes` is
156
- not None, then `shape` is ``numpy.take(x.shape, axes, axis=0)``.
157
- If `shape` is -1, the size of the corresponding dimension of `x` is
158
- used.
159
- axes : int or array_like of ints or None
160
- Axes along which the calculation is computed.
161
- The default is over all axes.
162
- Negative indices are automatically converted to their positive
163
- counterparts.
164
-
165
- Returns
166
- -------
167
- shape : tuple
168
- The shape of the result as a tuple of integers.
169
- axes : list
170
- Axes along which the calculation is computed, as a list of integers.
171
-
172
- """
173
- x = np.asarray(x)
174
- return _helper._init_nd_shape_and_axes(x, shape, axes)
175
-
176
-
177
146
  def fftfreq(n, d=1.0, *, xp=None, device=None):
178
147
  """Return the Discrete Fourier Transform sample frequencies.
179
148
 
@@ -44,7 +44,35 @@ def _iterable_of_int(x, name=None):
44
44
 
45
45
 
46
46
  def _init_nd_shape_and_axes(x, shape, axes):
47
- """Handles shape and axes arguments for nd transforms"""
47
+ """
48
+ Handle shape and axes arguments for N-D transforms.
49
+
50
+ Returns the shape and axes in a standard form, taking into account negative
51
+ values and checking for various potential errors.
52
+
53
+ Parameters
54
+ ----------
55
+ x : ndarray
56
+ The input array.
57
+ shape : int or array_like of ints or None
58
+ The shape of the result. If both `shape` and `axes` (see below) are
59
+ None, `shape` is ``x.shape``; if `shape` is None but `axes` is
60
+ not None, then `shape` is ``numpy.take(x.shape, axes, axis=0)``.
61
+ If `shape` is -1, the size of the corresponding dimension of `x` is
62
+ used.
63
+ axes : int or array_like of ints or None
64
+ Axes along which the calculation is computed.
65
+ The default is over all axes.
66
+ Negative indices are automatically converted to their positive
67
+ counterparts.
68
+
69
+ Returns
70
+ -------
71
+ shape : tuple
72
+ The shape of the result as a tuple of integers.
73
+ axes : list
74
+ Axes along which the calculation is computed, as a list of integers.
75
+ """
48
76
  noshape = shape is None
49
77
  noaxes = axes is None
50
78
 
@@ -406,10 +406,8 @@ class _TestIRFFTBase:
406
406
  y2 = rfft(irfft(x, n=(size*2-1)))
407
407
  assert_equal(y1.dtype, self.rdt)
408
408
  assert_equal(y2.dtype, self.cdt)
409
- assert_array_almost_equal(y1, x, decimal=self.ndec,
410
- err_msg="size=%d" % size)
411
- assert_array_almost_equal(y2, x, decimal=self.ndec,
412
- err_msg="size=%d" % size)
409
+ assert_array_almost_equal(y1, x, decimal=self.ndec, err_msg=f"size={size}")
410
+ assert_array_almost_equal(y2, x, decimal=self.ndec, err_msg=f"size={size}")
413
411
 
414
412
  def test_size_accuracy(self):
415
413
  # Sanity check for the accuracy for prime and non-prime sized inputs
@@ -30,8 +30,8 @@ def is_longdouble_binary_compatible():
30
30
  def reference_data():
31
31
  # Matlab reference data
32
32
  MDATA = np.load(join(fftpack_test_dir, 'test.npz'))
33
- X = [MDATA['x%d' % i] for i in range(MDATA_COUNT)]
34
- Y = [MDATA['y%d' % i] for i in range(MDATA_COUNT)]
33
+ X = [MDATA[f'x{i}'] for i in range(MDATA_COUNT)]
34
+ Y = [MDATA[f'y{i}'] for i in range(MDATA_COUNT)]
35
35
 
36
36
  # FFTW reference data: the data are organized as follows:
37
37
  # * SIZES is an array containing all available sizes
@@ -100,7 +100,7 @@ def fftw_dct_ref(type, size, dt, reference_data):
100
100
  data = reference_data['FFTWDATA_LONGDOUBLE']
101
101
  else:
102
102
  raise ValueError()
103
- y = (data['dct_%d_%d' % (type, size)]).astype(dt)
103
+ y = (data[f'dct_{type}_{size}']).astype(dt)
104
104
  return x, y, dt
105
105
 
106
106
 
@@ -115,7 +115,7 @@ def fftw_dst_ref(type, size, dt, reference_data):
115
115
  data = reference_data['FFTWDATA_LONGDOUBLE']
116
116
  else:
117
117
  raise ValueError()
118
- y = (data['dst_%d_%d' % (type, size)]).astype(dt)
118
+ y = (data[f'dst_{type}_{size}']).astype(dt)
119
119
  return x, y, dt
120
120
 
121
121
 
@@ -621,6 +621,19 @@ def dst(x, type=2, n=None, axis=-1, norm=None, overwrite_x=False, workers=None,
621
621
  The (unnormalized) DST-IV is its own inverse, up to a factor :math:`2N`. The
622
622
  orthonormalized DST-IV is exactly its own inverse.
623
623
 
624
+ Examples
625
+ --------
626
+ Compute the DST of a simple 1D array:
627
+
628
+ >>> import numpy as np
629
+ >>> from scipy.fft import dst
630
+ >>> x = np.array([1, -1, 1, -1])
631
+ >>> dst(x, type=2)
632
+ array([0., 0., 0., 8.])
633
+
634
+ This computes the Discrete Sine Transform (DST) of type-II for the input array.
635
+ The output contains the transformed values corresponding to the given input sequence
636
+
624
637
  References
625
638
  ----------
626
639
  .. [1] Wikipedia, "Discrete sine transform",
@@ -7,12 +7,10 @@ from numpy.random import random
7
7
  from numpy.testing import assert_array_almost_equal, assert_allclose
8
8
  from pytest import raises as assert_raises
9
9
  import scipy.fft as fft
10
- from scipy.conftest import array_api_compatible
11
10
  from scipy._lib._array_api import (
12
- array_namespace, xp_size, xp_assert_close, xp_assert_equal
11
+ is_numpy, xp_size, xp_assert_close, xp_assert_equal
13
12
  )
14
13
 
15
- pytestmark = [array_api_compatible, pytest.mark.usefixtures("skip_xp_backends")]
16
14
  skip_xp_backends = pytest.mark.skip_xp_backends
17
15
 
18
16
 
@@ -230,10 +228,10 @@ class TestFFT:
230
228
  dtype = get_expected_input_dtype(op, xp)
231
229
  x = xp.asarray(random((30, 20, 10)), dtype=dtype)
232
230
  axes = [(0, 1, 2), (0, 2, 1), (1, 0, 2), (1, 2, 0), (2, 0, 1), (2, 1, 0)]
233
- xp_test = array_namespace(x)
231
+
234
232
  for a in axes:
235
- op_tr = op(xp_test.permute_dims(x, axes=a))
236
- tr_op = xp_test.permute_dims(op(x, axes=a), axes=a)
233
+ op_tr = op(xp.permute_dims(x, axes=a))
234
+ tr_op = xp.permute_dims(op(x, axes=a), axes=a)
237
235
  xp_assert_close(op_tr, tr_op)
238
236
 
239
237
  @pytest.mark.parametrize("op", [fft.fftn, fft.ifftn, fft.rfftn, fft.irfftn])
@@ -250,15 +248,15 @@ class TestFFT:
250
248
  dtype = get_expected_input_dtype(op, xp)
251
249
  x = xp.asarray(random((16, 8, 4)), dtype=dtype)
252
250
  axes = [(0, 1, 2), (0, 2, 1), (1, 2, 0)]
253
- xp_test = array_namespace(x)
251
+
254
252
  for a in axes:
255
253
  # different shape on the first two axes
256
254
  shape = tuple([2*x.shape[ax] if ax in a[:2] else x.shape[ax]
257
255
  for ax in range(x.ndim)])
258
256
  # transform only the first two axes
259
- op_tr = op(xp_test.permute_dims(x, axes=a),
257
+ op_tr = op(xp.permute_dims(x, axes=a),
260
258
  s=shape[:2], axes=(0, 1))
261
- tr_op = xp_test.permute_dims(op(x, s=shape[:2], axes=a[:2]),
259
+ tr_op = xp.permute_dims(op(x, s=shape[:2], axes=a[:2]),
262
260
  axes=a)
263
261
  xp_assert_close(op_tr, tr_op)
264
262
 
@@ -270,21 +268,21 @@ class TestFFT:
270
268
  dtype = get_expected_input_dtype(op, xp)
271
269
  x = xp.asarray(random((16, 8, 4)), dtype=dtype)
272
270
  axes = [(0, 1, 2), (0, 2, 1), (1, 2, 0)]
273
- xp_test = array_namespace(x)
271
+
274
272
  for a in axes:
275
273
  # different shape on the first two axes
276
274
  shape = tuple([2*x.shape[ax] if ax in a[:2] else x.shape[ax]
277
275
  for ax in range(x.ndim)])
278
276
  # transform only the first two axes
279
- op_tr = op(xp_test.permute_dims(x, axes=a), s=shape[:2], axes=(0, 1))
280
- tr_op = xp_test.permute_dims(op(x, s=shape[:2], axes=a[:2]), axes=a)
277
+ op_tr = op(xp.permute_dims(x, axes=a), s=shape[:2], axes=(0, 1))
278
+ tr_op = xp.permute_dims(op(x, s=shape[:2], axes=a[:2]), axes=a)
281
279
  xp_assert_close(op_tr, tr_op)
282
280
 
283
281
  def test_all_1d_norm_preserving(self, xp):
284
282
  # verify that round-trip transforms are norm-preserving
285
283
  x = xp.asarray(random(30), dtype=xp.float64)
286
- xp_test = array_namespace(x)
287
- x_norm = xp_test.linalg.vector_norm(x)
284
+
285
+ x_norm = xp.linalg.vector_norm(x)
288
286
  n = xp_size(x) * 2
289
287
  func_pairs = [(fft.rfft, fft.irfft),
290
288
  # hfft: order so the first function takes x.size samples
@@ -296,16 +294,16 @@ class TestFFT:
296
294
  for forw, back in func_pairs:
297
295
  if forw == fft.fft:
298
296
  x = xp.asarray(x, dtype=xp.complex128)
299
- x_norm = xp_test.linalg.vector_norm(x)
297
+ x_norm = xp.linalg.vector_norm(x)
300
298
  for n in [xp_size(x), 2*xp_size(x)]:
301
299
  for norm in ['backward', 'ortho', 'forward']:
302
300
  tmp = forw(x, n=n, norm=norm)
303
301
  tmp = back(tmp, n=n, norm=norm)
304
- xp_assert_close(xp_test.linalg.vector_norm(tmp), x_norm)
302
+ xp_assert_close(xp.linalg.vector_norm(tmp), x_norm)
305
303
 
306
304
  @skip_xp_backends(np_only=True)
307
305
  @pytest.mark.parametrize("dtype", [np.float16, np.longdouble])
308
- def test_dtypes_nonstandard(self, dtype):
306
+ def test_dtypes_nonstandard(self, dtype, xp):
309
307
  x = random(30).astype(dtype)
310
308
  out_dtypes = {np.float16: np.complex64, np.longdouble: np.clongdouble}
311
309
  x_complex = x.astype(out_dtypes[dtype])
@@ -368,7 +366,7 @@ class TestFFT:
368
366
  "fft",
369
367
  [fft.fft, fft.fft2, fft.fftn,
370
368
  fft.ifft, fft.ifft2, fft.ifftn])
371
- def test_fft_with_order(dtype, order, fft):
369
+ def test_fft_with_order(dtype, order, fft, xp):
372
370
  # Check that FFT/IFFT produces identical results for C, Fortran and
373
371
  # non contiguous arrays
374
372
  rng = np.random.RandomState(42)
@@ -450,7 +448,7 @@ class TestFFTThreadSafe:
450
448
 
451
449
  @skip_xp_backends(np_only=True)
452
450
  @pytest.mark.parametrize("func", [fft.fft, fft.ifft, fft.rfft, fft.irfft])
453
- def test_multiprocess(func):
451
+ def test_multiprocess(func, xp):
454
452
  # Test that fft still works after fork (gh-10422)
455
453
 
456
454
  with multiprocessing.Pool(2) as p:
@@ -483,13 +481,17 @@ def test_non_standard_params(func, xp):
483
481
  else:
484
482
  dtype = xp.complex128
485
483
 
486
- if xp.__name__ != 'numpy':
487
- x = xp.asarray([1, 2, 3], dtype=dtype)
488
- # func(x) should not raise an exception
489
- func(x)
484
+ x = xp.asarray([1, 2, 3], dtype=dtype)
485
+ # func(x) should not raise an exception
486
+ func(x)
487
+
488
+ if is_numpy(xp):
489
+ func(x, workers=2)
490
+ else:
490
491
  assert_raises(ValueError, func, x, workers=2)
491
- # `plan` param is not tested since SciPy does not use it currently
492
- # but should be tested if it comes into use
492
+
493
+ # `plan` param is not tested since SciPy does not use it currently
494
+ # but should be tested if it comes into use
493
495
 
494
496
 
495
497
  @pytest.mark.parametrize("dtype", ['float32', 'float64'])