scipy 1.15.3__cp312-cp312-win_amd64.whl → 1.16.0rc2__cp312-cp312-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.cp312-win_amd64.dll.a +0 -0
  4. scipy/_cyutility.cp312-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.cp312-win_amd64.dll.a +0 -0
  9. scipy/_lib/_ccallback_c.cp312-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.cp312-win_amd64.dll.a +0 -0
  13. scipy/_lib/_fpumode.cp312-win_amd64.pyd +0 -0
  14. scipy/_lib/_sparse.py +41 -0
  15. scipy/_lib/_test_ccallback.cp312-win_amd64.dll.a +0 -0
  16. scipy/_lib/_test_ccallback.cp312-win_amd64.pyd +0 -0
  17. scipy/_lib/_test_deprecation_call.cp312-win_amd64.dll.a +0 -0
  18. scipy/_lib/_test_deprecation_call.cp312-win_amd64.pyd +0 -0
  19. scipy/_lib/_test_deprecation_def.cp312-win_amd64.dll.a +0 -0
  20. scipy/_lib/_test_deprecation_def.cp312-win_amd64.pyd +0 -0
  21. scipy/_lib/_testutils.py +6 -2
  22. scipy/_lib/_uarray/_uarray.cp312-win_amd64.dll.a +0 -0
  23. scipy/_lib/_uarray/_uarray.cp312-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.cp312-win_amd64.dll.a +0 -0
  72. scipy/_lib/messagestream.cp312-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.cp312-win_amd64.dll.a +0 -0
  105. scipy/cluster/_hierarchy.cp312-win_amd64.pyd +0 -0
  106. scipy/cluster/_optimal_leaf_ordering.cp312-win_amd64.dll.a +0 -0
  107. scipy/cluster/_optimal_leaf_ordering.cp312-win_amd64.pyd +0 -0
  108. scipy/cluster/_vq.cp312-win_amd64.dll.a +0 -0
  109. scipy/cluster/_vq.cp312-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.cp312-win_amd64.dll.a +0 -0
  127. scipy/fft/_pocketfft/pypocketfft.cp312-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.cp312-win_amd64.dll.a +0 -0
  136. scipy/fftpack/convolve.cp312-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.cp312-win_amd64.dll.a +0 -0
  142. scipy/integrate/_dop.cp312-win_amd64.pyd +0 -0
  143. scipy/integrate/_lsoda.cp312-win_amd64.dll.a +0 -0
  144. scipy/integrate/_lsoda.cp312-win_amd64.pyd +0 -0
  145. scipy/integrate/_ode.py +9 -2
  146. scipy/integrate/_odepack.cp312-win_amd64.dll.a +0 -0
  147. scipy/integrate/_odepack.cp312-win_amd64.pyd +0 -0
  148. scipy/integrate/_quad_vec.py +21 -29
  149. scipy/integrate/_quadpack.cp312-win_amd64.dll.a +0 -0
  150. scipy/integrate/_quadpack.cp312-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.cp312-win_amd64.dll.a +0 -0
  156. scipy/integrate/_test_multivariate.cp312-win_amd64.pyd +0 -0
  157. scipy/integrate/_test_odeint_banded.cp312-win_amd64.dll.a +0 -0
  158. scipy/integrate/_test_odeint_banded.cp312-win_amd64.pyd +0 -0
  159. scipy/integrate/_vode.cp312-win_amd64.dll.a +0 -0
  160. scipy/integrate/_vode.cp312-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.cp312-win_amd64.dll.a +0 -0
  171. scipy/interpolate/_dfitpack.cp312-win_amd64.pyd +0 -0
  172. scipy/interpolate/_dierckx.cp312-win_amd64.dll.a +0 -0
  173. scipy/interpolate/_dierckx.cp312-win_amd64.pyd +0 -0
  174. scipy/interpolate/_fitpack.cp312-win_amd64.dll.a +0 -0
  175. scipy/interpolate/_fitpack.cp312-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.cp312-win_amd64.dll.a +0 -0
  180. scipy/interpolate/_interpnd.cp312-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.cp312-win_amd64.dll.a +0 -0
  186. scipy/interpolate/_ppoly.cp312-win_amd64.pyd +0 -0
  187. scipy/interpolate/_rbf.py +2 -2
  188. scipy/interpolate/_rbfinterp.py +1 -1
  189. scipy/interpolate/_rbfinterp_pythran.cp312-win_amd64.dll.a +0 -0
  190. scipy/interpolate/_rbfinterp_pythran.cp312-win_amd64.pyd +0 -0
  191. scipy/interpolate/_rgi.py +31 -26
  192. scipy/interpolate/_rgi_cython.cp312-win_amd64.dll.a +0 -0
  193. scipy/interpolate/_rgi_cython.cp312-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.cp312-win_amd64.dll.a +0 -0
  204. scipy/io/_fast_matrix_market/_fmm_core.cp312-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.cp312-win_amd64.dll.a +0 -0
  210. scipy/io/_test_fortran.cp312-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.cp312-win_amd64.dll.a +0 -0
  216. scipy/io/matlab/_mio5_utils.cp312-win_amd64.pyd +0 -0
  217. scipy/io/matlab/_mio_utils.cp312-win_amd64.dll.a +0 -0
  218. scipy/io/matlab/_mio_utils.cp312-win_amd64.pyd +0 -0
  219. scipy/io/matlab/_miobase.py +4 -1
  220. scipy/io/matlab/_streams.cp312-win_amd64.dll.a +0 -0
  221. scipy/io/matlab/_streams.cp312-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.cp312-win_amd64.dll.a +0 -0
  229. scipy/linalg/_cythonized_array_utils.cp312-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.cp312-win_amd64.dll.a +0 -0
  234. scipy/linalg/_decomp_interpolative.cp312-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.cp312-win_amd64.dll.a +0 -0
  238. scipy/linalg/_decomp_lu_cython.cp312-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.cp312-win_amd64.dll.a +0 -0
  245. scipy/linalg/_decomp_update.cp312-win_amd64.pyd +0 -0
  246. scipy/linalg/_expm_frechet.py +4 -0
  247. scipy/linalg/_fblas.cp312-win_amd64.dll.a +0 -0
  248. scipy/linalg/_fblas.cp312-win_amd64.pyd +0 -0
  249. scipy/linalg/_flapack.cp312-win_amd64.dll.a +0 -0
  250. scipy/linalg/_flapack.cp312-win_amd64.pyd +0 -0
  251. scipy/linalg/_linalg_pythran.cp312-win_amd64.dll.a +0 -0
  252. scipy/linalg/_linalg_pythran.cp312-win_amd64.pyd +0 -0
  253. scipy/linalg/_matfuncs.py +187 -4
  254. scipy/linalg/_matfuncs_expm.cp312-win_amd64.dll.a +0 -0
  255. scipy/linalg/_matfuncs_expm.cp312-win_amd64.pyd +0 -0
  256. scipy/linalg/_matfuncs_schur_sqrtm.cp312-win_amd64.dll.a +0 -0
  257. scipy/linalg/_matfuncs_schur_sqrtm.cp312-win_amd64.pyd +0 -0
  258. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  259. scipy/linalg/_matfuncs_sqrtm_triu.cp312-win_amd64.dll.a +0 -0
  260. scipy/linalg/_matfuncs_sqrtm_triu.cp312-win_amd64.pyd +0 -0
  261. scipy/linalg/_procrustes.py +2 -0
  262. scipy/linalg/_sketches.py +17 -6
  263. scipy/linalg/_solve_toeplitz.cp312-win_amd64.dll.a +0 -0
  264. scipy/linalg/_solve_toeplitz.cp312-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.cp312-win_amd64.dll.a +0 -0
  268. scipy/linalg/cython_blas.cp312-win_amd64.pyd +0 -0
  269. scipy/linalg/cython_lapack.cp312-win_amd64.dll.a +0 -0
  270. scipy/linalg/cython_lapack.cp312-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.cp312-win_amd64.dll.a +0 -0
  286. scipy/ndimage/_ctest.cp312-win_amd64.pyd +0 -0
  287. scipy/ndimage/_cytest.cp312-win_amd64.dll.a +0 -0
  288. scipy/ndimage/_cytest.cp312-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.cp312-win_amd64.dll.a +0 -0
  295. scipy/ndimage/_nd_image.cp312-win_amd64.pyd +0 -0
  296. scipy/ndimage/_ni_docstrings.py +5 -1
  297. scipy/ndimage/_ni_label.cp312-win_amd64.dll.a +0 -0
  298. scipy/ndimage/_ni_label.cp312-win_amd64.pyd +0 -0
  299. scipy/ndimage/_ni_support.py +1 -5
  300. scipy/ndimage/_rank_filter_1d.cp312-win_amd64.dll.a +0 -0
  301. scipy/ndimage/_rank_filter_1d.cp312-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.cp312-win_amd64.dll.a +0 -0
  310. scipy/odr/__odrpack.cp312-win_amd64.pyd +0 -0
  311. scipy/optimize/_basinhopping.py +13 -7
  312. scipy/optimize/_bglu_dense.cp312-win_amd64.dll.a +0 -0
  313. scipy/optimize/_bglu_dense.cp312-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.cp312-win_amd64.dll.a +0 -0
  321. scipy/optimize/_direct.cp312-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.cp312-win_amd64.dll.a +0 -0
  325. scipy/optimize/_group_columns.cp312-win_amd64.pyd +0 -0
  326. scipy/optimize/_highspy/_core.cp312-win_amd64.dll.a +0 -0
  327. scipy/optimize/_highspy/_core.cp312-win_amd64.pyd +0 -0
  328. scipy/optimize/_highspy/_highs_options.cp312-win_amd64.dll.a +0 -0
  329. scipy/optimize/_highspy/_highs_options.cp312-win_amd64.pyd +0 -0
  330. scipy/optimize/_lbfgsb.cp312-win_amd64.dll.a +0 -0
  331. scipy/optimize/_lbfgsb.cp312-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.cp312-win_amd64.dll.a +0 -0
  338. scipy/optimize/_lsap.cp312-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.cp312-win_amd64.dll.a +0 -0
  342. scipy/optimize/_lsq/givens_elimination.cp312-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.cp312-win_amd64.dll.a +0 -0
  349. scipy/optimize/_minpack.cp312-win_amd64.pyd +0 -0
  350. scipy/optimize/_minpack_py.py +21 -14
  351. scipy/optimize/_moduleTNC.cp312-win_amd64.dll.a +0 -0
  352. scipy/optimize/_moduleTNC.cp312-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.cp312-win_amd64.dll.a +0 -0
  358. scipy/optimize/_pava_pybind.cp312-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.cp312-win_amd64.dll.a +0 -0
  365. scipy/optimize/_slsqplib.cp312-win_amd64.pyd +0 -0
  366. scipy/optimize/_spectral.py +1 -1
  367. scipy/optimize/_tnc.py +8 -1
  368. scipy/optimize/_trlib/_trlib.cp312-win_amd64.dll.a +0 -0
  369. scipy/optimize/_trlib/_trlib.cp312-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.cp312-win_amd64.dll.a +0 -0
  381. scipy/optimize/_zeros.cp312-win_amd64.pyd +0 -0
  382. scipy/optimize/_zeros_py.py +97 -17
  383. scipy/optimize/cython_optimize/_zeros.cp312-win_amd64.dll.a +0 -0
  384. scipy/optimize/cython_optimize/_zeros.cp312-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.cp312-win_amd64.dll.a +0 -0
  416. scipy/signal/_max_len_seq_inner.cp312-win_amd64.pyd +0 -0
  417. scipy/signal/_peak_finding_utils.cp312-win_amd64.dll.a +0 -0
  418. scipy/signal/_peak_finding_utils.cp312-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.cp312-win_amd64.dll.a +0 -0
  424. scipy/signal/_sigtools.cp312-win_amd64.pyd +0 -0
  425. scipy/signal/_sosfilt.cp312-win_amd64.dll.a +0 -0
  426. scipy/signal/_sosfilt.cp312-win_amd64.pyd +0 -0
  427. scipy/signal/_spectral_py.py +230 -50
  428. scipy/signal/_spline.cp312-win_amd64.dll.a +0 -0
  429. scipy/signal/_spline.cp312-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.cp312-win_amd64.dll.a +0 -0
  434. scipy/signal/_upfirdn_apply.cp312-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.cp312-win_amd64.dll.a +0 -0
  461. scipy/sparse/_csparsetools.cp312-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.cp312-win_amd64.dll.a +0 -0
  469. scipy/sparse/_sparsetools.cp312-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.cp312-win_amd64.dll.a +0 -0
  478. scipy/sparse/csgraph/_flow.cp312-win_amd64.pyd +0 -0
  479. scipy/sparse/csgraph/_matching.cp312-win_amd64.dll.a +0 -0
  480. scipy/sparse/csgraph/_matching.cp312-win_amd64.pyd +0 -0
  481. scipy/sparse/csgraph/_min_spanning_tree.cp312-win_amd64.dll.a +0 -0
  482. scipy/sparse/csgraph/_min_spanning_tree.cp312-win_amd64.pyd +0 -0
  483. scipy/sparse/csgraph/_reordering.cp312-win_amd64.dll.a +0 -0
  484. scipy/sparse/csgraph/_reordering.cp312-win_amd64.pyd +0 -0
  485. scipy/sparse/csgraph/_shortest_path.cp312-win_amd64.dll.a +0 -0
  486. scipy/sparse/csgraph/_shortest_path.cp312-win_amd64.pyd +0 -0
  487. scipy/sparse/csgraph/_tools.cp312-win_amd64.dll.a +0 -0
  488. scipy/sparse/csgraph/_tools.cp312-win_amd64.pyd +0 -0
  489. scipy/sparse/csgraph/_traversal.cp312-win_amd64.dll.a +0 -0
  490. scipy/sparse/csgraph/_traversal.cp312-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.cp312-win_amd64.dll.a +0 -0
  499. scipy/sparse/linalg/_dsolve/_superlu.cp312-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.cp312-win_amd64.dll.a +0 -0
  503. scipy/sparse/linalg/_eigen/arpack/_arpack.cp312-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.cp312-win_amd64.dll.a +0 -0
  516. scipy/sparse/linalg/_propack/_cpropack.cp312-win_amd64.pyd +0 -0
  517. scipy/sparse/linalg/_propack/_dpropack.cp312-win_amd64.dll.a +0 -0
  518. scipy/sparse/linalg/_propack/_dpropack.cp312-win_amd64.pyd +0 -0
  519. scipy/sparse/linalg/_propack/_spropack.cp312-win_amd64.dll.a +0 -0
  520. scipy/sparse/linalg/_propack/_spropack.cp312-win_amd64.pyd +0 -0
  521. scipy/sparse/linalg/_propack/_zpropack.cp312-win_amd64.dll.a +0 -0
  522. scipy/sparse/linalg/_propack/_zpropack.cp312-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.cp312-win_amd64.dll.a +0 -0
  533. scipy/spatial/_ckdtree.cp312-win_amd64.pyd +0 -0
  534. scipy/spatial/_distance_pybind.cp312-win_amd64.dll.a +0 -0
  535. scipy/spatial/_distance_pybind.cp312-win_amd64.pyd +0 -0
  536. scipy/spatial/_distance_wrap.cp312-win_amd64.dll.a +0 -0
  537. scipy/spatial/_distance_wrap.cp312-win_amd64.pyd +0 -0
  538. scipy/spatial/_hausdorff.cp312-win_amd64.dll.a +0 -0
  539. scipy/spatial/_hausdorff.cp312-win_amd64.pyd +0 -0
  540. scipy/spatial/_qhull.cp312-win_amd64.dll.a +0 -0
  541. scipy/spatial/_qhull.cp312-win_amd64.pyd +0 -0
  542. scipy/spatial/_voronoi.cp312-win_amd64.dll.a +0 -0
  543. scipy/spatial/_voronoi.cp312-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.cp312-win_amd64.dll.a +0 -0
  550. scipy/spatial/transform/_rigid_transform.cp312-win_amd64.pyd +0 -0
  551. scipy/spatial/transform/_rotation.cp312-win_amd64.dll.a +0 -0
  552. scipy/spatial/transform/_rotation.cp312-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.cp312-win_amd64.dll.a +0 -0
  561. scipy/special/_comb.cp312-win_amd64.pyd +0 -0
  562. scipy/special/_ellip_harm_2.cp312-win_amd64.dll.a +0 -0
  563. scipy/special/_ellip_harm_2.cp312-win_amd64.pyd +0 -0
  564. scipy/special/_gufuncs.cp312-win_amd64.dll.a +0 -0
  565. scipy/special/_gufuncs.cp312-win_amd64.pyd +0 -0
  566. scipy/special/_logsumexp.py +67 -58
  567. scipy/special/_orthogonal.pyi +1 -1
  568. scipy/special/_specfun.cp312-win_amd64.dll.a +0 -0
  569. scipy/special/_specfun.cp312-win_amd64.pyd +0 -0
  570. scipy/special/_special_ufuncs.cp312-win_amd64.dll.a +0 -0
  571. scipy/special/_special_ufuncs.cp312-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.cp312-win_amd64.dll.a +0 -0
  575. scipy/special/_test_internal.cp312-win_amd64.pyd +0 -0
  576. scipy/special/_testutils.py +4 -4
  577. scipy/special/_ufuncs.cp312-win_amd64.dll.a +0 -0
  578. scipy/special/_ufuncs.cp312-win_amd64.pyd +0 -0
  579. scipy/special/_ufuncs.pyi +1 -0
  580. scipy/special/_ufuncs.pyx +215 -1400
  581. scipy/special/_ufuncs_cxx.cp312-win_amd64.dll.a +0 -0
  582. scipy/special/_ufuncs_cxx.cp312-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.cp312-win_amd64.dll.a +0 -0
  588. scipy/special/cython_special.cp312-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.cp312-win_amd64.dll.a +0 -0
  606. scipy/stats/_ansari_swilk_statistics.cp312-win_amd64.pyd +0 -0
  607. scipy/stats/_axis_nan_policy.py +5 -12
  608. scipy/stats/_biasedurn.cp312-win_amd64.dll.a +0 -0
  609. scipy/stats/_biasedurn.cp312-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.cp312-win_amd64.dll.a +0 -0
  624. scipy/stats/_levy_stable/levyst.cp312-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.cp312-win_amd64.dll.a +0 -0
  634. scipy/stats/_qmc_cy.cp312-win_amd64.pyd +0 -0
  635. scipy/stats/_qmvnt.py +16 -95
  636. scipy/stats/_qmvnt_cy.cp312-win_amd64.dll.a +0 -0
  637. scipy/stats/_qmvnt_cy.cp312-win_amd64.pyd +0 -0
  638. scipy/stats/_quantile.py +335 -0
  639. scipy/stats/_rcont/rcont.cp312-win_amd64.dll.a +0 -0
  640. scipy/stats/_rcont/rcont.cp312-win_amd64.pyd +0 -0
  641. scipy/stats/_resampling.py +4 -29
  642. scipy/stats/_sampling.py +1 -1
  643. scipy/stats/_sobol.cp312-win_amd64.dll.a +0 -0
  644. scipy/stats/_sobol.cp312-win_amd64.pyd +0 -0
  645. scipy/stats/_stats.cp312-win_amd64.dll.a +0 -0
  646. scipy/stats/_stats.cp312-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.cp312-win_amd64.dll.a +0 -0
  650. scipy/stats/_stats_pythran.cp312-win_amd64.pyd +0 -0
  651. scipy/stats/_unuran/unuran_wrapper.cp312-win_amd64.dll.a +0 -0
  652. scipy/stats/_unuran/unuran_wrapper.cp312-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.cp312-win_amd64.dll.a +0 -0
  687. scipy/interpolate/_bspl.cp312-win_amd64.pyd +0 -0
  688. scipy/optimize/_cobyla.cp312-win_amd64.dll.a +0 -0
  689. scipy/optimize/_cobyla.cp312-win_amd64.pyd +0 -0
  690. scipy/optimize/_cython_nnls.cp312-win_amd64.dll.a +0 -0
  691. scipy/optimize/_cython_nnls.cp312-win_amd64.pyd +0 -0
  692. scipy/optimize/_slsqp.cp312-win_amd64.dll.a +0 -0
  693. scipy/optimize/_slsqp.cp312-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.cp312-win_amd64.dll.a +0 -0
  756. scipy/stats/_mvn.cp312-win_amd64.pyd +0 -0
  757. scipy-1.15.3.dist-info/DELVEWHEEL +0 -2
  758. /scipy-1.15.3-cp312-cp312-win_amd64.whl → /scipy-1.16.0rc2-cp312-cp312-win_amd64.whl +0 -0
  759. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
