scipy 1.15.3__cp311-cp311-win_amd64.whl → 1.16.0rc2__cp311-cp311-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.cp311-win_amd64.dll.a +0 -0
  4. scipy/_cyutility.cp311-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.cp311-win_amd64.dll.a +0 -0
  9. scipy/_lib/_ccallback_c.cp311-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.cp311-win_amd64.dll.a +0 -0
  13. scipy/_lib/_fpumode.cp311-win_amd64.pyd +0 -0
  14. scipy/_lib/_sparse.py +41 -0
  15. scipy/_lib/_test_ccallback.cp311-win_amd64.dll.a +0 -0
  16. scipy/_lib/_test_ccallback.cp311-win_amd64.pyd +0 -0
  17. scipy/_lib/_test_deprecation_call.cp311-win_amd64.dll.a +0 -0
  18. scipy/_lib/_test_deprecation_call.cp311-win_amd64.pyd +0 -0
  19. scipy/_lib/_test_deprecation_def.cp311-win_amd64.dll.a +0 -0
  20. scipy/_lib/_test_deprecation_def.cp311-win_amd64.pyd +0 -0
  21. scipy/_lib/_testutils.py +6 -2
  22. scipy/_lib/_uarray/_uarray.cp311-win_amd64.dll.a +0 -0
  23. scipy/_lib/_uarray/_uarray.cp311-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.cp311-win_amd64.dll.a +0 -0
  72. scipy/_lib/messagestream.cp311-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.cp311-win_amd64.dll.a +0 -0
  105. scipy/cluster/_hierarchy.cp311-win_amd64.pyd +0 -0
  106. scipy/cluster/_optimal_leaf_ordering.cp311-win_amd64.dll.a +0 -0
  107. scipy/cluster/_optimal_leaf_ordering.cp311-win_amd64.pyd +0 -0
  108. scipy/cluster/_vq.cp311-win_amd64.dll.a +0 -0
  109. scipy/cluster/_vq.cp311-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.cp311-win_amd64.dll.a +0 -0
  127. scipy/fft/_pocketfft/pypocketfft.cp311-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.cp311-win_amd64.dll.a +0 -0
  136. scipy/fftpack/convolve.cp311-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.cp311-win_amd64.dll.a +0 -0
  142. scipy/integrate/_dop.cp311-win_amd64.pyd +0 -0
  143. scipy/integrate/_lsoda.cp311-win_amd64.dll.a +0 -0
  144. scipy/integrate/_lsoda.cp311-win_amd64.pyd +0 -0
  145. scipy/integrate/_ode.py +9 -2
  146. scipy/integrate/_odepack.cp311-win_amd64.dll.a +0 -0
  147. scipy/integrate/_odepack.cp311-win_amd64.pyd +0 -0
  148. scipy/integrate/_quad_vec.py +21 -29
  149. scipy/integrate/_quadpack.cp311-win_amd64.dll.a +0 -0
  150. scipy/integrate/_quadpack.cp311-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.cp311-win_amd64.dll.a +0 -0
  156. scipy/integrate/_test_multivariate.cp311-win_amd64.pyd +0 -0
  157. scipy/integrate/_test_odeint_banded.cp311-win_amd64.dll.a +0 -0
  158. scipy/integrate/_test_odeint_banded.cp311-win_amd64.pyd +0 -0
  159. scipy/integrate/_vode.cp311-win_amd64.dll.a +0 -0
  160. scipy/integrate/_vode.cp311-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.cp311-win_amd64.dll.a +0 -0
  171. scipy/interpolate/_dfitpack.cp311-win_amd64.pyd +0 -0
  172. scipy/interpolate/_dierckx.cp311-win_amd64.dll.a +0 -0
  173. scipy/interpolate/_dierckx.cp311-win_amd64.pyd +0 -0
  174. scipy/interpolate/_fitpack.cp311-win_amd64.dll.a +0 -0
  175. scipy/interpolate/_fitpack.cp311-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.cp311-win_amd64.dll.a +0 -0
  180. scipy/interpolate/_interpnd.cp311-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.cp311-win_amd64.dll.a +0 -0
  186. scipy/interpolate/_ppoly.cp311-win_amd64.pyd +0 -0
  187. scipy/interpolate/_rbf.py +2 -2
  188. scipy/interpolate/_rbfinterp.py +1 -1
  189. scipy/interpolate/_rbfinterp_pythran.cp311-win_amd64.dll.a +0 -0
  190. scipy/interpolate/_rbfinterp_pythran.cp311-win_amd64.pyd +0 -0
  191. scipy/interpolate/_rgi.py +31 -26
  192. scipy/interpolate/_rgi_cython.cp311-win_amd64.dll.a +0 -0
  193. scipy/interpolate/_rgi_cython.cp311-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.cp311-win_amd64.dll.a +0 -0
  204. scipy/io/_fast_matrix_market/_fmm_core.cp311-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.cp311-win_amd64.dll.a +0 -0
  210. scipy/io/_test_fortran.cp311-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.cp311-win_amd64.dll.a +0 -0
  216. scipy/io/matlab/_mio5_utils.cp311-win_amd64.pyd +0 -0
  217. scipy/io/matlab/_mio_utils.cp311-win_amd64.dll.a +0 -0
  218. scipy/io/matlab/_mio_utils.cp311-win_amd64.pyd +0 -0
  219. scipy/io/matlab/_miobase.py +4 -1
  220. scipy/io/matlab/_streams.cp311-win_amd64.dll.a +0 -0
  221. scipy/io/matlab/_streams.cp311-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.cp311-win_amd64.dll.a +0 -0
  229. scipy/linalg/_cythonized_array_utils.cp311-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.cp311-win_amd64.dll.a +0 -0
  234. scipy/linalg/_decomp_interpolative.cp311-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.cp311-win_amd64.dll.a +0 -0
  238. scipy/linalg/_decomp_lu_cython.cp311-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.cp311-win_amd64.dll.a +0 -0
  245. scipy/linalg/_decomp_update.cp311-win_amd64.pyd +0 -0
  246. scipy/linalg/_expm_frechet.py +4 -0
  247. scipy/linalg/_fblas.cp311-win_amd64.dll.a +0 -0
  248. scipy/linalg/_fblas.cp311-win_amd64.pyd +0 -0
  249. scipy/linalg/_flapack.cp311-win_amd64.dll.a +0 -0
  250. scipy/linalg/_flapack.cp311-win_amd64.pyd +0 -0
  251. scipy/linalg/_linalg_pythran.cp311-win_amd64.dll.a +0 -0
  252. scipy/linalg/_linalg_pythran.cp311-win_amd64.pyd +0 -0
  253. scipy/linalg/_matfuncs.py +187 -4
  254. scipy/linalg/_matfuncs_expm.cp311-win_amd64.dll.a +0 -0
  255. scipy/linalg/_matfuncs_expm.cp311-win_amd64.pyd +0 -0
  256. scipy/linalg/_matfuncs_schur_sqrtm.cp311-win_amd64.dll.a +0 -0
  257. scipy/linalg/_matfuncs_schur_sqrtm.cp311-win_amd64.pyd +0 -0
  258. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  259. scipy/linalg/_matfuncs_sqrtm_triu.cp311-win_amd64.dll.a +0 -0
  260. scipy/linalg/_matfuncs_sqrtm_triu.cp311-win_amd64.pyd +0 -0
  261. scipy/linalg/_procrustes.py +2 -0
  262. scipy/linalg/_sketches.py +17 -6
  263. scipy/linalg/_solve_toeplitz.cp311-win_amd64.dll.a +0 -0
  264. scipy/linalg/_solve_toeplitz.cp311-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.cp311-win_amd64.dll.a +0 -0
  268. scipy/linalg/cython_blas.cp311-win_amd64.pyd +0 -0
  269. scipy/linalg/cython_lapack.cp311-win_amd64.dll.a +0 -0
  270. scipy/linalg/cython_lapack.cp311-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.cp311-win_amd64.dll.a +0 -0
  286. scipy/ndimage/_ctest.cp311-win_amd64.pyd +0 -0
  287. scipy/ndimage/_cytest.cp311-win_amd64.dll.a +0 -0
  288. scipy/ndimage/_cytest.cp311-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.cp311-win_amd64.dll.a +0 -0
  295. scipy/ndimage/_nd_image.cp311-win_amd64.pyd +0 -0
  296. scipy/ndimage/_ni_docstrings.py +5 -1
  297. scipy/ndimage/_ni_label.cp311-win_amd64.dll.a +0 -0
  298. scipy/ndimage/_ni_label.cp311-win_amd64.pyd +0 -0
  299. scipy/ndimage/_ni_support.py +1 -5
  300. scipy/ndimage/_rank_filter_1d.cp311-win_amd64.dll.a +0 -0
  301. scipy/ndimage/_rank_filter_1d.cp311-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.cp311-win_amd64.dll.a +0 -0
  310. scipy/odr/__odrpack.cp311-win_amd64.pyd +0 -0
  311. scipy/optimize/_basinhopping.py +13 -7
  312. scipy/optimize/_bglu_dense.cp311-win_amd64.dll.a +0 -0
  313. scipy/optimize/_bglu_dense.cp311-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.cp311-win_amd64.dll.a +0 -0
  321. scipy/optimize/_direct.cp311-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.cp311-win_amd64.dll.a +0 -0
  325. scipy/optimize/_group_columns.cp311-win_amd64.pyd +0 -0
  326. scipy/optimize/_highspy/_core.cp311-win_amd64.dll.a +0 -0
  327. scipy/optimize/_highspy/_core.cp311-win_amd64.pyd +0 -0
  328. scipy/optimize/_highspy/_highs_options.cp311-win_amd64.dll.a +0 -0
  329. scipy/optimize/_highspy/_highs_options.cp311-win_amd64.pyd +0 -0
  330. scipy/optimize/_lbfgsb.cp311-win_amd64.dll.a +0 -0
  331. scipy/optimize/_lbfgsb.cp311-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.cp311-win_amd64.dll.a +0 -0
  338. scipy/optimize/_lsap.cp311-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.cp311-win_amd64.dll.a +0 -0
  342. scipy/optimize/_lsq/givens_elimination.cp311-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.cp311-win_amd64.dll.a +0 -0
  349. scipy/optimize/_minpack.cp311-win_amd64.pyd +0 -0
  350. scipy/optimize/_minpack_py.py +21 -14
  351. scipy/optimize/_moduleTNC.cp311-win_amd64.dll.a +0 -0
  352. scipy/optimize/_moduleTNC.cp311-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.cp311-win_amd64.dll.a +0 -0
  358. scipy/optimize/_pava_pybind.cp311-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.cp311-win_amd64.dll.a +0 -0
  365. scipy/optimize/_slsqplib.cp311-win_amd64.pyd +0 -0
  366. scipy/optimize/_spectral.py +1 -1
  367. scipy/optimize/_tnc.py +8 -1
  368. scipy/optimize/_trlib/_trlib.cp311-win_amd64.dll.a +0 -0
  369. scipy/optimize/_trlib/_trlib.cp311-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.cp311-win_amd64.dll.a +0 -0
  381. scipy/optimize/_zeros.cp311-win_amd64.pyd +0 -0
  382. scipy/optimize/_zeros_py.py +97 -17
  383. scipy/optimize/cython_optimize/_zeros.cp311-win_amd64.dll.a +0 -0
  384. scipy/optimize/cython_optimize/_zeros.cp311-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.cp311-win_amd64.dll.a +0 -0
  416. scipy/signal/_max_len_seq_inner.cp311-win_amd64.pyd +0 -0
  417. scipy/signal/_peak_finding_utils.cp311-win_amd64.dll.a +0 -0
  418. scipy/signal/_peak_finding_utils.cp311-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.cp311-win_amd64.dll.a +0 -0
  424. scipy/signal/_sigtools.cp311-win_amd64.pyd +0 -0
  425. scipy/signal/_sosfilt.cp311-win_amd64.dll.a +0 -0
  426. scipy/signal/_sosfilt.cp311-win_amd64.pyd +0 -0
  427. scipy/signal/_spectral_py.py +230 -50
  428. scipy/signal/_spline.cp311-win_amd64.dll.a +0 -0
  429. scipy/signal/_spline.cp311-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.cp311-win_amd64.dll.a +0 -0
  434. scipy/signal/_upfirdn_apply.cp311-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.cp311-win_amd64.dll.a +0 -0
  461. scipy/sparse/_csparsetools.cp311-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.cp311-win_amd64.dll.a +0 -0
  469. scipy/sparse/_sparsetools.cp311-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.cp311-win_amd64.dll.a +0 -0
  478. scipy/sparse/csgraph/_flow.cp311-win_amd64.pyd +0 -0
  479. scipy/sparse/csgraph/_matching.cp311-win_amd64.dll.a +0 -0
  480. scipy/sparse/csgraph/_matching.cp311-win_amd64.pyd +0 -0
  481. scipy/sparse/csgraph/_min_spanning_tree.cp311-win_amd64.dll.a +0 -0
  482. scipy/sparse/csgraph/_min_spanning_tree.cp311-win_amd64.pyd +0 -0
  483. scipy/sparse/csgraph/_reordering.cp311-win_amd64.dll.a +0 -0
  484. scipy/sparse/csgraph/_reordering.cp311-win_amd64.pyd +0 -0
  485. scipy/sparse/csgraph/_shortest_path.cp311-win_amd64.dll.a +0 -0
  486. scipy/sparse/csgraph/_shortest_path.cp311-win_amd64.pyd +0 -0
  487. scipy/sparse/csgraph/_tools.cp311-win_amd64.dll.a +0 -0
  488. scipy/sparse/csgraph/_tools.cp311-win_amd64.pyd +0 -0
  489. scipy/sparse/csgraph/_traversal.cp311-win_amd64.dll.a +0 -0
  490. scipy/sparse/csgraph/_traversal.cp311-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.cp311-win_amd64.dll.a +0 -0
  499. scipy/sparse/linalg/_dsolve/_superlu.cp311-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.cp311-win_amd64.dll.a +0 -0
  503. scipy/sparse/linalg/_eigen/arpack/_arpack.cp311-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.cp311-win_amd64.dll.a +0 -0
  516. scipy/sparse/linalg/_propack/_cpropack.cp311-win_amd64.pyd +0 -0
  517. scipy/sparse/linalg/_propack/_dpropack.cp311-win_amd64.dll.a +0 -0
  518. scipy/sparse/linalg/_propack/_dpropack.cp311-win_amd64.pyd +0 -0
  519. scipy/sparse/linalg/_propack/_spropack.cp311-win_amd64.dll.a +0 -0
  520. scipy/sparse/linalg/_propack/_spropack.cp311-win_amd64.pyd +0 -0
  521. scipy/sparse/linalg/_propack/_zpropack.cp311-win_amd64.dll.a +0 -0
  522. scipy/sparse/linalg/_propack/_zpropack.cp311-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.cp311-win_amd64.dll.a +0 -0
  533. scipy/spatial/_ckdtree.cp311-win_amd64.pyd +0 -0
  534. scipy/spatial/_distance_pybind.cp311-win_amd64.dll.a +0 -0
  535. scipy/spatial/_distance_pybind.cp311-win_amd64.pyd +0 -0
  536. scipy/spatial/_distance_wrap.cp311-win_amd64.dll.a +0 -0
  537. scipy/spatial/_distance_wrap.cp311-win_amd64.pyd +0 -0
  538. scipy/spatial/_hausdorff.cp311-win_amd64.dll.a +0 -0
  539. scipy/spatial/_hausdorff.cp311-win_amd64.pyd +0 -0
  540. scipy/spatial/_qhull.cp311-win_amd64.dll.a +0 -0
  541. scipy/spatial/_qhull.cp311-win_amd64.pyd +0 -0
  542. scipy/spatial/_voronoi.cp311-win_amd64.dll.a +0 -0
  543. scipy/spatial/_voronoi.cp311-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.cp311-win_amd64.dll.a +0 -0
  550. scipy/spatial/transform/_rigid_transform.cp311-win_amd64.pyd +0 -0
  551. scipy/spatial/transform/_rotation.cp311-win_amd64.dll.a +0 -0
  552. scipy/spatial/transform/_rotation.cp311-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.cp311-win_amd64.dll.a +0 -0
  561. scipy/special/_comb.cp311-win_amd64.pyd +0 -0
  562. scipy/special/_ellip_harm_2.cp311-win_amd64.dll.a +0 -0
  563. scipy/special/_ellip_harm_2.cp311-win_amd64.pyd +0 -0
  564. scipy/special/_gufuncs.cp311-win_amd64.dll.a +0 -0
  565. scipy/special/_gufuncs.cp311-win_amd64.pyd +0 -0
  566. scipy/special/_logsumexp.py +67 -58
  567. scipy/special/_orthogonal.pyi +1 -1
  568. scipy/special/_specfun.cp311-win_amd64.dll.a +0 -0
  569. scipy/special/_specfun.cp311-win_amd64.pyd +0 -0
  570. scipy/special/_special_ufuncs.cp311-win_amd64.dll.a +0 -0
  571. scipy/special/_special_ufuncs.cp311-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.cp311-win_amd64.dll.a +0 -0
  575. scipy/special/_test_internal.cp311-win_amd64.pyd +0 -0
  576. scipy/special/_testutils.py +4 -4
  577. scipy/special/_ufuncs.cp311-win_amd64.dll.a +0 -0
  578. scipy/special/_ufuncs.cp311-win_amd64.pyd +0 -0
  579. scipy/special/_ufuncs.pyi +1 -0
  580. scipy/special/_ufuncs.pyx +215 -1400
  581. scipy/special/_ufuncs_cxx.cp311-win_amd64.dll.a +0 -0
  582. scipy/special/_ufuncs_cxx.cp311-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.cp311-win_amd64.dll.a +0 -0
  588. scipy/special/cython_special.cp311-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.cp311-win_amd64.dll.a +0 -0
  606. scipy/stats/_ansari_swilk_statistics.cp311-win_amd64.pyd +0 -0
  607. scipy/stats/_axis_nan_policy.py +5 -12
  608. scipy/stats/_biasedurn.cp311-win_amd64.dll.a +0 -0
  609. scipy/stats/_biasedurn.cp311-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.cp311-win_amd64.dll.a +0 -0
  624. scipy/stats/_levy_stable/levyst.cp311-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.cp311-win_amd64.dll.a +0 -0
  634. scipy/stats/_qmc_cy.cp311-win_amd64.pyd +0 -0
  635. scipy/stats/_qmvnt.py +16 -95
  636. scipy/stats/_qmvnt_cy.cp311-win_amd64.dll.a +0 -0
  637. scipy/stats/_qmvnt_cy.cp311-win_amd64.pyd +0 -0
  638. scipy/stats/_quantile.py +335 -0
  639. scipy/stats/_rcont/rcont.cp311-win_amd64.dll.a +0 -0
  640. scipy/stats/_rcont/rcont.cp311-win_amd64.pyd +0 -0
  641. scipy/stats/_resampling.py +4 -29
  642. scipy/stats/_sampling.py +1 -1
  643. scipy/stats/_sobol.cp311-win_amd64.dll.a +0 -0
  644. scipy/stats/_sobol.cp311-win_amd64.pyd +0 -0
  645. scipy/stats/_stats.cp311-win_amd64.dll.a +0 -0
  646. scipy/stats/_stats.cp311-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.cp311-win_amd64.dll.a +0 -0
  650. scipy/stats/_stats_pythran.cp311-win_amd64.pyd +0 -0
  651. scipy/stats/_unuran/unuran_wrapper.cp311-win_amd64.dll.a +0 -0
  652. scipy/stats/_unuran/unuran_wrapper.cp311-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.cp311-win_amd64.dll.a +0 -0
  687. scipy/interpolate/_bspl.cp311-win_amd64.pyd +0 -0
  688. scipy/optimize/_cobyla.cp311-win_amd64.dll.a +0 -0
  689. scipy/optimize/_cobyla.cp311-win_amd64.pyd +0 -0
  690. scipy/optimize/_cython_nnls.cp311-win_amd64.dll.a +0 -0
  691. scipy/optimize/_cython_nnls.cp311-win_amd64.pyd +0 -0
  692. scipy/optimize/_slsqp.cp311-win_amd64.dll.a +0 -0
  693. scipy/optimize/_slsqp.cp311-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.cp311-win_amd64.dll.a +0 -0
  756. scipy/stats/_mvn.cp311-win_amd64.pyd +0 -0
  757. scipy-1.15.3.dist-info/DELVEWHEEL +0 -2
  758. /scipy-1.15.3-cp311-cp311-win_amd64.whl → /scipy-1.16.0rc2-cp311-cp311-win_amd64.whl +0 -0
  759. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
