scipy 1.15.3__cp311-cp311-win_amd64.whl → 1.16.0__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 (760) 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 +282 -151
  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/blas.py +35 -24
  268. scipy/linalg/cython_blas.cp311-win_amd64.dll.a +0 -0
  269. scipy/linalg/cython_blas.cp311-win_amd64.pyd +0 -0
  270. scipy/linalg/cython_lapack.cp311-win_amd64.dll.a +0 -0
  271. scipy/linalg/cython_lapack.cp311-win_amd64.pyd +0 -0
  272. scipy/linalg/lapack.py +22 -2
  273. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  274. scipy/linalg/tests/test_basic.py +31 -16
  275. scipy/linalg/tests/test_batch.py +588 -0
  276. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  277. scipy/linalg/tests/test_decomp.py +40 -3
  278. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  279. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  280. scipy/linalg/tests/test_lapack.py +115 -7
  281. scipy/linalg/tests/test_matfuncs.py +157 -102
  282. scipy/linalg/tests/test_procrustes.py +0 -7
  283. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  284. scipy/linalg/tests/test_special_matrices.py +1 -5
  285. scipy/ndimage/__init__.py +1 -0
  286. scipy/ndimage/_ctest.cp311-win_amd64.dll.a +0 -0
  287. scipy/ndimage/_ctest.cp311-win_amd64.pyd +0 -0
  288. scipy/ndimage/_cytest.cp311-win_amd64.dll.a +0 -0
  289. scipy/ndimage/_cytest.cp311-win_amd64.pyd +0 -0
  290. scipy/ndimage/_delegators.py +8 -2
  291. scipy/ndimage/_filters.py +453 -5
  292. scipy/ndimage/_interpolation.py +36 -6
  293. scipy/ndimage/_measurements.py +4 -2
  294. scipy/ndimage/_morphology.py +5 -0
  295. scipy/ndimage/_nd_image.cp311-win_amd64.dll.a +0 -0
  296. scipy/ndimage/_nd_image.cp311-win_amd64.pyd +0 -0
  297. scipy/ndimage/_ni_docstrings.py +5 -1
  298. scipy/ndimage/_ni_label.cp311-win_amd64.dll.a +0 -0
  299. scipy/ndimage/_ni_label.cp311-win_amd64.pyd +0 -0
  300. scipy/ndimage/_ni_support.py +1 -5
  301. scipy/ndimage/_rank_filter_1d.cp311-win_amd64.dll.a +0 -0
  302. scipy/ndimage/_rank_filter_1d.cp311-win_amd64.pyd +0 -0
  303. scipy/ndimage/_support_alternative_backends.py +18 -6
  304. scipy/ndimage/tests/test_filters.py +370 -259
  305. scipy/ndimage/tests/test_fourier.py +7 -9
  306. scipy/ndimage/tests/test_interpolation.py +68 -61
  307. scipy/ndimage/tests/test_measurements.py +18 -35
  308. scipy/ndimage/tests/test_morphology.py +143 -131
  309. scipy/ndimage/tests/test_splines.py +1 -3
  310. scipy/odr/__odrpack.cp311-win_amd64.dll.a +0 -0
  311. scipy/odr/__odrpack.cp311-win_amd64.pyd +0 -0
  312. scipy/optimize/_basinhopping.py +13 -7
  313. scipy/optimize/_bglu_dense.cp311-win_amd64.dll.a +0 -0
  314. scipy/optimize/_bglu_dense.cp311-win_amd64.pyd +0 -0
  315. scipy/optimize/_bracket.py +17 -24
  316. scipy/optimize/_chandrupatla.py +9 -10
  317. scipy/optimize/_cobyla_py.py +104 -123
  318. scipy/optimize/_constraints.py +14 -10
  319. scipy/optimize/_differentiable_functions.py +371 -230
  320. scipy/optimize/_differentialevolution.py +4 -3
  321. scipy/optimize/_direct.cp311-win_amd64.dll.a +0 -0
  322. scipy/optimize/_direct.cp311-win_amd64.pyd +0 -0
  323. scipy/optimize/_dual_annealing.py +1 -1
  324. scipy/optimize/_elementwise.py +1 -4
  325. scipy/optimize/_group_columns.cp311-win_amd64.dll.a +0 -0
  326. scipy/optimize/_group_columns.cp311-win_amd64.pyd +0 -0
  327. scipy/optimize/_highspy/_core.cp311-win_amd64.dll.a +0 -0
  328. scipy/optimize/_highspy/_core.cp311-win_amd64.pyd +0 -0
  329. scipy/optimize/_highspy/_highs_options.cp311-win_amd64.dll.a +0 -0
  330. scipy/optimize/_highspy/_highs_options.cp311-win_amd64.pyd +0 -0
  331. scipy/optimize/_lbfgsb.cp311-win_amd64.dll.a +0 -0
  332. scipy/optimize/_lbfgsb.cp311-win_amd64.pyd +0 -0
  333. scipy/optimize/_lbfgsb_py.py +80 -24
  334. scipy/optimize/_linprog_doc.py +2 -2
  335. scipy/optimize/_linprog_highs.py +2 -2
  336. scipy/optimize/_linprog_ip.py +25 -10
  337. scipy/optimize/_linprog_util.py +14 -16
  338. scipy/optimize/_lsap.cp311-win_amd64.dll.a +0 -0
  339. scipy/optimize/_lsap.cp311-win_amd64.pyd +0 -0
  340. scipy/optimize/_lsq/common.py +3 -3
  341. scipy/optimize/_lsq/dogbox.py +16 -2
  342. scipy/optimize/_lsq/givens_elimination.cp311-win_amd64.dll.a +0 -0
  343. scipy/optimize/_lsq/givens_elimination.cp311-win_amd64.pyd +0 -0
  344. scipy/optimize/_lsq/least_squares.py +198 -126
  345. scipy/optimize/_lsq/lsq_linear.py +6 -6
  346. scipy/optimize/_lsq/trf.py +35 -8
  347. scipy/optimize/_milp.py +3 -1
  348. scipy/optimize/_minimize.py +105 -36
  349. scipy/optimize/_minpack.cp311-win_amd64.dll.a +0 -0
  350. scipy/optimize/_minpack.cp311-win_amd64.pyd +0 -0
  351. scipy/optimize/_minpack_py.py +21 -14
  352. scipy/optimize/_moduleTNC.cp311-win_amd64.dll.a +0 -0
  353. scipy/optimize/_moduleTNC.cp311-win_amd64.pyd +0 -0
  354. scipy/optimize/_nnls.py +20 -21
  355. scipy/optimize/_nonlin.py +34 -3
  356. scipy/optimize/_numdiff.py +288 -110
  357. scipy/optimize/_optimize.py +86 -48
  358. scipy/optimize/_pava_pybind.cp311-win_amd64.dll.a +0 -0
  359. scipy/optimize/_pava_pybind.cp311-win_amd64.pyd +0 -0
  360. scipy/optimize/_remove_redundancy.py +5 -5
  361. scipy/optimize/_root_scalar.py +1 -1
  362. scipy/optimize/_shgo.py +6 -0
  363. scipy/optimize/_shgo_lib/_complex.py +1 -1
  364. scipy/optimize/_slsqp_py.py +216 -124
  365. scipy/optimize/_slsqplib.cp311-win_amd64.dll.a +0 -0
  366. scipy/optimize/_slsqplib.cp311-win_amd64.pyd +0 -0
  367. scipy/optimize/_spectral.py +1 -1
  368. scipy/optimize/_tnc.py +8 -1
  369. scipy/optimize/_trlib/_trlib.cp311-win_amd64.dll.a +0 -0
  370. scipy/optimize/_trlib/_trlib.cp311-win_amd64.pyd +0 -0
  371. scipy/optimize/_trustregion.py +20 -6
  372. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  373. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  374. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  375. scipy/optimize/_trustregion_constr/projections.py +12 -8
  376. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  377. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  378. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  379. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  380. scipy/optimize/_trustregion_exact.py +0 -1
  381. scipy/optimize/_zeros.cp311-win_amd64.dll.a +0 -0
  382. scipy/optimize/_zeros.cp311-win_amd64.pyd +0 -0
  383. scipy/optimize/_zeros_py.py +97 -17
  384. scipy/optimize/cython_optimize/_zeros.cp311-win_amd64.dll.a +0 -0
  385. scipy/optimize/cython_optimize/_zeros.cp311-win_amd64.pyd +0 -0
  386. scipy/optimize/slsqp.py +0 -1
  387. scipy/optimize/tests/test__basinhopping.py +1 -1
  388. scipy/optimize/tests/test__differential_evolution.py +4 -4
  389. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  390. scipy/optimize/tests/test__numdiff.py +66 -22
  391. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  392. scipy/optimize/tests/test__shgo.py +9 -1
  393. scipy/optimize/tests/test_bracket.py +36 -46
  394. scipy/optimize/tests/test_chandrupatla.py +133 -135
  395. scipy/optimize/tests/test_cobyla.py +74 -45
  396. scipy/optimize/tests/test_constraints.py +1 -1
  397. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  398. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  399. scipy/optimize/tests/test_least_squares.py +125 -13
  400. scipy/optimize/tests/test_linear_assignment.py +3 -3
  401. scipy/optimize/tests/test_linprog.py +3 -3
  402. scipy/optimize/tests/test_lsq_linear.py +6 -6
  403. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  404. scipy/optimize/tests/test_minpack.py +4 -4
  405. scipy/optimize/tests/test_nnls.py +43 -3
  406. scipy/optimize/tests/test_nonlin.py +36 -0
  407. scipy/optimize/tests/test_optimize.py +98 -20
  408. scipy/optimize/tests/test_slsqp.py +36 -4
  409. scipy/optimize/tests/test_zeros.py +34 -1
  410. scipy/signal/__init__.py +12 -23
  411. scipy/signal/_delegators.py +568 -0
  412. scipy/signal/_filter_design.py +459 -241
  413. scipy/signal/_fir_filter_design.py +262 -90
  414. scipy/signal/_lti_conversion.py +3 -2
  415. scipy/signal/_ltisys.py +118 -91
  416. scipy/signal/_max_len_seq_inner.cp311-win_amd64.dll.a +0 -0
  417. scipy/signal/_max_len_seq_inner.cp311-win_amd64.pyd +0 -0
  418. scipy/signal/_peak_finding_utils.cp311-win_amd64.dll.a +0 -0
  419. scipy/signal/_peak_finding_utils.cp311-win_amd64.pyd +0 -0
  420. scipy/signal/_polyutils.py +172 -0
  421. scipy/signal/_short_time_fft.py +519 -70
  422. scipy/signal/_signal_api.py +30 -0
  423. scipy/signal/_signaltools.py +719 -399
  424. scipy/signal/_sigtools.cp311-win_amd64.dll.a +0 -0
  425. scipy/signal/_sigtools.cp311-win_amd64.pyd +0 -0
  426. scipy/signal/_sosfilt.cp311-win_amd64.dll.a +0 -0
  427. scipy/signal/_sosfilt.cp311-win_amd64.pyd +0 -0
  428. scipy/signal/_spectral_py.py +230 -50
  429. scipy/signal/_spline.cp311-win_amd64.dll.a +0 -0
  430. scipy/signal/_spline.cp311-win_amd64.pyd +0 -0
  431. scipy/signal/_spline_filters.py +108 -68
  432. scipy/signal/_support_alternative_backends.py +73 -0
  433. scipy/signal/_upfirdn.py +4 -1
  434. scipy/signal/_upfirdn_apply.cp311-win_amd64.dll.a +0 -0
  435. scipy/signal/_upfirdn_apply.cp311-win_amd64.pyd +0 -0
  436. scipy/signal/_waveforms.py +2 -11
  437. scipy/signal/_wavelets.py +1 -1
  438. scipy/signal/fir_filter_design.py +1 -0
  439. scipy/signal/spline.py +4 -11
  440. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  441. scipy/signal/tests/test_bsplines.py +114 -79
  442. scipy/signal/tests/test_cont2discrete.py +9 -2
  443. scipy/signal/tests/test_filter_design.py +721 -481
  444. scipy/signal/tests/test_fir_filter_design.py +332 -140
  445. scipy/signal/tests/test_savitzky_golay.py +4 -3
  446. scipy/signal/tests/test_short_time_fft.py +221 -3
  447. scipy/signal/tests/test_signaltools.py +2145 -1349
  448. scipy/signal/tests/test_spectral.py +50 -6
  449. scipy/signal/tests/test_splines.py +161 -96
  450. scipy/signal/tests/test_upfirdn.py +84 -50
  451. scipy/signal/tests/test_waveforms.py +20 -0
  452. scipy/signal/tests/test_windows.py +607 -466
  453. scipy/signal/windows/_windows.py +287 -148
  454. scipy/sparse/__init__.py +23 -4
  455. scipy/sparse/_base.py +270 -108
  456. scipy/sparse/_bsr.py +7 -4
  457. scipy/sparse/_compressed.py +59 -231
  458. scipy/sparse/_construct.py +90 -38
  459. scipy/sparse/_coo.py +115 -181
  460. scipy/sparse/_csc.py +4 -4
  461. scipy/sparse/_csparsetools.cp311-win_amd64.dll.a +0 -0
  462. scipy/sparse/_csparsetools.cp311-win_amd64.pyd +0 -0
  463. scipy/sparse/_csr.py +2 -2
  464. scipy/sparse/_data.py +48 -48
  465. scipy/sparse/_dia.py +105 -18
  466. scipy/sparse/_dok.py +0 -23
  467. scipy/sparse/_index.py +4 -4
  468. scipy/sparse/_matrix.py +23 -0
  469. scipy/sparse/_sparsetools.cp311-win_amd64.dll.a +0 -0
  470. scipy/sparse/_sparsetools.cp311-win_amd64.pyd +0 -0
  471. scipy/sparse/_sputils.py +37 -22
  472. scipy/sparse/base.py +0 -9
  473. scipy/sparse/bsr.py +0 -14
  474. scipy/sparse/compressed.py +0 -23
  475. scipy/sparse/construct.py +0 -6
  476. scipy/sparse/coo.py +0 -14
  477. scipy/sparse/csc.py +0 -3
  478. scipy/sparse/csgraph/_flow.cp311-win_amd64.dll.a +0 -0
  479. scipy/sparse/csgraph/_flow.cp311-win_amd64.pyd +0 -0
  480. scipy/sparse/csgraph/_matching.cp311-win_amd64.dll.a +0 -0
  481. scipy/sparse/csgraph/_matching.cp311-win_amd64.pyd +0 -0
  482. scipy/sparse/csgraph/_min_spanning_tree.cp311-win_amd64.dll.a +0 -0
  483. scipy/sparse/csgraph/_min_spanning_tree.cp311-win_amd64.pyd +0 -0
  484. scipy/sparse/csgraph/_reordering.cp311-win_amd64.dll.a +0 -0
  485. scipy/sparse/csgraph/_reordering.cp311-win_amd64.pyd +0 -0
  486. scipy/sparse/csgraph/_shortest_path.cp311-win_amd64.dll.a +0 -0
  487. scipy/sparse/csgraph/_shortest_path.cp311-win_amd64.pyd +0 -0
  488. scipy/sparse/csgraph/_tools.cp311-win_amd64.dll.a +0 -0
  489. scipy/sparse/csgraph/_tools.cp311-win_amd64.pyd +0 -0
  490. scipy/sparse/csgraph/_traversal.cp311-win_amd64.dll.a +0 -0
  491. scipy/sparse/csgraph/_traversal.cp311-win_amd64.pyd +0 -0
  492. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  493. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  494. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  495. scipy/sparse/csr.py +0 -5
  496. scipy/sparse/data.py +1 -6
  497. scipy/sparse/dia.py +0 -7
  498. scipy/sparse/dok.py +0 -10
  499. scipy/sparse/linalg/_dsolve/_superlu.cp311-win_amd64.dll.a +0 -0
  500. scipy/sparse/linalg/_dsolve/_superlu.cp311-win_amd64.pyd +0 -0
  501. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  502. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  503. scipy/sparse/linalg/_eigen/arpack/_arpack.cp311-win_amd64.dll.a +0 -0
  504. scipy/sparse/linalg/_eigen/arpack/_arpack.cp311-win_amd64.pyd +0 -0
  505. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  506. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  507. scipy/sparse/linalg/_interface.py +17 -18
  508. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  509. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  510. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  511. scipy/sparse/linalg/_isolve/minres.py +5 -5
  512. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  513. scipy/sparse/linalg/_isolve/utils.py +2 -8
  514. scipy/sparse/linalg/_matfuncs.py +1 -1
  515. scipy/sparse/linalg/_norm.py +1 -1
  516. scipy/sparse/linalg/_propack/_cpropack.cp311-win_amd64.dll.a +0 -0
  517. scipy/sparse/linalg/_propack/_cpropack.cp311-win_amd64.pyd +0 -0
  518. scipy/sparse/linalg/_propack/_dpropack.cp311-win_amd64.dll.a +0 -0
  519. scipy/sparse/linalg/_propack/_dpropack.cp311-win_amd64.pyd +0 -0
  520. scipy/sparse/linalg/_propack/_spropack.cp311-win_amd64.dll.a +0 -0
  521. scipy/sparse/linalg/_propack/_spropack.cp311-win_amd64.pyd +0 -0
  522. scipy/sparse/linalg/_propack/_zpropack.cp311-win_amd64.dll.a +0 -0
  523. scipy/sparse/linalg/_propack/_zpropack.cp311-win_amd64.pyd +0 -0
  524. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  525. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  526. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  527. scipy/sparse/tests/test_base.py +214 -42
  528. scipy/sparse/tests/test_common1d.py +7 -7
  529. scipy/sparse/tests/test_construct.py +1 -1
  530. scipy/sparse/tests/test_coo.py +272 -4
  531. scipy/sparse/tests/test_sparsetools.py +5 -0
  532. scipy/sparse/tests/test_sputils.py +36 -7
  533. scipy/spatial/_ckdtree.cp311-win_amd64.dll.a +0 -0
  534. scipy/spatial/_ckdtree.cp311-win_amd64.pyd +0 -0
  535. scipy/spatial/_distance_pybind.cp311-win_amd64.dll.a +0 -0
  536. scipy/spatial/_distance_pybind.cp311-win_amd64.pyd +0 -0
  537. scipy/spatial/_distance_wrap.cp311-win_amd64.dll.a +0 -0
  538. scipy/spatial/_distance_wrap.cp311-win_amd64.pyd +0 -0
  539. scipy/spatial/_hausdorff.cp311-win_amd64.dll.a +0 -0
  540. scipy/spatial/_hausdorff.cp311-win_amd64.pyd +0 -0
  541. scipy/spatial/_qhull.cp311-win_amd64.dll.a +0 -0
  542. scipy/spatial/_qhull.cp311-win_amd64.pyd +0 -0
  543. scipy/spatial/_voronoi.cp311-win_amd64.dll.a +0 -0
  544. scipy/spatial/_voronoi.cp311-win_amd64.pyd +0 -0
  545. scipy/spatial/distance.py +49 -42
  546. scipy/spatial/tests/test_distance.py +15 -1
  547. scipy/spatial/tests/test_kdtree.py +1 -0
  548. scipy/spatial/tests/test_qhull.py +7 -2
  549. scipy/spatial/transform/__init__.py +5 -3
  550. scipy/spatial/transform/_rigid_transform.cp311-win_amd64.dll.a +0 -0
  551. scipy/spatial/transform/_rigid_transform.cp311-win_amd64.pyd +0 -0
  552. scipy/spatial/transform/_rotation.cp311-win_amd64.dll.a +0 -0
  553. scipy/spatial/transform/_rotation.cp311-win_amd64.pyd +0 -0
  554. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  555. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  556. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  557. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  558. scipy/special/__init__.py +1 -47
  559. scipy/special/_add_newdocs.py +34 -772
  560. scipy/special/_basic.py +22 -25
  561. scipy/special/_comb.cp311-win_amd64.dll.a +0 -0
  562. scipy/special/_comb.cp311-win_amd64.pyd +0 -0
  563. scipy/special/_ellip_harm_2.cp311-win_amd64.dll.a +0 -0
  564. scipy/special/_ellip_harm_2.cp311-win_amd64.pyd +0 -0
  565. scipy/special/_gufuncs.cp311-win_amd64.dll.a +0 -0
  566. scipy/special/_gufuncs.cp311-win_amd64.pyd +0 -0
  567. scipy/special/_logsumexp.py +67 -58
  568. scipy/special/_orthogonal.pyi +1 -1
  569. scipy/special/_specfun.cp311-win_amd64.dll.a +0 -0
  570. scipy/special/_specfun.cp311-win_amd64.pyd +0 -0
  571. scipy/special/_special_ufuncs.cp311-win_amd64.dll.a +0 -0
  572. scipy/special/_special_ufuncs.cp311-win_amd64.pyd +0 -0
  573. scipy/special/_spherical_bessel.py +4 -4
  574. scipy/special/_support_alternative_backends.py +212 -119
  575. scipy/special/_test_internal.cp311-win_amd64.dll.a +0 -0
  576. scipy/special/_test_internal.cp311-win_amd64.pyd +0 -0
  577. scipy/special/_testutils.py +4 -4
  578. scipy/special/_ufuncs.cp311-win_amd64.dll.a +0 -0
  579. scipy/special/_ufuncs.cp311-win_amd64.pyd +0 -0
  580. scipy/special/_ufuncs.pyi +1 -0
  581. scipy/special/_ufuncs.pyx +215 -1400
  582. scipy/special/_ufuncs_cxx.cp311-win_amd64.dll.a +0 -0
  583. scipy/special/_ufuncs_cxx.cp311-win_amd64.pyd +0 -0
  584. scipy/special/_ufuncs_cxx.pxd +2 -15
  585. scipy/special/_ufuncs_cxx.pyx +5 -44
  586. scipy/special/_ufuncs_cxx_defs.h +2 -16
  587. scipy/special/_ufuncs_defs.h +0 -8
  588. scipy/special/cython_special.cp311-win_amd64.dll.a +0 -0
  589. scipy/special/cython_special.cp311-win_amd64.pyd +0 -0
  590. scipy/special/cython_special.pxd +1 -1
  591. scipy/special/tests/_cython_examples/meson.build +10 -1
  592. scipy/special/tests/test_basic.py +153 -20
  593. scipy/special/tests/test_boost_ufuncs.py +3 -0
  594. scipy/special/tests/test_cdflib.py +35 -11
  595. scipy/special/tests/test_gammainc.py +16 -0
  596. scipy/special/tests/test_hyp2f1.py +2 -2
  597. scipy/special/tests/test_log1mexp.py +85 -0
  598. scipy/special/tests/test_logsumexp.py +206 -64
  599. scipy/special/tests/test_mpmath.py +1 -0
  600. scipy/special/tests/test_nan_inputs.py +1 -1
  601. scipy/special/tests/test_orthogonal.py +17 -18
  602. scipy/special/tests/test_sf_error.py +3 -2
  603. scipy/special/tests/test_sph_harm.py +6 -7
  604. scipy/special/tests/test_support_alternative_backends.py +211 -76
  605. scipy/stats/__init__.py +4 -1
  606. scipy/stats/_ansari_swilk_statistics.cp311-win_amd64.dll.a +0 -0
  607. scipy/stats/_ansari_swilk_statistics.cp311-win_amd64.pyd +0 -0
  608. scipy/stats/_axis_nan_policy.py +5 -12
  609. scipy/stats/_biasedurn.cp311-win_amd64.dll.a +0 -0
  610. scipy/stats/_biasedurn.cp311-win_amd64.pyd +0 -0
  611. scipy/stats/_continued_fraction.py +387 -0
  612. scipy/stats/_continuous_distns.py +277 -310
  613. scipy/stats/_correlation.py +1 -1
  614. scipy/stats/_covariance.py +6 -3
  615. scipy/stats/_discrete_distns.py +39 -32
  616. scipy/stats/_distn_infrastructure.py +39 -12
  617. scipy/stats/_distribution_infrastructure.py +920 -238
  618. scipy/stats/_entropy.py +9 -10
  619. scipy/{_lib → stats}/_finite_differences.py +1 -1
  620. scipy/stats/_hypotests.py +83 -50
  621. scipy/stats/_kde.py +53 -49
  622. scipy/stats/_ksstats.py +1 -1
  623. scipy/stats/_levy_stable/__init__.py +7 -15
  624. scipy/stats/_levy_stable/levyst.cp311-win_amd64.dll.a +0 -0
  625. scipy/stats/_levy_stable/levyst.cp311-win_amd64.pyd +0 -0
  626. scipy/stats/_morestats.py +118 -73
  627. scipy/stats/_mstats_basic.py +13 -17
  628. scipy/stats/_mstats_extras.py +8 -8
  629. scipy/stats/_multivariate.py +89 -113
  630. scipy/stats/_new_distributions.py +97 -20
  631. scipy/stats/_page_trend_test.py +12 -5
  632. scipy/stats/_probability_distribution.py +265 -43
  633. scipy/stats/_qmc.py +14 -9
  634. scipy/stats/_qmc_cy.cp311-win_amd64.dll.a +0 -0
  635. scipy/stats/_qmc_cy.cp311-win_amd64.pyd +0 -0
  636. scipy/stats/_qmvnt.py +16 -95
  637. scipy/stats/_qmvnt_cy.cp311-win_amd64.dll.a +0 -0
  638. scipy/stats/_qmvnt_cy.cp311-win_amd64.pyd +0 -0
  639. scipy/stats/_quantile.py +335 -0
  640. scipy/stats/_rcont/rcont.cp311-win_amd64.dll.a +0 -0
  641. scipy/stats/_rcont/rcont.cp311-win_amd64.pyd +0 -0
  642. scipy/stats/_resampling.py +5 -30
  643. scipy/stats/_sampling.py +1 -1
  644. scipy/stats/_sobol.cp311-win_amd64.dll.a +0 -0
  645. scipy/stats/_sobol.cp311-win_amd64.pyd +0 -0
  646. scipy/stats/_stats.cp311-win_amd64.dll.a +0 -0
  647. scipy/stats/_stats.cp311-win_amd64.pyd +0 -0
  648. scipy/stats/_stats_mstats_common.py +21 -2
  649. scipy/stats/_stats_py.py +551 -477
  650. scipy/stats/_stats_pythran.cp311-win_amd64.dll.a +0 -0
  651. scipy/stats/_stats_pythran.cp311-win_amd64.pyd +0 -0
  652. scipy/stats/_unuran/unuran_wrapper.cp311-win_amd64.dll.a +0 -0
  653. scipy/stats/_unuran/unuran_wrapper.cp311-win_amd64.pyd +0 -0
  654. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  655. scipy/stats/_variation.py +6 -8
  656. scipy/stats/_wilcoxon.py +13 -7
  657. scipy/stats/tests/common_tests.py +6 -4
  658. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  659. scipy/stats/tests/test_continued_fraction.py +173 -0
  660. scipy/stats/tests/test_continuous.py +379 -60
  661. scipy/stats/tests/test_continuous_basic.py +18 -12
  662. scipy/stats/tests/test_discrete_basic.py +14 -8
  663. scipy/stats/tests/test_discrete_distns.py +16 -16
  664. scipy/stats/tests/test_distributions.py +95 -75
  665. scipy/stats/tests/test_entropy.py +40 -48
  666. scipy/stats/tests/test_fit.py +4 -3
  667. scipy/stats/tests/test_hypotests.py +153 -24
  668. scipy/stats/tests/test_kdeoth.py +109 -41
  669. scipy/stats/tests/test_marray.py +289 -0
  670. scipy/stats/tests/test_morestats.py +81 -49
  671. scipy/stats/tests/test_mstats_basic.py +3 -3
  672. scipy/stats/tests/test_multivariate.py +434 -83
  673. scipy/stats/tests/test_qmc.py +13 -10
  674. scipy/stats/tests/test_quantile.py +199 -0
  675. scipy/stats/tests/test_rank.py +119 -112
  676. scipy/stats/tests/test_resampling.py +47 -56
  677. scipy/stats/tests/test_sampling.py +9 -4
  678. scipy/stats/tests/test_stats.py +799 -939
  679. scipy/stats/tests/test_variation.py +8 -6
  680. scipy/version.py +2 -2
  681. scipy-1.16.0.dist-info/DELVEWHEEL +2 -0
  682. {scipy-1.15.3.dist-info → scipy-1.16.0.dist-info}/LICENSE.txt +4 -4
  683. {scipy-1.15.3.dist-info → scipy-1.16.0.dist-info}/METADATA +11 -11
  684. {scipy-1.15.3.dist-info → scipy-1.16.0.dist-info}/RECORD +686 -694
  685. scipy/_lib/array_api_extra/_funcs.py +0 -484
  686. scipy/_lib/array_api_extra/_typing.py +0 -8
  687. scipy/interpolate/_bspl.cp311-win_amd64.dll.a +0 -0
  688. scipy/interpolate/_bspl.cp311-win_amd64.pyd +0 -0
  689. scipy/optimize/_cobyla.cp311-win_amd64.dll.a +0 -0
  690. scipy/optimize/_cobyla.cp311-win_amd64.pyd +0 -0
  691. scipy/optimize/_cython_nnls.cp311-win_amd64.dll.a +0 -0
  692. scipy/optimize/_cython_nnls.cp311-win_amd64.pyd +0 -0
  693. scipy/optimize/_slsqp.cp311-win_amd64.dll.a +0 -0
  694. scipy/optimize/_slsqp.cp311-win_amd64.pyd +0 -0
  695. scipy/spatial/qhull_src/COPYING.txt +0 -38
  696. scipy/special/libsf_error_state.dll +0 -0
  697. scipy/special/libsf_error_state.dll.a +0 -0
  698. scipy/special/tests/test_log_softmax.py +0 -109
  699. scipy/special/tests/test_xsf_cuda.py +0 -114
  700. scipy/special/xsf/binom.h +0 -89
  701. scipy/special/xsf/cdflib.h +0 -100
  702. scipy/special/xsf/cephes/airy.h +0 -307
  703. scipy/special/xsf/cephes/besselpoly.h +0 -51
  704. scipy/special/xsf/cephes/beta.h +0 -257
  705. scipy/special/xsf/cephes/cbrt.h +0 -131
  706. scipy/special/xsf/cephes/chbevl.h +0 -85
  707. scipy/special/xsf/cephes/chdtr.h +0 -193
  708. scipy/special/xsf/cephes/const.h +0 -87
  709. scipy/special/xsf/cephes/ellie.h +0 -293
  710. scipy/special/xsf/cephes/ellik.h +0 -251
  711. scipy/special/xsf/cephes/ellpe.h +0 -107
  712. scipy/special/xsf/cephes/ellpk.h +0 -117
  713. scipy/special/xsf/cephes/expn.h +0 -260
  714. scipy/special/xsf/cephes/gamma.h +0 -398
  715. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  716. scipy/special/xsf/cephes/hyperg.h +0 -361
  717. scipy/special/xsf/cephes/i0.h +0 -149
  718. scipy/special/xsf/cephes/i1.h +0 -158
  719. scipy/special/xsf/cephes/igam.h +0 -421
  720. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  721. scipy/special/xsf/cephes/igami.h +0 -313
  722. scipy/special/xsf/cephes/j0.h +0 -225
  723. scipy/special/xsf/cephes/j1.h +0 -198
  724. scipy/special/xsf/cephes/jv.h +0 -715
  725. scipy/special/xsf/cephes/k0.h +0 -164
  726. scipy/special/xsf/cephes/k1.h +0 -163
  727. scipy/special/xsf/cephes/kn.h +0 -243
  728. scipy/special/xsf/cephes/lanczos.h +0 -112
  729. scipy/special/xsf/cephes/ndtr.h +0 -275
  730. scipy/special/xsf/cephes/poch.h +0 -85
  731. scipy/special/xsf/cephes/polevl.h +0 -167
  732. scipy/special/xsf/cephes/psi.h +0 -194
  733. scipy/special/xsf/cephes/rgamma.h +0 -111
  734. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  735. scipy/special/xsf/cephes/shichi.h +0 -248
  736. scipy/special/xsf/cephes/sici.h +0 -224
  737. scipy/special/xsf/cephes/sindg.h +0 -221
  738. scipy/special/xsf/cephes/tandg.h +0 -139
  739. scipy/special/xsf/cephes/trig.h +0 -58
  740. scipy/special/xsf/cephes/unity.h +0 -186
  741. scipy/special/xsf/cephes/zeta.h +0 -172
  742. scipy/special/xsf/config.h +0 -304
  743. scipy/special/xsf/digamma.h +0 -205
  744. scipy/special/xsf/error.h +0 -57
  745. scipy/special/xsf/evalpoly.h +0 -47
  746. scipy/special/xsf/expint.h +0 -266
  747. scipy/special/xsf/hyp2f1.h +0 -694
  748. scipy/special/xsf/iv_ratio.h +0 -173
  749. scipy/special/xsf/lambertw.h +0 -150
  750. scipy/special/xsf/loggamma.h +0 -163
  751. scipy/special/xsf/sici.h +0 -200
  752. scipy/special/xsf/tools.h +0 -427
  753. scipy/special/xsf/trig.h +0 -164
  754. scipy/special/xsf/wright_bessel.h +0 -843
  755. scipy/special/xsf/zlog1.h +0 -35
  756. scipy/stats/_mvn.cp311-win_amd64.dll.a +0 -0
  757. scipy/stats/_mvn.cp311-win_amd64.pyd +0 -0
  758. scipy-1.15.3.dist-info/DELVEWHEEL +0 -2
  759. /scipy-1.15.3-cp311-cp311-win_amd64.whl → /scipy-1.16.0-cp311-cp311-win_amd64.whl +0 -0
  760. {scipy-1.15.3.dist-info → scipy-1.16.0.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])