@@ -8,9 +8,10 @@ import pytest
8
8
  from pytest import raises as assert_raises
9
9
 
10
10
  from scipy import signal
11
+ from scipy._lib._array_api import xp_assert_close
11
12
  from scipy.fft import fftfreq, rfftfreq, fft, irfft
12
13
  from scipy.integrate import trapezoid
13
- from scipy.signal import (periodogram, welch, lombscargle, coherence,
14
+ from scipy.signal import (periodogram, welch, lombscargle, coherence, csd,
14
15
  spectrogram, check_COLA, check_NOLA)
15
16
  from scipy.signal.windows import hann
16
17
  from scipy.signal._spectral_py import _spectral_helper
@@ -18,7 +19,6 @@ from scipy.signal._spectral_py import _spectral_helper
18
19
  # Compare ShortTimeFFT.stft() / ShortTimeFFT.istft() with stft() / istft():
19
20
  from scipy.signal.tests._scipy_spectral_test_shim import stft_compare as stft
20
21
  from scipy.signal.tests._scipy_spectral_test_shim import istft_compare as istft
21
- from scipy.signal.tests._scipy_spectral_test_shim import csd_compare as csd
22
22
 
23
23
 
24
24
  class TestPeriodogram:
@@ -416,8 +416,7 @@ class TestWelch:
416
416
  #for string-like window, input signal length < nperseg value gives
417
417
  #UserWarning, sets nperseg to x.shape[-1]
418
418
  with suppress_warnings() as sup:
419
- msg = "nperseg = 256 is greater than input length = 8, using nperseg = 8"
420
- sup.filter(UserWarning, msg)
419
+ sup.filter(UserWarning, "nperseg=256 is greater than signal.*")
421
420
  f, p = welch(x,window='hann') # default nperseg
422
421
  f1, p1 = welch(x,window='hann', nperseg=256) # user-specified nperseg
423
422
  f2, p2 = welch(x, nperseg=8) # valid nperseg, doesn't give warning
@@ -560,6 +559,15 @@ class TestWelch:
560
559
  assert_raises(ValueError, welch, x, nperseg=8,
561
560
  average='unrecognised-average')
562
561
 
562
+ def test_ratio_scale_to(self):
563
+ """Verify the factor of ``sum(abs(window)**2)*fs / abs(sum(window))**2``
564
+ used in the `welch` and `csd` docstrs. """
565
+ x, win, fs = np.array([1., 0, 0, 0]), np.ones(4), 12
566
+ params = dict(fs=fs, window=win, return_onesided=False, detrend=None)
567
+ p_dens = welch(x, scaling='density', **params)[1]
568
+ p_spec = welch(x, scaling='spectrum', **params)[1]
569
+ p_fac = sum(win**2)*fs / abs(sum(win))**2
570
+ assert_allclose(p_spec / p_dens, p_fac)
563
571
 
564
572
  class TestCSD:
565
573
  def test_pad_shorter_x(self):
@@ -584,6 +592,36 @@ class TestCSD:
584
592
  assert_allclose(f, f1)
585
593
  assert_allclose(c, c1)
586
594
 
595
+ def test_unequal_length_input_1D(self):
596
+ """Test zero-padding for input `x.shape[axis] != y.shape[axis]` for 1d arrays.
597
+
598
+ This test ensures that issue 23036 is fixed.
599
+ """
600
+ x = np.tile([4, 0, -4, 0], 4)
601
+
602
+ kw = dict(fs=len(x), window='boxcar', nperseg=4)
603
+ X0 = signal.csd(x, np.copy(x), **kw)[1] # `x is x` must be False
604
+ X1 = signal.csd(x, x[:8], **kw)[1]
605
+ X2 = signal.csd(x[:8], x, **kw)[1]
606
+ xp_assert_close(X1, X0 / 2)
607
+ xp_assert_close(X2, X0 / 2)
608
+
609
+ def test_unequal_length_input_3D(self):
610
+ """Test zero-padding for input `x.shape[axis] != y.shape[axis]` for 3d arrays.
611
+
612
+ This test ensures that issue 23036 is fixed.
613
+ """
614
+ n = 8
615
+ x = np.zeros(2 * 3 * n).reshape(2, n, 3)
616
+ x[:, 0, :] = n
617
+
618
+ kw = dict(fs=n, window='boxcar', nperseg=n, detrend=None, axis=1)
619
+ X0 = signal.csd(x, x.copy(), **kw)[1] # `x is x` must be False
620
+ X1 = signal.csd(x, x[:, :2, :], **kw)[1]
621
+ X2 = signal.csd(x[:, :2, :], x, **kw)[1]
622
+ xp_assert_close(X1, X0)
623
+ xp_assert_close(X2, X0)
624
+
587
625
  def test_real_onesided_even(self):
588
626
  x = np.zeros(16)
589
627
  x[0] = 1
@@ -735,6 +773,8 @@ class TestCSD:
735
773
  win_err = signal.get_window('hann', 32)
736
774
  assert_raises(ValueError, csd, x, x,
737
775
  10, win_err, nperseg=None) # because win longer than signal
776
+ with pytest.raises(ValueError, match="Parameter nperseg=0.*"):
777
+ csd(x, x, 0, nperseg=0)
738
778
 
739
779
  def test_empty_input(self):
740
780
  f, p = csd([],np.zeros(10))
@@ -779,8 +819,7 @@ class TestCSD:
779
819
  #for string-like window, input signal length < nperseg value gives
780
820
  #UserWarning, sets nperseg to x.shape[-1]
781
821
  with suppress_warnings() as sup:
782
- msg = "nperseg = 256 is greater than input length = 8, using nperseg = 8"
783
- sup.filter(UserWarning, msg)
822
+ sup.filter(UserWarning, "nperseg=256 is greater than signal length.*")
784
823
  f, p = csd(x, x, window='hann') # default nperseg
785
824
  f1, p1 = csd(x, x, window='hann', nperseg=256) # user-specified nperseg
786
825
  f2, p2 = csd(x, x, nperseg=8) # valid nperseg, doesn't give warning
@@ -811,6 +850,11 @@ class TestCSD:
811
850
  assert_raises(ValueError, csd, np.ones(12), np.zeros(12), nfft=3,
812
851
  nperseg=4)
813
852
 
853
+ def test_incompatible_inputs(self):
854
+ with pytest.raises(ValueError, match='x and y cannot be broadcast.*'):
855
+ csd(np.ones((1, 8, 1)), np.ones((2, 8)), nperseg=4)
856
+
857
+
814
858
  def test_real_onesided_even_32(self):
815
859
  x = np.zeros(16, 'f')
816
860
  x[0] = 1
@@ -1,12 +1,21 @@
1
1
  # pylint: disable=missing-docstring
2
+ import math
2
3
  import numpy as np
3
4
  import pytest
4
- from scipy._lib._array_api import xp_assert_close
5
+ import scipy._lib.array_api_extra as xpx
6
+ from scipy._lib._array_api import is_cupy, xp_assert_close, xp_default_dtype
5
7
 
6
8
  from scipy.signal._spline import (
7
9
  symiirorder1_ic, symiirorder2_ic_fwd, symiirorder2_ic_bwd)
8
10
  from scipy.signal import symiirorder1, symiirorder2
9
11
 
12
+ skip_xp_backends = pytest.mark.skip_xp_backends
13
+ xfail_xp_backends = pytest.mark.xfail_xp_backends
14
+
15
+
16
+ def npr(xp, *args):
17
+ return xp.concat(tuple(xpx.atleast_nd(x, ndim=1, xp=xp) for x in args))
18
+
10
19
 
11
20
  def _compute_symiirorder2_bwd_hs(k, cs, rsq, omega):
12
21
  cssq = cs * cs
@@ -20,13 +29,18 @@ def _compute_symiirorder2_bwd_hs(k, cs, rsq, omega):
20
29
 
21
30
 
22
31
  class TestSymIIR:
32
+
33
+ @skip_xp_backends(np_only=True, reason="_ic functions are private and numpy-only")
23
34
  @pytest.mark.parametrize(
24
- 'dtype', [np.float32, np.float64, np.complex64, np.complex128])
35
+ 'dtype', ['float32', 'float64', 'complex64', 'complex128'])
25
36
  @pytest.mark.parametrize('precision', [-1.0, 0.7, 0.5, 0.25, 0.0075])