@@ -24,11 +24,10 @@ import numpy as np
24
24
  from numpy.testing import assert_allclose
25
25
 
26
26
  from scipy.signal import ShortTimeFFT
27
- from scipy.signal import csd, get_window, stft, istft
27
+ from scipy.signal import get_window, stft, istft
28
28
  from scipy.signal._arraytools import const_ext, even_ext, odd_ext, zero_ext
29
29
  from scipy.signal._short_time_fft import FFT_MODE_TYPE
30
- from scipy.signal._spectral_py import _spectral_helper, _triage_segments, \
31
- _median_bias
30
+ from scipy.signal._spectral_py import _triage_segments
32
31
 
33
32
 
34
33
  def _stft_wrapper(x, fs=1.0, window='hann', nperseg=256, noverlap=None,
@@ -226,156 +225,6 @@ def _istft_wrapper(Zxx, fs=1.0, window='hann', nperseg=None, noverlap=None,
226
225
  return t, x, (ST.lower_border_end[0], k_hi)
227
226
 
228
227
 
229
- def _csd_wrapper(x, y, fs=1.0, window='hann', nperseg=None, noverlap=None,
230
- nfft=None, detrend='constant', return_onesided=True,
231
- scaling='density', axis=-1, average='mean'):
232
- """Wrapper for the `csd()` function based on `ShortTimeFFT` for
233
- unit testing.
234
- """
235
- freqs, _, Pxy = _csd_test_shim(x, y, fs, window, nperseg, noverlap, nfft,
236
- detrend, return_onesided, scaling, axis)
237
-
238
- # The following code is taken from csd():
239
- if len(Pxy.shape) >= 2 and Pxy.size > 0:
240
- if Pxy.shape[-1] > 1:
241
- if average == 'median':
242
- # np.median must be passed real arrays for the desired result
243
- bias = _median_bias(Pxy.shape[-1])
244
- if np.iscomplexobj(Pxy):
245
- Pxy = (np.median(np.real(Pxy), axis=-1)
246
- + 1j * np.median(np.imag(Pxy), axis=-1))
247
- else:
248
- Pxy = np.median(Pxy, axis=-1)
249
- Pxy /= bias
250
- elif average == 'mean':
251
- Pxy = Pxy.mean(axis=-1)
252
- else:
253
- raise ValueError(f'average must be "median" or "mean", got {average}')
254
- else:
255
- Pxy = np.reshape(Pxy, Pxy.shape[:-1])
256
-
257
- return freqs, Pxy
258
-
259
-
260
- def _csd_test_shim(x, y, fs=1.0, window='hann', nperseg=None, noverlap=None,
261
- nfft=None, detrend='constant', return_onesided=True,
262
- scaling='density', axis=-1):
263
- """Compare output of _spectral_helper() and ShortTimeFFT, more
264
- precisely _spect_helper_csd() for used in csd_wrapper().
265
-
266
- The motivation of this function is to test if the ShortTimeFFT-based
267
- wrapper `_spect_helper_csd()` returns the same values as `_spectral_helper`.
268
- This function should only be usd by csd() in (unit) testing.
269
- """
270
- freqs, t, Pxy = _spectral_helper(x, y, fs, window, nperseg, noverlap, nfft,
271
- detrend, return_onesided, scaling, axis,
272
- mode='psd')
273
- freqs1, Pxy1 = _spect_helper_csd(x, y, fs, window, nperseg, noverlap, nfft,
274
- detrend, return_onesided, scaling, axis)
275
-
276
- np.testing.assert_allclose(freqs1, freqs)
277
- amax_Pxy = max(np.abs(Pxy).max(), 1) if Pxy.size else 1
278
- atol = np.finfo(Pxy.dtype).resolution * amax_Pxy # needed for large Pxy
279
- # for c_ in range(Pxy.shape[-1]):
280
- # np.testing.assert_allclose(Pxy1[:, c_], Pxy[:, c_], atol=atol)
281
- np.testing.assert_allclose(Pxy1, Pxy, atol=atol)
282
- return freqs, t, Pxy
283
-
284
-
285
- def _spect_helper_csd(x, y, fs=1.0, window='hann', nperseg=None, noverlap=None,
286
- nfft=None, detrend='constant', return_onesided=True,
287
- scaling='density', axis=-1):
288
- """Wrapper for replacing _spectral_helper() by using the ShortTimeFFT
289
- for use by csd().
290
-
291
- This function should be only used by _csd_test_shim() and is only useful
292
- for testing the ShortTimeFFT implementation.
293
- """
294
-
295
- # The following lines are taken from the original _spectral_helper():
296
- same_data = y is x
297
- axis = int(axis)
298
-
299
- # Ensure we have np.arrays, get outdtype
300
- x = np.asarray(x)
301
- if not same_data:
302
- y = np.asarray(y)
303
- # outdtype = np.result_type(x, y, np.complex64)
304
- # else:
305
- # outdtype = np.result_type(x, np.complex64)
306
-
307
- if not same_data:
308
- # Check if we can broadcast the outer axes together
309
- xouter = list(x.shape)
310
- youter = list(y.shape)
311
- xouter.pop(axis)
312
- youter.pop(axis)
313
- try:
314
- outershape = np.broadcast(np.empty(xouter), np.empty(youter)).shape
315
- except ValueError as e:
316
- raise ValueError('x and y cannot be broadcast together.') from e
317
-
318
- if same_data:
319
- if x.size == 0:
320
- return np.empty(x.shape), np.empty(x.shape)
321
- else:
322
- if x.size == 0 or y.size == 0:
323
- outshape = outershape + (min([x.shape[axis], y.shape[axis]]),)
324
- emptyout = np.moveaxis(np.empty(outshape), -1, axis)
325
- return emptyout, emptyout
326
-
327
- if nperseg is not None: # if specified by user
328
- nperseg = int(nperseg)
329
- if nperseg < 1:
330
- raise ValueError('nperseg must be a positive integer')
331
-
332
- # parse window; if array like, then set nperseg = win.shape
333
- n = x.shape[axis] if same_data else max(x.shape[axis], y.shape[axis])
334
- win, nperseg = _triage_segments(window, nperseg, input_length=n)
335
-
336
- if nfft is None:
337
- nfft = nperseg
338
- elif nfft < nperseg:
339
- raise ValueError('nfft must be greater than or equal to nperseg.')
340
- else:
341
- nfft = int(nfft)
342
-
343
- if noverlap is None:
344
- noverlap = nperseg // 2
345
- else:
346
- noverlap = int(noverlap)
347
- if noverlap >= nperseg:
348
- raise ValueError('noverlap must be less than nperseg.')
349
- nstep = nperseg - noverlap
350
-
351
- if np.iscomplexobj(x) and return_onesided:
352
- return_onesided = False
353
-
354
- # using cast() to make mypy happy:
355
- fft_mode = cast(FFT_MODE_TYPE, 'onesided' if return_onesided
356
- else 'twosided')
357
- scale = {'spectrum': 'magnitude', 'density': 'psd'}[scaling]
358
- SFT = ShortTimeFFT(win, nstep, fs, fft_mode=fft_mode, mfft=nfft,
359
- scale_to=scale, phase_shift=None)
360
-
361
- # _spectral_helper() calculates X.conj()*Y instead of X*Y.conj():
362
- Pxy = SFT.spectrogram(y, x, detr=None if detrend is False else detrend,
363
- p0=0, p1=(n-noverlap)//SFT.hop, k_offset=nperseg//2,
364
- axis=axis).conj()
365
- # Note:
366
- # 'onesided2X' scaling of ShortTimeFFT conflicts with the
367
- # scaling='spectrum' parameter, since it doubles the squared magnitude,
368
- # which in the view of the ShortTimeFFT implementation does not make sense.
369
- # Hence, the doubling of the square is implemented here:
370
- if return_onesided:
371
- f_axis = Pxy.ndim - 1 + axis if axis < 0 else axis
372
- Pxy = np.moveaxis(Pxy, f_axis, -1)
373
- Pxy[..., 1:-1 if SFT.mfft % 2 == 0 else None] *= 2
374
- Pxy = np.moveaxis(Pxy, -1, f_axis)
375
-
376
- return SFT.f, Pxy
377
-
378
-
379
228
  def stft_compare(x, fs=1.0, window='hann', nperseg=256, noverlap=None,
380
229
  nfft=None, detrend=False, return_onesided=True,
381
230
  boundary='zeros', padded=True, axis=-1, scaling='spectrum'):
@@ -460,21 +309,3 @@ def istft_compare(Zxx, fs=1.0, window='hann', nperseg=None, noverlap=None,
460
309
  assert_allclose(x_wrapper[k_lo:k_hi], x[k_lo:k_hi], atol=atol, rtol=rtol,
461
310
  err_msg=f"Signal values {e_msg_part}")
462
311
  return t, x
463
-
464
-
465
- def csd_compare(x, y, fs=1.0, window='hann', nperseg=None, noverlap=None,
466
- nfft=None, detrend='constant', return_onesided=True,
467
- scaling='density', axis=-1, average='mean'):
468
- """Assert that the results from the existing `csd()` and `_csd_wrapper()`
469
- are close to each other. """
470
- kw = dict(x=x, y=y, fs=fs, window=window, nperseg=nperseg,
471
- noverlap=noverlap, nfft=nfft, detrend=detrend,
472
- return_onesided=return_onesided, scaling=scaling, axis=axis,
473
- average=average)
474
- freqs0, Pxy0 = csd(**kw)
475
- freqs1, Pxy1 = _csd_wrapper(**kw)
476
-
477
- assert_allclose(freqs1, freqs0)
478
- assert_allclose(Pxy1, Pxy0)
479
- assert_allclose(freqs1, freqs0)
480
- return freqs0, Pxy0
@@ -1,4 +1,5 @@
1
1
  # pylint: disable=missing-docstring
2
+ import math
2
3
  import numpy as np
3
4
 
4
5
  from scipy._lib._array_api import (
@@ -7,9 +8,11 @@ from scipy._lib._array_api import (
7
8
  import pytest
8
9
  from pytest import raises
9
10
 
10
- import scipy.signal._spline_filters as bsp
11
11
  from scipy import signal
12
12
 
13
+ skip_xp_backends = pytest.mark.skip_xp_backends
14
+ xfail_xp_backends = pytest.mark.xfail_xp_backends
15
+
13
16
 
14
17
  class TestBSplines:
15
18
  """Test behaviors of B-splines. Some of the values tested against were
@@ -17,15 +20,17 @@ class TestBSplines:
17
20
  purposes. Others (at integer points) are compared to theoretical
18
21
  expressions (cf. Unser, Aldroubi, Eden, IEEE TSP 1993, Table 1)."""
19
22
 
20
- def test_spline_filter(self):
23
+ @skip_xp_backends(cpu_only=True, exceptions=["cupy"])
24
+ def test_spline_filter(self, xp):
21
25
  rng = np.random.RandomState(12457)
22
26
  # Test the type-error branch
23
- raises(TypeError, bsp.spline_filter, np.asarray([0]), 0)
27
+ raises(TypeError, signal.spline_filter, xp.asarray([0]), 0)
24
28
  # Test the real branch
25
29
  data_array_real = rng.rand(12, 12)
26
30
  # make the magnitude exceed 1, and make some negative
27
31
  data_array_real = 10*(1-2*data_array_real)
28
- result_array_real = np.asarray(
32
+ data_array_real = xp.asarray(data_array_real)
33
+ result_array_real = xp.asarray(
29
34
  [[-.463312621, 8.33391222, .697290949, 5.28390836,
30
35
  5.92066474, 6.59452137, 9.84406950, -8.78324188,
31
36
  7.20675750, -8.17222994, -4.38633345, 9.89917069],
@@ -61,16 +66,19 @@ class TestBSplines:
61
66
  -3.77114594, -1.11903194, -5.39151466, 3.06620093],
62
67
  [9.86326886, 1.05134482, -7.75950607, -3.64429655,
63
68
  7.81848957, -9.02270373, 3.73399754, -4.71962549,
64
- -7.71144306, 3.78263161, 6.46034818, -4.43444731]])
65
- xp_assert_close(bsp.spline_filter(data_array_real, 0),
69
+ -7.71144306, 3.78263161, 6.46034818, -4.43444731]], dtype=xp.float64)
70
+ xp_assert_close(signal.spline_filter(data_array_real, 0),
66
71
  result_array_real)
67
72
 
68
- def test_spline_filter_complex(self):
73
+ @skip_xp_backends(cpu_only=True, exceptions=["cupy"])
74
+ def test_spline_filter_complex(self, xp):
69
75
  rng = np.random.RandomState(12457)
70
76
  data_array_complex = rng.rand(7, 7) + rng.rand(7, 7)*1j
71
77
  # make the magnitude exceed 1, and make some negative
72
78
  data_array_complex = 10*(1+1j-2*data_array_complex)
73
- result_array_complex = np.asarray(
79
+ data_array_complex = xp.asarray(data_array_complex)
80
+
81
+ result_array_complex = xp.asarray(
74
82
  [[-4.61489230e-01-1.92994022j, 8.33332443+6.25519943j,
75
83
  6.96300745e-01-9.05576038j, 5.28294849+3.97541356j,
76
84
  5.92165565+7.68240595j, 6.59493160-1.04542804j,
@@ -98,99 +106,120 @@ class TestBSplines:
98
106
  [7.13875294+2.91851187j, -5.35737514+9.64132309j,
99
107
  -9.66586399+0.70250005j, -9.87717438-2.0262239j,
100
108
  9.93160629+1.5630846j, 4.71948051-2.22050714j,
101
- 9.49550819+7.8995142j]])
109
+ 9.49550819+7.8995142j]], dtype=xp.complex128)
102
110
  # FIXME: for complex types, the computations are done in
103
111
  # single precision (reason unclear). When this is changed,
104
112
  # this test needs updating.
105
- xp_assert_close(bsp.spline_filter(data_array_complex, 0),
113
+ xp_assert_close(signal.spline_filter(data_array_complex, 0),
106
114
  result_array_complex, rtol=1e-6)
107
115
 
108
- def test_gauss_spline(self):
109
- np.random.seed(12459)
110
- assert_almost_equal(bsp.gauss_spline(0, 0), 1.381976597885342)
111
- xp_assert_close(bsp.gauss_spline(np.asarray([1.]), 1),
112
- np.asarray([0.04865217]), atol=1e-9
116
+ def test_gauss_spline(self, xp):
117
+ assert math.isclose(signal.gauss_spline(0, 0), 1.381976597885342)
118
+
119
+ xp_assert_close(signal.gauss_spline(xp.asarray([1.]), 1),
120
+ xp.asarray([0.04865217]), atol=1e-9
113
121
  )
114
122
 
115
- def test_gauss_spline_list(self):
123
+ @skip_xp_backends(np_only=True, reason="deliberate: array-likes are accepted")
124
+ def test_gauss_spline_list(self, xp):
116
125
  # regression test for gh-12152 (accept array_like)
117
126
  knots = [-1.0, 0.0, -1.0]
118
- assert_almost_equal(bsp.gauss_spline(knots, 3),
127
+ assert_almost_equal(signal.gauss_spline(knots, 3),
119
128
  np.asarray([0.15418033, 0.6909883, 0.15418033])
120
129
  )
121
130
 
122
- def test_cspline1d(self):
123
- np.random.seed(12462)
124
- xp_assert_equal(bsp.cspline1d(np.asarray([0])), [0.])
125
- c1d = np.asarray([1.21037185, 1.86293902, 2.98834059, 4.11660378,
126
- 4.78893826])
131
+ @skip_xp_backends(cpu_only=True)
132
+ def test_cspline1d(self, xp):
133
+ xp_assert_equal(signal.cspline1d(xp.asarray([0])),
134
+ xp.asarray([0.], dtype=xp.float64))
135
+ c1d = xp.asarray([1.21037185, 1.86293902, 2.98834059, 4.11660378,
136
+ 4.78893826], dtype=xp.float64)
127
137
  # test lamda != 0
128
- xp_assert_close(bsp.cspline1d(np.asarray([1., 2, 3, 4, 5]), 1), c1d)
129
- c1d0 = np.asarray([0.78683946, 2.05333735, 2.99981113, 3.94741812,
130
- 5.21051638])
131
- xp_assert_close(bsp.cspline1d(np.asarray([1., 2, 3, 4, 5])), c1d0)
132
-
133
- def test_qspline1d(self):
134
- np.random.seed(12463)
135
- xp_assert_equal(bsp.qspline1d(np.asarray([0])), [0.])
138
+ xp_assert_close(signal.cspline1d(xp.asarray([1., 2, 3, 4, 5]), 1), c1d)
139
+ c1d0 = xp.asarray([0.78683946, 2.05333735, 2.99981113, 3.94741812,
140
+ 5.21051638], dtype=xp.float64)
141
+ xp_assert_close(signal.cspline1d(xp.asarray([1., 2, 3, 4, 5])), c1d0)
142
+
143
+ @skip_xp_backends(cpu_only=True)
144
+ def test_qspline1d(self, xp):
145
+ xp_assert_equal(signal.qspline1d(xp.asarray([0])),
146
+ xp.asarray([0.], dtype=xp.float64))
136
147
  # test lamda != 0
137
- raises(ValueError, bsp.qspline1d, np.asarray([1., 2, 3, 4, 5]), 1.)
138
- raises(ValueError, bsp.qspline1d, np.asarray([1., 2, 3, 4, 5]), -1.)
139
- q1d0 = np.asarray([0.85350007, 2.02441743, 2.99999534, 3.97561055,
140
- 5.14634135])
141
- xp_assert_close(bsp.qspline1d(np.asarray([1., 2, 3, 4, 5])), q1d0)
142
-
143
- def test_cspline1d_eval(self):
144
- np.random.seed(12464)
145
- xp_assert_close(bsp.cspline1d_eval(np.asarray([0., 0]), [0.]),
146
- np.asarray([0.])
147
- )
148
- xp_assert_equal(bsp.cspline1d_eval(np.asarray([1., 0, 1]), []),
149
- np.asarray([])
148
+ raises(ValueError, signal.qspline1d, xp.asarray([1., 2, 3, 4, 5]), 1.)
149
+ raises(ValueError, signal.qspline1d, xp.asarray([1., 2, 3, 4, 5]), -1.)
150
+ q1d0 = xp.asarray([0.85350007, 2.02441743, 2.99999534, 3.97561055,
151
+ 5.14634135], dtype=xp.float64)
152
+ xp_assert_close(
153
+ signal.qspline1d(xp.asarray([1., 2, 3, 4, 5], dtype=xp.float64)), q1d0
150
154
  )
155
+
156
+ @skip_xp_backends(cpu_only=True)
157
+ def test_cspline1d_eval(self, xp):
158
+ r = signal.cspline1d_eval(xp.asarray([0., 0], dtype=xp.float64),
159
+ xp.asarray([0.], dtype=xp.float64))
160
+ xp_assert_close(r, xp.asarray([0.], dtype=xp.float64))
161
+
162
+ r = signal.cspline1d_eval(xp.asarray([1., 0, 1], dtype=xp.float64),
163
+ xp.asarray([], dtype=xp.float64))
164
+ xp_assert_equal(r, xp.asarray([], dtype=xp.float64))
151
165
  x = [-3, -2, -1, 0, 1, 2, 3, 4, 5, 6]
152
166
  dx = x[1] - x[0]
153
167
  newx = [-6., -5.5, -5., -4.5, -4., -3.5, -3., -2.5, -2., -1.5, -1.,
154
168
  -0.5, 0., 0.5, 1., 1.5, 2., 2.5, 3., 3.5, 4., 4.5, 5., 5.5, 6.,
155
169
  6.5, 7., 7.5, 8., 8.5, 9., 9.5, 10., 10.5, 11., 11.5, 12.,
156
170
  12.5]
157
- y = np.asarray([4.216, 6.864, 3.514, 6.203, 6.759, 7.433, 7.874, 5.879,
171
+ y = xp.asarray([4.216, 6.864, 3.514, 6.203, 6.759, 7.433, 7.874, 5.879,
158
172
  1.396, 4.094])
159
- cj = bsp.cspline1d(y)
160
- newy = np.asarray([6.203, 4.41570658, 3.514, 5.16924703, 6.864, 6.04643068,
173
+ cj = signal.cspline1d(y)
174
+ newy = xp.asarray([6.203, 4.41570658, 3.514, 5.16924703, 6.864, 6.04643068,
161
175
  4.21600281, 6.04643068, 6.864, 5.16924703, 3.514,
162
176
  4.41570658, 6.203, 6.80717667, 6.759, 6.98971173, 7.433,
163
177
  7.79560142, 7.874, 7.41525761, 5.879, 3.18686814, 1.396,
164
178
  2.24889482, 4.094, 2.24889482, 1.396, 3.18686814, 5.879,
165
179
  7.41525761, 7.874, 7.79560142, 7.433, 6.98971173, 6.759,
166
- 6.80717667, 6.203, 4.41570658])
167
- xp_assert_close(bsp.cspline1d_eval(cj, newx, dx=dx, x0=x[0]), newy)
180
+ 6.80717667, 6.203, 4.41570658], dtype=xp.float64)
181
+ xp_assert_close(
182
+ signal.cspline1d_eval(cj, xp.asarray(newx), dx=dx, x0=x[0]), newy
183
+ )
184
+
185
+ with pytest.raises(ValueError,
186
+ match="Spline coefficients 'cj' must not be empty."):
187
+ signal.cspline1d_eval(xp.asarray([], dtype=xp.float64),
188
+ xp.asarray([0.0], dtype=xp.float64))
168
189
 
169
- def test_qspline1d_eval(self):
170
- np.random.seed(12465)
171
- xp_assert_close(bsp.qspline1d_eval(np.asarray([0., 0]), [0.]),
172
- np.asarray([0.])
190
+ @skip_xp_backends(cpu_only=True)
191
+ def test_qspline1d_eval(self, xp):
192
+ xp_assert_close(signal.qspline1d_eval(xp.asarray([0., 0]), xp.asarray([0.])),
193
+ xp.asarray([0.])
173
194
  )
174
- xp_assert_equal(bsp.qspline1d_eval(np.asarray([1., 0, 1]), []),
175
- np.asarray([])
195
+ xp_assert_equal(signal.qspline1d_eval(xp.asarray([1., 0, 1]), xp.asarray([])),
196
+ xp.asarray([])
176
197
  )
177
198
  x = [-3, -2, -1, 0, 1, 2, 3, 4, 5, 6]
178
- dx = x[1]-x[0]
199
+ dx = x[1] - x[0]
179
200
  newx = [-6., -5.5, -5., -4.5, -4., -3.5, -3., -2.5, -2., -1.5, -1.,
180
201
  -0.5, 0., 0.5, 1., 1.5, 2., 2.5, 3., 3.5, 4., 4.5, 5., 5.5, 6.,
181
202
  6.5, 7., 7.5, 8., 8.5, 9., 9.5, 10., 10.5, 11., 11.5, 12.,
182
203
  12.5]
183
- y = np.asarray([4.216, 6.864, 3.514, 6.203, 6.759, 7.433, 7.874, 5.879,
204
+ y = xp.asarray([4.216, 6.864, 3.514, 6.203, 6.759, 7.433, 7.874, 5.879,
184
205
  1.396, 4.094])
185
- cj = bsp.qspline1d(y)
186
- newy = np.asarray([6.203, 4.49418159, 3.514, 5.18390821, 6.864, 5.91436915,
206
+ cj = signal.qspline1d(y)
207
+ newy = xp.asarray([6.203, 4.49418159, 3.514, 5.18390821, 6.864, 5.91436915,
187
208
  4.21600002, 5.91436915, 6.864, 5.18390821, 3.514,
188
209
  4.49418159, 6.203, 6.71900226, 6.759, 7.03980488, 7.433,
189
210
  7.81016848, 7.874, 7.32718426, 5.879, 3.23872593, 1.396,
190
211
  2.34046013, 4.094, 2.34046013, 1.396, 3.23872593, 5.879,
191
212
  7.32718426, 7.874, 7.81016848, 7.433, 7.03980488, 6.759,
192
- 6.71900226, 6.203, 4.49418159])
193
- xp_assert_close(bsp.qspline1d_eval(cj, newx, dx=dx, x0=x[0]), newy)
213
+ 6.71900226, 6.203, 4.49418159], dtype=xp.float64)
214
+ r = signal.qspline1d_eval(
215
+ cj, xp.asarray(newx, dtype=xp.float64), dx=dx, x0=x[0]
216
+ )
217
+ xp_assert_close(r, newy)
218
+
219
+ with pytest.raises(ValueError,
220
+ match="Spline coefficients 'cj' must not be empty."):
221
+ signal.qspline1d_eval(xp.asarray([], dtype=xp.float64),
222
+ xp.asarray([0.0], dtype=xp.float64))
194
223
 
195
224
 
196
225
  # i/o dtypes with scipy 1.9.1, likely fixed by backwards compat
@@ -198,10 +227,13 @@ sepfir_dtype_map = {np.uint8: np.float32, int: np.float64,
198
227
  np.float32: np.float32, float: float,
199
228
  np.complex64: np.complex64, complex: complex}
200
229
 
230
+
231
+ @skip_xp_backends(np_only=True)
201
232
  class TestSepfir2d:
202
- def test_sepfir2d_invalid_filter(self):
203
- filt = np.array([1.0, 2.0, 4.0, 2.0, 1.0])
233
+ def test_sepfir2d_invalid_filter(self, xp):
234
+ filt = xp.asarray([1.0, 2.0, 4.0, 2.0, 1.0])
204
235
  image = np.random.rand(7, 9)
236
+ image = xp.asarray(image)
205
237
  # No error for odd lengths
206
238
  signal.sepfir2d(image, filt, filt[2:])
207
239
 
@@ -213,25 +245,26 @@ class TestSepfir2d:
213
245
 
214
246
  # Filters must be 1-dimensional
215
247
  with pytest.raises(ValueError, match="object too deep"):
216
- signal.sepfir2d(image, filt.reshape(1, -1), filt)
248
+ signal.sepfir2d(image, xp.reshape(filt, (1, -1)), filt)
217
249
  with pytest.raises(ValueError, match="object too deep"):
218
- signal.sepfir2d(image, filt, filt.reshape(1, -1))
250
+ signal.sepfir2d(image, filt, xp.reshape(filt, (1, -1)))
219
251
 
220
- def test_sepfir2d_invalid_image(self):
221
- filt = np.array([1.0, 2.0, 4.0, 2.0, 1.0])
252
+ def test_sepfir2d_invalid_image(self, xp):
253
+ filt = xp.asarray([1.0, 2.0, 4.0, 2.0, 1.0])
222
254
  image = np.random.rand(8, 8)
255
+ image = xp.asarray(image)
223
256
 
224
257
  # Image must be 2 dimensional
225
258
  with pytest.raises(ValueError, match="object too deep"):
226
- signal.sepfir2d(image.reshape(4, 4, 4), filt, filt)
259
+ signal.sepfir2d(xp.reshape(image, (4, 4, 4)), filt, filt)
227
260
 
228
261
  with pytest.raises(ValueError, match="object of too small depth"):
229
- signal.sepfir2d(image[0], filt, filt)
262
+ signal.sepfir2d(image[0, :], filt, filt)
230
263
 
231
264
  @pytest.mark.parametrize('dtyp',
232
265
  [np.uint8, int, np.float32, float, np.complex64, complex]
233
266
  )
234
- def test_simple(self, dtyp):
267
+ def test_simple(self, dtyp, xp):
235
268
  # test values on a paper-and-pencil example
236
269
  a = np.array([[1, 2, 3, 3, 2, 1],
237
270
  [1, 2, 3, 3, 2, 1],
@@ -254,10 +287,11 @@ class TestSepfir2d:
254
287
  [2., 4., 6., 6., 4., 2.]], dtype=dt)
255
288
  xp_assert_close(result, expected, atol=1e-16)
256
289
 
290
+ @skip_xp_backends(np_only=True, reason="TODO: convert this test")
257
291
  @pytest.mark.parametrize('dtyp',
258
292
  [np.uint8, int, np.float32, float, np.complex64, complex]
259
293
  )
260
- def test_strided(self, dtyp):
294
+ def test_strided(self, dtyp, xp):
261
295
  a = np.array([[1, 2, 3, 3, 2, 1, 1, 2, 3],
262
296
  [1, 2, 3, 3, 2, 1, 1, 2, 3],
263
297
  [1, 2, 3, 3, 2, 1, 1, 2, 3],
@@ -268,11 +302,11 @@ class TestSepfir2d:
268
302
  xp_assert_close(result_strided, result_contig, atol=1e-15)
269
303
  assert result_strided.dtype == result_contig.dtype
270
304
 
305
+ @skip_xp_backends(np_only=True, reason="TODO: convert this test")
271
306
  @pytest.mark.xfail(reason="XXX: filt.size > image.shape: flaky")
272
- def test_sepfir2d_strided_2(self):
307
+ def test_sepfir2d_strided_2(self, xp):
273
308
  # XXX: this test is flaky: fails on some reruns, with
274
309
  # result[0, 1] and result[1, 1] being ~1e+224.
275
- np.random.seed(1234)
276
310
  filt = np.array([1.0, 2.0, 4.0, 2.0, 1.0, 3.0, 2.0])
277
311
  image = np.random.rand(4, 4)
278
312
 
@@ -282,11 +316,12 @@ class TestSepfir2d:
282
316
  [49.120928, 39.681844, 43.596067, 45.085854]])
283
317
  xp_assert_close(signal.sepfir2d(image, filt, filt[::3]), expected)
284
318
 
319
+ @skip_xp_backends(np_only=True, reason="TODO: convert this test")
285
320
  @pytest.mark.xfail(reason="XXX: flaky. pointers OOB on some platforms")
286
321
  @pytest.mark.parametrize('dtyp',
287
322
  [np.uint8, int, np.float32, float, np.complex64, complex]
288
323
  )
289
- def test_sepfir2d_strided_3(self, dtyp):
324
+ def test_sepfir2d_strided_3(self, dtyp, xp):
290
325
  # NB: 'image' and 'filt' dtypes match here. Otherwise we can run into
291
326
  # unsafe casting errors for many combinations. Historically, dtype handling
292
327
  # in `sepfir2d` is a tad baroque; fixing it is an enhancement.
@@ -318,13 +353,13 @@ class TestSepfir2d:
318
353
  assert result.dtype == sepfir_dtype_map[dtyp]
319
354
 
320
355
 
321
- def test_cspline2d():
322
- np.random.seed(181819142)
323
- image = np.random.rand(71, 73)
356
+ def test_cspline2d(xp):
357
+ rng = np.random.RandomState(181819142)
358
+ image = rng.rand(71, 73)
324
359
  signal.cspline2d(image, 8.0)
325
360
 
326
361
 
327
- def test_qspline2d():
328
- np.random.seed(181819143)
329
- image = np.random.rand(71, 73)
362
+ def test_qspline2d(xp):
363
+ rng = np.random.RandomState(181819143)
364
+ image = rng.rand(71, 73)
330
365
  signal.qspline2d(image)
@@ -13,7 +13,6 @@ from scipy.signal import tf2ss, impulse, dimpulse, step, dstep
13
13
 
14
14
 
15
15
  class TestC2D:
16
- @pytest.mark.thread_unsafe # due to Cython fused types, see cython#6506
17
16
  def test_zoh(self):
18
17
  ac = np.eye(2, dtype=np.float64)
19
18
  bc = np.full((2, 1), 0.5, dtype=np.float64)
@@ -354,19 +353,27 @@ class TestC2dLti:
354
353
  B = np.array([[0], [1]])
355
354
  C = np.array([[1, 0]])
356
355
  D = 0
356
+ dt = 0.05
357
357
 
358
358
  A_res = np.array([[0.985136404135682, 0.004876671474795],
359
359
  [0.009753342949590, 0.965629718236502]])
360
360
  B_res = np.array([[0.000122937599964], [0.049135527547844]])
361
361
 
362
362
  sys_ssc = lti(A, B, C, D)
363
- sys_ssd = sys_ssc.to_discrete(0.05)
363
+ sys_ssd = sys_ssc.to_discrete(dt=dt)
364
364
 
365
365
  xp_assert_close(sys_ssd.A, A_res)
366
366
  xp_assert_close(sys_ssd.B, B_res)
367
367
  xp_assert_close(sys_ssd.C, C)
368
368
  xp_assert_close(sys_ssd.D, np.zeros_like(sys_ssd.D))
369
369
 
370
+ sys_ssd2 = c2d(sys_ssc, dt=dt)
371
+
372
+ xp_assert_close(sys_ssd2.A, A_res)
373
+ xp_assert_close(sys_ssd2.B, B_res)
374
+ xp_assert_close(sys_ssd2.C, C)
375
+ xp_assert_close(sys_ssd2.D, np.zeros_like(sys_ssd2.D))
376
+
370
377
  def test_c2d_tf(self):
371
378
 
372
379
  sys = lti([0.5, 0.3], [1.0, 0.4])