26
- def test_symiir1_ic(self, dtype, precision):
37
+ def test_symiir1_ic(self, dtype, precision, xp):
38
+
39
+ dtype = getattr(xp, dtype)
40
+
27
41
  c_precision = precision
28
42
  if precision <= 0.0 or precision > 1.0:
29
- if dtype in {np.float32, np.complex64}:
43
+ if dtype in {xp.float32, xp.complex64}:
30
44
  c_precision = 1e-6
31
45
  else:
32
46
  c_precision = 1e-11
@@ -45,33 +59,34 @@ class TestSymIIR:
45
59
  # using the partial sum formula: (1 - b**n) / (1 - b)
46
60
  # This holds due to the input being a step signal.
47
61
  b = 0.85
48
- n_exp = int(np.ceil(np.log(c_precision) / np.log(b)))
49
- expected = np.asarray([[(1 - b ** n_exp) / (1 - b)]], dtype=dtype)
62
+ n_exp = int(math.ceil(math.log(c_precision) / math.log(b)))
63
+ expected = xp.asarray([[(1 - b ** n_exp) / (1 - b)]], dtype=dtype)
50
64
  expected = 1 + b * expected
51
65
 
52
66
  # Create a step signal of size n + 1
53
- x = np.ones(n_exp + 1, dtype=dtype)
67
+ x = xp.ones(n_exp + 1, dtype=dtype)
54
68
  xp_assert_close(symiirorder1_ic(x, b, precision), expected,
55
69
  atol=2e-6, rtol=2e-7)
56
70
 
57
71
  # Check the conditions for a exponential decreasing signal with base 2.
58
72
  # Same conditions hold, as the product of 0.5^n * 0.85^n is
59
73
  # still a geometric series
60
- b_d = np.asarray(b, dtype=dtype)
74
+ b_d = xp.asarray(b, dtype=dtype)
61
75
  expected = np.asarray(
62
76
  [[(1 - (0.5 * b_d) ** n_exp) / (1 - (0.5 * b_d))]], dtype=dtype)
63
77
  expected = 1 + b_d * expected
64
78
 
65
79
  # Create an exponential decreasing signal of size n + 1
66
- x = 2 ** -np.arange(n_exp + 1, dtype=dtype)
80
+ x = 2 ** -xp.arange(n_exp + 1, dtype=dtype)
67
81
  xp_assert_close(symiirorder1_ic(x, b, precision), expected,
68
82
  atol=2e-6, rtol=2e-7)
69
83
 
70
- def test_symiir1_ic_fails(self):
84
+ @skip_xp_backends(np_only=True, reason="_ic functions are private and numpy-only")
85
+ def test_symiir1_ic_fails(self, xp):
71
86
  # Test that symiirorder1_ic fails whenever \sum_{n = 1}^{n} b^n > eps
72
87
  b = 0.85
73
88
  # Create a step signal of size 100
74
- x = np.ones(100, dtype=np.float64)
89
+ x = xp.ones(100, dtype=xp.float64)
75
90
 
76
91
  # Compute the closed form for the geometrical series
77
92
  precision = 1 / (1 - b)
@@ -81,13 +96,20 @@ class TestSymIIR:
81
96
  pytest.raises(ValueError, symiirorder1_ic, x, 1.0, -1)
82
97
  pytest.raises(ValueError, symiirorder1_ic, x, 2.0, -1)
83
98
 
99
+ @skip_xp_backends(
100
+ cpu_only=True, exceptions=["cupy"], reason="internals are numpy-only"
101
+ )
102
+ @xfail_xp_backends("cupy", reason="sum did not converge")
103
+ @skip_xp_backends("jax.numpy", reason="item assignment in tests")
84
104
  @pytest.mark.parametrize(
85
- 'dtype', [np.float32, np.float64, np.complex64, np.complex128])
105
+ 'dtype', ['float32', 'float64', 'complex64', 'complex128'])
86
106
  @pytest.mark.parametrize('precision', [-1.0, 0.7, 0.5, 0.25, 0.0075])
87
- def test_symiir1(self, dtype, precision):
107
+ def test_symiir1(self, dtype, precision, xp):
108
+ dtype = getattr(xp, dtype)
109
+
88
110
  c_precision = precision
89
111
  if precision <= 0.0 or precision > 1.0:
90
- if dtype in {np.float32, np.complex64}:
112
+ if dtype in {xp.float32, xp.complex64}:
91
113
  c_precision = 1e-6
92
114
  else:
93
115
  c_precision = 1e-11
@@ -97,12 +119,12 @@ class TestSymIIR:
97
119
  c0 = 0.15
98
120
  z1 = 0.85
99
121
  n = 200
100
- signal = np.ones(n, dtype=dtype)
122
+ signal = xp.ones(n, dtype=dtype)
101
123
 
102
124
  # Find the initial condition. See test_symiir1_ic for a detailed
103
125
  # explanation
104
- n_exp = int(np.ceil(np.log(c_precision) / np.log(z1)))
105
- initial = np.asarray((1 - z1 ** n_exp) / (1 - z1), dtype=dtype)
126
+ n_exp = int(math.ceil(math.log(c_precision) / math.log(z1)))
127
+ initial = xp.asarray((1 - z1 ** n_exp) / (1 - z1), dtype=dtype)
106
128
  initial = 1 + z1 * initial
107
129
 
108
130
  # Forward pass
@@ -117,15 +139,15 @@ class TestSymIIR:
117
139
  # d is the Kronecker delta function, and u is the unit step
118
140
 
119
141
  # y0 * z1**n * u[n]
120
- pos = np.arange(n, dtype=dtype)
142
+ pos = xp.astype(xp.arange(n), dtype)
121
143
  comp1 = initial * z1**pos
122
144
 
123
145
  # -z1 / (1 - z1) * z1**(k - 1) * u[k - 1]
124
- comp2 = np.zeros(n, dtype=dtype)
146
+ comp2 = xp.zeros(n, dtype=dtype)
125
147
  comp2[1:] = -z1 / (1 - z1) * z1**pos[:-1]
126
148
 
127
149
  # 1 / (1 - z1) * u[k - 1]
128
- comp3 = np.zeros(n, dtype=dtype)
150
+ comp3 = xp.zeros(n, dtype=dtype)
129
151
  comp3[1:] = 1 / (1 - z1)
130
152
 
131
153
  expected_fwd = comp1 + comp2 + comp3
@@ -139,63 +161,73 @@ class TestSymIIR:
139
161
 
140
162
  # Computing a closed form for the complete expression is difficult
141
163
  # The result will be computed iteratively from the difference equation
142
- exp_out = np.zeros(n, dtype=dtype)
164
+ exp_out = xp.zeros(n, dtype=dtype)
143
165
  exp_out[0] = sym_cond
144
166
 
145
167
  for i in range(1, n):
146
168
  exp_out[i] = c0 * expected_fwd[n - 1 - i] + z1 * exp_out[i - 1]
147
169
 
148
- exp_out = exp_out[::-1]
170
+ exp_out = xp.flip(exp_out)
149
171
 
150
172
  out = symiirorder1(signal, c0, z1, precision)
151
173
  xp_assert_close(out, exp_out, atol=4e-6, rtol=6e-7)
152
174
 
175
+ @xfail_xp_backends("cupy", reason="sum did not converge")
176
+ @skip_xp_backends(
177
+ cpu_only=True, exceptions=["cupy"], reason="internals are numpy-only"
178
+ )
153
179
  @pytest.mark.parametrize('dtype', ['float32', 'float64'])
154
- def test_symiir1_values(self, dtype):
180
+ def test_symiir1_values(self, dtype, xp):
155
181
  rng = np.random.RandomState(1234)
156
- dtype = getattr(np, dtype)
157
182
  s = rng.uniform(size=16).astype(dtype)
183
+ dtype = getattr(xp, dtype)
184
+ s = xp.asarray(s)
158
185
  res = symiirorder1(s, 0.5, 0.1)
159
186
 
160
187
  # values from scipy 1.9.1
161
- exp_res = np.array([0.14387447, 0.35166047, 0.29735238, 0.46295986, 0.45174927,
162
- 0.19982875, 0.20355805, 0.47378628, 0.57232247, 0.51597393,
163
- 0.25935107, 0.31438554, 0.41096728, 0.4190693 , 0.25812255,
164
- 0.33671467], dtype=res.dtype)
165
- assert res.dtype == dtype
166
- atol = {np.float64: 1e-15, np.float32: 1e-7}[dtype]
188
+ exp_res = xp.asarray([
189
+ 0.14387447, 0.35166047, 0.29735238, 0.46295986, 0.45174927,
190
+ 0.19982875, 0.20355805, 0.47378628, 0.57232247, 0.51597393,
191
+ 0.25935107, 0.31438554, 0.41096728, 0.4190693 , 0.25812255,
192
+ 0.33671467], dtype=res.dtype)
193
+ atol = {xp.float64: 1e-15, xp.float32: 1e-7}[dtype]
167
194
  xp_assert_close(res, exp_res, atol=atol)
168
195
 
169
- s = s + 1j*s
196
+ I1 = xp.asarray(
197
+ 1 + 1j, dtype=xp.result_type(s, xp.complex64)
198
+ )
199
+ s = s * I1
170
200
  res = symiirorder1(s, 0.5, 0.1)
171
- assert res.dtype == np.complex64 if dtype == np.float32 else np.complex128
172
- xp_assert_close(res, exp_res + 1j*exp_res, atol=atol)
201
+ assert res.dtype == xp.complex64 if dtype == xp.float32 else xp.complex128
202
+ xp_assert_close(res, I1 * exp_res, atol=atol)
173
203
 
204
+ @skip_xp_backends(np_only=True,
205
+ reason="_initial_fwd functions are private and numpy-only")
174
206
  @pytest.mark.parametrize(
175
207
  'dtype', ['float32', 'float64'])
176
208
  @pytest.mark.parametrize('precision', [-1.0, 0.7, 0.5, 0.25, 0.0075])
177
- def test_symiir2_initial_fwd(self, dtype, precision):
178
- dtype = getattr(np, dtype)
209
+ def test_symiir2_initial_fwd(self, dtype, precision, xp):
210
+ dtype = getattr(xp, dtype)
179
211
  c_precision = precision
180
212
  if precision <= 0.0 or precision > 1.0:
181
- if dtype in {np.float32, np.complex64}:
213
+ if dtype in {xp.float32, xp.complex64}:
182
214
  c_precision = 1e-6
183
215
  else:
184
216
  c_precision = 1e-11
185
217
 
186
218
  # Compute the initial conditions for a order-two symmetrical low-pass
187
219
  # filter with r = 0.5 and omega = pi / 3 for an unit step input.
188
- r = np.asarray(0.5, dtype=dtype)
189
- omega = np.asarray(np.pi / 3.0, dtype=dtype)
190
- cs = 1 - 2 * r * np.cos(omega) + r**2
220
+ r = xp.asarray(0.5, dtype=dtype)
221
+ omega = xp.asarray(np.pi / 3.0, dtype=dtype)
222
+ cs = 1 - 2 * r * xp.cos(omega) + r**2
191
223
 
192
224
  # The index n for the initial condition is bound from 0 to the
193
225
  # first position where sin(omega * (n + 2)) = 0 => omega * (n + 2) = pi
194
226
  # For omega = pi / 3, the maximum initial condition occurs when
195
227
  # sqrt(3) / 2 * r**n < precision.
196
228
  # => n = log(2 * sqrt(3) / 3 * precision) / log(r)
197
- ub = np.ceil(np.log(c_precision / np.sin(omega)) / np.log(c_precision))
198
- lb = np.ceil(np.pi / omega) - 2
229
+ ub = xp.ceil(xp.log(c_precision / xp.sin(omega)) / math.log(c_precision))
230
+ lb = xp.ceil(math.pi / omega) - 2
199
231
  n_exp = min(ub, lb)
200
232
 
201
233
  # The forward initial condition for a filter of order two is:
@@ -207,10 +239,10 @@ class TestSymIIR:
207
239
  # r**(n + 3) * np.sin(omega * (n + 2)) / np.sin(omega) + cs
208
240
  fwd_initial_1 = (
209
241
  cs +
210
- 2 * r * np.cos(omega) -
242
+ 2 * r * xp.cos(omega) -
211
243
  r**2 -
212
- r**(n_exp + 2) * np.sin(omega * (n_exp + 3)) / np.sin(omega) +
213
- r**(n_exp + 3) * np.sin(omega * (n_exp + 2)) / np.sin(omega))
244
+ r**(n_exp + 2) * xp.sin(omega * (n_exp + 3)) / xp.sin(omega) +
245
+ r**(n_exp + 3) * xp.sin(omega * (n_exp + 2)) / xp.sin(omega))
214
246
 
215
247
  # The second initial condition is given by
216
248
  # s[n] = 1 / np.sin(omega) * (
@@ -218,19 +250,19 @@ class TestSymIIR:
218
250
  # r**3 * np.sin(2 * omega) -
219
251
  # r**(n + 3) * np.sin(omega * (n + 4)) +
220
252
  # r**(n + 4) * np.sin(omega * (n + 3)))
221
- ub = np.ceil(np.log(c_precision / np.sin(omega)) / np.log(c_precision))
222
- lb = np.ceil(np.pi / omega) - 3
253
+ ub = xp.ceil(xp.log(c_precision / xp.sin(omega)) / math.log(c_precision))
254
+ lb = xp.ceil(xp.pi / omega) - 3
223
255
  n_exp = min(ub, lb)
224
256
 
225
257
  fwd_initial_2 = (
226
- cs + cs * 2 * r * np.cos(omega) +
227
- (r**2 * np.sin(3 * omega) -
228
- r**3 * np.sin(2 * omega) -
229
- r**(n_exp + 3) * np.sin(omega * (n_exp + 4)) +
230
- r**(n_exp + 4) * np.sin(omega * (n_exp + 3))) / np.sin(omega))
258
+ cs + cs * 2 * r * xp.cos(omega) +
259
+ (r**2 * xp.sin(3 * omega) -
260
+ r**3 * xp.sin(2 * omega) -
261
+ r**(n_exp + 3) * xp.sin(omega * (n_exp + 4)) +
262
+ r**(n_exp + 4) * xp.sin(omega * (n_exp + 3))) / xp.sin(omega))
231
263
 
232
- expected = np.r_[fwd_initial_1, fwd_initial_2][None, :]
233
- expected = expected.astype(dtype)
264
+ expected = npr(xp, fwd_initial_1, fwd_initial_2)[None, :]
265
+ expected = xp.astype(expected, dtype)
234
266
 
235
267
  n = 100
236
268
  signal = np.ones(n, dtype=dtype)
@@ -238,29 +270,33 @@ class TestSymIIR:
238
270
  out = symiirorder2_ic_fwd(signal, r, omega, precision)
239
271
  xp_assert_close(out, expected, atol=4e-6, rtol=6e-7)
240
272
 
273
+ @skip_xp_backends(np_only=True,
274
+ reason="_initial_bwd functions are private and numpy-only")
241
275
  @pytest.mark.parametrize(
242
- 'dtype', [np.float32, np.float64])
276
+ 'dtype', ['float32', 'float64'])
243
277
  @pytest.mark.parametrize('precision', [-1.0, 0.7, 0.5, 0.25, 0.0075])
244
- def test_symiir2_initial_bwd(self, dtype, precision):
278
+ def test_symiir2_initial_bwd(self, dtype, precision, xp):
279
+ dtype = getattr(xp, dtype)
280
+
245
281
  c_precision = precision
246
282
  if precision <= 0.0 or precision > 1.0:
247
- if dtype in {np.float32, np.complex64}:
283
+ if dtype in {xp.float32, xp.complex64}:
248
284
  c_precision = 1e-6
249
285
  else:
250
286
  c_precision = 1e-11
251
287
 
252
- r = np.asarray(0.5, dtype=dtype)
253
- omega = np.asarray(np.pi / 3.0, dtype=dtype)
254
- cs = 1 - 2 * r * np.cos(omega) + r * r
255
- a2 = 2 * r * np.cos(omega)
288
+ r = xp.asarray(0.5, dtype=dtype)
289
+ omega = xp.asarray(xp.pi / 3.0, dtype=dtype)
290
+ cs = 1 - 2 * r * xp.cos(omega) + r * r
291
+ a2 = 2 * r * xp.cos(omega)
256
292
  a3 = -r * r
257
293
 
258
294
  n = 100
259
- signal = np.ones(n, dtype=dtype)
295
+ signal = xp.ones(n, dtype=dtype)
260
296
 
261
297
  # Compute initial forward conditions
262
298
  ic = symiirorder2_ic_fwd(signal, r, omega, precision)
263
- out = np.zeros(n + 2, dtype=dtype)
299
+ out = xp.zeros(n + 2, dtype=dtype)
264
300
  out[:2] = ic[0]
265
301
 
266
302
  # Apply the forward system cs / (1 - a2 * z^-1 - a3 * z^-2))
@@ -268,52 +304,61 @@ class TestSymIIR:
268
304
  out[i] = cs * signal[i - 2] + a2 * out[i - 1] + a3 * out[i - 2]
269
305
 
270
306
  # Find the backward initial conditions
271
- ic2 = np.zeros(2, dtype=dtype)
272
- idx = np.arange(n)
307
+ ic2 = xp.zeros(2, dtype=dtype)
308
+ idx = xp.arange(n)
273
309
 
274
310
  diff = (_compute_symiirorder2_bwd_hs(idx, cs, r * r, omega) +
275
311
  _compute_symiirorder2_bwd_hs(idx + 1, cs, r * r, omega))
276
312
  ic2_0_all = np.cumsum(diff * out[:1:-1])
277
- pos = np.where(diff ** 2 < c_precision)[0]
313
+ pos = xp.nonzero(diff ** 2 < c_precision)[0]
278
314
  ic2[0] = ic2_0_all[pos[0]]
279
315
 
280
316
  diff = (_compute_symiirorder2_bwd_hs(idx - 1, cs, r * r, omega) +
281
317
  _compute_symiirorder2_bwd_hs(idx + 2, cs, r * r, omega))
282
- ic2_1_all = np.cumsum(diff * out[:1:-1])
283
- pos = np.where(diff ** 2 < c_precision)[0]
318
+
319
+ ic2_1_all = xp.cumulative_sum(diff * out[:1:-1])
320
+ pos = xp.nonzero(diff ** 2 < c_precision)[0]
284
321
  ic2[1] = ic2_1_all[pos[0]]
285
322
 
286
323
  out_ic = symiirorder2_ic_bwd(out, r, omega, precision)[0]
287
324
  xp_assert_close(out_ic, ic2, atol=4e-6, rtol=6e-7)
288
325
 
326
+ @skip_xp_backends(cpu_only=True, reason="internals are numpy-only")
327
+ @skip_xp_backends("jax.numpy", reason="item assignment in tests")
289
328
  @pytest.mark.parametrize(
290
- 'dtype', [np.float32, np.float64])
329
+ 'dtype', ['float32', 'float64'])
291
330
  @pytest.mark.parametrize('precision', [-1.0, 0.7, 0.5, 0.25, 0.0075])
292
- def test_symiir2(self, dtype, precision):
293
- r = np.asarray(0.5, dtype=dtype)
294
- omega = np.asarray(np.pi / 3.0, dtype=dtype)
295
- cs = 1 - 2 * r * np.cos(omega) + r * r
296
- a2 = 2 * r * np.cos(omega)
331
+ def test_symiir2(self, dtype, precision, xp):
332
+ dtype = getattr(xp, dtype)
333
+
334
+ r = 0.5
335
+ omega = math.pi / 3.0
336
+ cs = 1 - 2 * r * math.cos(omega) + r * r
337
+ a2 = 2 * r * math.cos(omega)
297
338
  a3 = -r * r
298
339
 
299
340
  n = 100
300
- signal = np.ones(n, dtype=dtype)
341
+ signal = xp.ones(n, dtype=dtype)
301
342
 
302
343
  # Compute initial forward conditions
303
- ic = symiirorder2_ic_fwd(signal, r, omega, precision)
304
- out1 = np.zeros(n + 2, dtype=dtype)
305
- out1[:2] = ic[0]
344
+ signal_np = np.asarray(signal)
345
+ ic = symiirorder2_ic_fwd(signal_np, r, omega, precision)
346
+ ic = xp.asarray(ic)
347
+ out1 = xp.zeros(n + 2, dtype=dtype)
348
+ out1[:2] = ic[0, :]
306
349
 
307
350
  # Apply the forward system cs / (1 - a2 * z^-1 - a3 * z^-2))
308
351
  for i in range(2, n + 2):
309
352
  out1[i] = cs * signal[i - 2] + a2 * out1[i - 1] + a3 * out1[i - 2]
310
353
 
311
354
  # Find the backward initial conditions
312
- ic2 = symiirorder2_ic_bwd(out1, r, omega, precision)[0]
355
+ ic2 = symiirorder2_ic_bwd(np.asarray(out1), r, omega, precision)[0]
356
+ ic2 = xp.asarray(ic2)
313
357
 
314
358
  # Apply the system cs / (1 - a2 * z - a3 * z^2)) in backwards
315
- exp = np.empty(n, dtype=dtype)
316
- exp[-2:] = ic2[::-1]
359
+ exp = xp.empty(n, dtype=dtype)
360
+
361
+ exp[-2:] = xp.flip(ic2)
317
362
 
318
363
  for i in range(n - 3, -1, -1):
319
364
  exp[i] = cs * out1[i] + a2 * exp[i + 1] + a3 * exp[i + 2]
@@ -321,20 +366,26 @@ class TestSymIIR:
321
366
  out = symiirorder2(signal, r, omega, precision)
322
367
  xp_assert_close(out, exp, atol=4e-6, rtol=6e-7)
323
368
 
369
+ @skip_xp_backends(cpu_only=True, exceptions=["cupy"], reason="C internals")
324
370
  @pytest.mark.parametrize('dtyp', ['float32', 'float64'])
325
- def test_symiir2_values(self, dtyp):
326
- dtyp = getattr(np, dtyp)
371
+ def test_symiir2_values(self, dtyp, xp):
327
372
  rng = np.random.RandomState(1234)
328
373
  s = rng.uniform(size=16).astype(dtyp)
374
+ s = xp.asarray(s)
375
+
376
+ # cupy returns f64 for f32 inputs
377
+ dtype = xp.float64 if is_cupy(xp) else getattr(xp, dtyp)
378
+
329
379
  res = symiirorder2(s, 0.1, 0.1, precision=1e-10)
330
380
 
331
381
  # values from scipy 1.9.1
332
- exp_res = np.array([0.26572609, 0.53408018, 0.51032696, 0.72115829, 0.69486885,
333
- 0.3649055 , 0.37349478, 0.74165032, 0.89718521, 0.80582483,
334
- 0.46758053, 0.51898709, 0.65025605, 0.65394321, 0.45273595,
335
- 0.53539183], dtype=dtyp)
382
+ exp_res = xp.asarray(
383
+ [0.26572609, 0.53408018, 0.51032696, 0.72115829, 0.69486885,
384
+ 0.3649055 , 0.37349478, 0.74165032, 0.89718521, 0.80582483,
385
+ 0.46758053, 0.51898709, 0.65025605, 0.65394321, 0.45273595,
386
+ 0.53539183], dtype=dtype
387
+ )
336
388
 
337
- assert res.dtype == dtyp
338
389
  # The values in SciPy 1.14 agree with those in SciPy 1.9.1 to this
339
390
  # accuracy only. Implementation differences are twofold:
340
391
  # 1. boundary conditions are computed differently
@@ -345,18 +396,32 @@ class TestSymIIR:
345
396
  # In that respect, sosfilt is likely doing a better job.
346
397
  xp_assert_close(res, exp_res, atol=2e-6)
347
398
 
348
- s = s + 1j*s
349
- with pytest.raises(TypeError):
399
+ I1 = xp.asarray(1 + 1j, dtype=xp.result_type(s, xp.complex64))
400
+ s = s * I1
401
+
402
+ with pytest.raises((TypeError, ValueError)):
350
403
  res = symiirorder2(s, 0.5, 0.1)
351
404
 
352
- def test_symiir1_integer_input(self):
353
- s = np.where(np.arange(100) % 2, -1, 1)
354
- expected = symiirorder1(s.astype(float), 0.5, 0.5)
405
+ @skip_xp_backends(cpu_only=True, exceptions=["cupy"], reason="C internals")
406
+ @xfail_xp_backends("cupy", reason="cupy does not accept integer arrays")
407
+ def test_symiir1_integer_input(self, xp):
408
+ s = xp.where(
409
+ xp.astype(xp.arange(100) % 2, xp.bool),
410
+ xp.asarray(-1),
411
+ xp.asarray(1),
412
+ )
413
+ expected = symiirorder1(xp.astype(s, xp_default_dtype(xp)), 0.5, 0.5)
355
414
  out = symiirorder1(s, 0.5, 0.5)
356
415
  xp_assert_close(out, expected)
357
416
 
358
- def test_symiir2_integer_input(self):
359
- s = np.where(np.arange(100) % 2, -1, 1)
360
- expected = symiirorder2(s.astype(float), 0.5, np.pi / 3.0)
361
- out = symiirorder2(s, 0.5, np.pi / 3.0)
417
+ @skip_xp_backends(cpu_only=True, exceptions=["cupy"], reason="C internals")
418
+ @xfail_xp_backends("cupy", reason="cupy does not accept integer arrays")
419
+ def test_symiir2_integer_input(self, xp):
420
+ s = xp.where(
421
+ xp.astype(xp.arange(100) % 2, xp.bool),
422
+ xp.asarray(-1),
423
+ xp.asarray(1),
424
+ )
425
+ expected = symiirorder2(xp.astype(s, xp_default_dtype(xp)), 0.5, xp.pi / 3.0)
426
+ out = symiirorder2(s, 0.5, xp.pi / 3.0)
362
427
  xp_assert_close(out, expected)