scipy 1.15.3__cp313-cp313-macosx_12_0_arm64.whl → 1.16.0rc2__cp313-cp313-macosx_12_0_arm64.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 (629) hide show
  1. scipy/.dylibs/libscipy_openblas.dylib +0 -0
  2. scipy/__config__.py +8 -8
  3. scipy/__init__.py +3 -6
  4. scipy/_cyutility.cpython-313-darwin.so +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.cpython-313-darwin.so +0 -0
  9. scipy/_lib/_docscrape.py +1 -1
  10. scipy/_lib/_elementwise_iterative_method.py +15 -26
  11. scipy/_lib/_sparse.py +41 -0
  12. scipy/_lib/_test_deprecation_call.cpython-313-darwin.so +0 -0
  13. scipy/_lib/_test_deprecation_def.cpython-313-darwin.so +0 -0
  14. scipy/_lib/_testutils.py +6 -2
  15. scipy/_lib/_util.py +222 -125
  16. scipy/_lib/array_api_compat/__init__.py +4 -4
  17. scipy/_lib/array_api_compat/_internal.py +19 -6
  18. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  19. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  20. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  21. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  22. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  23. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  24. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  25. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  26. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  27. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  28. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  29. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  30. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  31. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  32. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  33. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  34. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  35. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  36. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  37. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  38. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  39. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  40. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  41. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  42. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  43. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  44. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  45. scipy/_lib/array_api_extra/__init__.py +26 -3
  46. scipy/_lib/array_api_extra/_delegation.py +171 -0
  47. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  48. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  49. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  50. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  51. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  52. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  53. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  54. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  58. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  59. scipy/_lib/array_api_extra/testing.py +359 -0
  60. scipy/_lib/decorator.py +2 -2
  61. scipy/_lib/doccer.py +1 -7
  62. scipy/_lib/messagestream.cpython-313-darwin.so +0 -0
  63. scipy/_lib/pyprima/__init__.py +212 -0
  64. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  65. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  66. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  67. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  68. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  69. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  70. scipy/_lib/pyprima/cobyla/update.py +289 -0
  71. scipy/_lib/pyprima/common/__init__.py +0 -0
  72. scipy/_lib/pyprima/common/_bounds.py +34 -0
  73. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  74. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  75. scipy/_lib/pyprima/common/_project.py +173 -0
  76. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  77. scipy/_lib/pyprima/common/consts.py +47 -0
  78. scipy/_lib/pyprima/common/evaluate.py +99 -0
  79. scipy/_lib/pyprima/common/history.py +38 -0
  80. scipy/_lib/pyprima/common/infos.py +30 -0
  81. scipy/_lib/pyprima/common/linalg.py +435 -0
  82. scipy/_lib/pyprima/common/message.py +290 -0
  83. scipy/_lib/pyprima/common/powalg.py +131 -0
  84. scipy/_lib/pyprima/common/preproc.py +277 -0
  85. scipy/_lib/pyprima/common/present.py +5 -0
  86. scipy/_lib/pyprima/common/ratio.py +54 -0
  87. scipy/_lib/pyprima/common/redrho.py +47 -0
  88. scipy/_lib/pyprima/common/selectx.py +296 -0
  89. scipy/_lib/tests/test__util.py +105 -121
  90. scipy/_lib/tests/test_array_api.py +166 -35
  91. scipy/_lib/tests/test_bunch.py +7 -0
  92. scipy/_lib/tests/test_ccallback.py +2 -10
  93. scipy/_lib/tests/test_public_api.py +13 -0
  94. scipy/cluster/_hierarchy.cpython-313-darwin.so +0 -0
  95. scipy/cluster/_optimal_leaf_ordering.cpython-313-darwin.so +0 -0
  96. scipy/cluster/_vq.cpython-313-darwin.so +0 -0
  97. scipy/cluster/hierarchy.py +393 -223
  98. scipy/cluster/tests/test_hierarchy.py +273 -335
  99. scipy/cluster/tests/test_vq.py +45 -61
  100. scipy/cluster/vq.py +39 -35
  101. scipy/conftest.py +263 -157
  102. scipy/constants/_constants.py +4 -1
  103. scipy/constants/tests/test_codata.py +2 -2
  104. scipy/constants/tests/test_constants.py +11 -18
  105. scipy/datasets/_download_all.py +15 -1
  106. scipy/datasets/_fetchers.py +7 -1
  107. scipy/datasets/_utils.py +1 -1
  108. scipy/differentiate/_differentiate.py +25 -25
  109. scipy/differentiate/tests/test_differentiate.py +24 -25
  110. scipy/fft/_basic.py +20 -0
  111. scipy/fft/_helper.py +3 -34
  112. scipy/fft/_pocketfft/helper.py +29 -1
  113. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  114. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  115. scipy/fft/_realtransforms.py +13 -0
  116. scipy/fft/tests/test_basic.py +27 -25
  117. scipy/fft/tests/test_fftlog.py +16 -7
  118. scipy/fft/tests/test_helper.py +18 -34
  119. scipy/fft/tests/test_real_transforms.py +8 -10
  120. scipy/fftpack/convolve.cpython-313-darwin.so +0 -0
  121. scipy/fftpack/tests/test_basic.py +2 -4
  122. scipy/fftpack/tests/test_real_transforms.py +8 -9
  123. scipy/integrate/_bvp.py +9 -3
  124. scipy/integrate/_cubature.py +3 -2
  125. scipy/integrate/_dop.cpython-313-darwin.so +0 -0
  126. scipy/integrate/_lsoda.cpython-313-darwin.so +0 -0
  127. scipy/integrate/_ode.py +9 -2
  128. scipy/integrate/_odepack.cpython-313-darwin.so +0 -0
  129. scipy/integrate/_quad_vec.py +21 -29
  130. scipy/integrate/_quadpack.cpython-313-darwin.so +0 -0
  131. scipy/integrate/_quadpack_py.py +11 -7
  132. scipy/integrate/_quadrature.py +3 -3
  133. scipy/integrate/_rules/_base.py +2 -2
  134. scipy/integrate/_tanhsinh.py +48 -47
  135. scipy/integrate/_test_odeint_banded.cpython-313-darwin.so +0 -0
  136. scipy/integrate/_vode.cpython-313-darwin.so +0 -0
  137. scipy/integrate/tests/test__quad_vec.py +0 -6
  138. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  139. scipy/integrate/tests/test_cubature.py +21 -35
  140. scipy/integrate/tests/test_quadrature.py +6 -8
  141. scipy/integrate/tests/test_tanhsinh.py +56 -48
  142. scipy/interpolate/__init__.py +70 -58
  143. scipy/interpolate/_bary_rational.py +22 -22
  144. scipy/interpolate/_bsplines.py +119 -66
  145. scipy/interpolate/_cubic.py +65 -50
  146. scipy/interpolate/_dfitpack.cpython-313-darwin.so +0 -0
  147. scipy/interpolate/_dierckx.cpython-313-darwin.so +0 -0
  148. scipy/interpolate/_fitpack.cpython-313-darwin.so +0 -0
  149. scipy/interpolate/_fitpack2.py +9 -6
  150. scipy/interpolate/_fitpack_impl.py +32 -26
  151. scipy/interpolate/_fitpack_repro.py +23 -19
  152. scipy/interpolate/_interpnd.cpython-313-darwin.so +0 -0
  153. scipy/interpolate/_interpolate.py +30 -12
  154. scipy/interpolate/_ndbspline.py +13 -18
  155. scipy/interpolate/_ndgriddata.py +5 -8
  156. scipy/interpolate/_polyint.py +95 -31
  157. scipy/interpolate/_ppoly.cpython-313-darwin.so +0 -0
  158. scipy/interpolate/_rbf.py +2 -2
  159. scipy/interpolate/_rbfinterp.py +1 -1
  160. scipy/interpolate/_rbfinterp_pythran.cpython-313-darwin.so +0 -0
  161. scipy/interpolate/_rgi.py +31 -26
  162. scipy/interpolate/_rgi_cython.cpython-313-darwin.so +0 -0
  163. scipy/interpolate/dfitpack.py +0 -20
  164. scipy/interpolate/interpnd.py +1 -2
  165. scipy/interpolate/tests/test_bary_rational.py +2 -2
  166. scipy/interpolate/tests/test_bsplines.py +97 -1
  167. scipy/interpolate/tests/test_fitpack2.py +39 -1
  168. scipy/interpolate/tests/test_interpnd.py +32 -20
  169. scipy/interpolate/tests/test_interpolate.py +48 -4
  170. scipy/interpolate/tests/test_rgi.py +2 -1
  171. scipy/io/_fast_matrix_market/__init__.py +2 -0
  172. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  173. scipy/io/_harwell_boeing/hb.py +7 -11
  174. scipy/io/_idl.py +5 -7
  175. scipy/io/_netcdf.py +15 -5
  176. scipy/io/_test_fortran.cpython-313-darwin.so +0 -0
  177. scipy/io/arff/tests/test_arffread.py +3 -3
  178. scipy/io/matlab/__init__.py +5 -3
  179. scipy/io/matlab/_mio.py +4 -1
  180. scipy/io/matlab/_mio5.py +19 -13
  181. scipy/io/matlab/_mio5_utils.cpython-313-darwin.so +0 -0
  182. scipy/io/matlab/_mio_utils.cpython-313-darwin.so +0 -0
  183. scipy/io/matlab/_miobase.py +4 -1
  184. scipy/io/matlab/_streams.cpython-313-darwin.so +0 -0
  185. scipy/io/matlab/tests/test_mio.py +46 -18
  186. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  187. scipy/io/tests/test_mmio.py +7 -1
  188. scipy/io/tests/test_wavfile.py +41 -0
  189. scipy/io/wavfile.py +57 -10
  190. scipy/linalg/_basic.py +113 -86
  191. scipy/linalg/_cythonized_array_utils.cpython-313-darwin.so +0 -0
  192. scipy/linalg/_decomp.py +22 -9
  193. scipy/linalg/_decomp_cholesky.py +28 -13
  194. scipy/linalg/_decomp_cossin.py +45 -30
  195. scipy/linalg/_decomp_interpolative.cpython-313-darwin.so +0 -0
  196. scipy/linalg/_decomp_ldl.py +4 -1
  197. scipy/linalg/_decomp_lu.py +18 -6
  198. scipy/linalg/_decomp_lu_cython.cpython-313-darwin.so +0 -0
  199. scipy/linalg/_decomp_polar.py +2 -0
  200. scipy/linalg/_decomp_qr.py +6 -2
  201. scipy/linalg/_decomp_qz.py +3 -0
  202. scipy/linalg/_decomp_schur.py +3 -1
  203. scipy/linalg/_decomp_svd.py +13 -2
  204. scipy/linalg/_decomp_update.cpython-313-darwin.so +0 -0
  205. scipy/linalg/_expm_frechet.py +4 -0
  206. scipy/linalg/_fblas.cpython-313-darwin.so +0 -0
  207. scipy/linalg/_flapack.cpython-313-darwin.so +0 -0
  208. scipy/linalg/_linalg_pythran.cpython-313-darwin.so +0 -0
  209. scipy/linalg/_matfuncs.py +187 -4
  210. scipy/linalg/_matfuncs_expm.cpython-313-darwin.so +0 -0
  211. scipy/linalg/_matfuncs_schur_sqrtm.cpython-313-darwin.so +0 -0
  212. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  213. scipy/linalg/_matfuncs_sqrtm_triu.cpython-313-darwin.so +0 -0
  214. scipy/linalg/_procrustes.py +2 -0
  215. scipy/linalg/_sketches.py +17 -6
  216. scipy/linalg/_solve_toeplitz.cpython-313-darwin.so +0 -0
  217. scipy/linalg/_solvers.py +7 -2
  218. scipy/linalg/_special_matrices.py +26 -36
  219. scipy/linalg/cython_blas.cpython-313-darwin.so +0 -0
  220. scipy/linalg/cython_lapack.cpython-313-darwin.so +0 -0
  221. scipy/linalg/lapack.py +22 -2
  222. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  223. scipy/linalg/tests/test_basic.py +31 -16
  224. scipy/linalg/tests/test_batch.py +588 -0
  225. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  226. scipy/linalg/tests/test_decomp.py +40 -3
  227. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  228. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  229. scipy/linalg/tests/test_lapack.py +115 -7
  230. scipy/linalg/tests/test_matfuncs.py +157 -102
  231. scipy/linalg/tests/test_procrustes.py +0 -7
  232. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  233. scipy/linalg/tests/test_special_matrices.py +1 -5
  234. scipy/ndimage/__init__.py +1 -0
  235. scipy/ndimage/_cytest.cpython-313-darwin.so +0 -0
  236. scipy/ndimage/_delegators.py +8 -2
  237. scipy/ndimage/_filters.py +453 -5
  238. scipy/ndimage/_interpolation.py +36 -6
  239. scipy/ndimage/_measurements.py +4 -2
  240. scipy/ndimage/_morphology.py +5 -0
  241. scipy/ndimage/_nd_image.cpython-313-darwin.so +0 -0
  242. scipy/ndimage/_ni_docstrings.py +5 -1
  243. scipy/ndimage/_ni_label.cpython-313-darwin.so +0 -0
  244. scipy/ndimage/_ni_support.py +1 -5
  245. scipy/ndimage/_rank_filter_1d.cpython-313-darwin.so +0 -0
  246. scipy/ndimage/_support_alternative_backends.py +18 -6
  247. scipy/ndimage/tests/test_filters.py +370 -259
  248. scipy/ndimage/tests/test_fourier.py +7 -9
  249. scipy/ndimage/tests/test_interpolation.py +68 -61
  250. scipy/ndimage/tests/test_measurements.py +18 -35
  251. scipy/ndimage/tests/test_morphology.py +143 -131
  252. scipy/ndimage/tests/test_splines.py +1 -3
  253. scipy/odr/__odrpack.cpython-313-darwin.so +0 -0
  254. scipy/optimize/_basinhopping.py +13 -7
  255. scipy/optimize/_bglu_dense.cpython-313-darwin.so +0 -0
  256. scipy/optimize/_bracket.py +17 -24
  257. scipy/optimize/_chandrupatla.py +9 -10
  258. scipy/optimize/_cobyla_py.py +104 -123
  259. scipy/optimize/_constraints.py +14 -10
  260. scipy/optimize/_differentiable_functions.py +371 -230
  261. scipy/optimize/_differentialevolution.py +4 -3
  262. scipy/optimize/_direct.cpython-313-darwin.so +0 -0
  263. scipy/optimize/_dual_annealing.py +1 -1
  264. scipy/optimize/_elementwise.py +1 -4
  265. scipy/optimize/_group_columns.cpython-313-darwin.so +0 -0
  266. scipy/optimize/_lbfgsb.cpython-313-darwin.so +0 -0
  267. scipy/optimize/_lbfgsb_py.py +57 -16
  268. scipy/optimize/_linprog_doc.py +2 -2
  269. scipy/optimize/_linprog_highs.py +2 -2
  270. scipy/optimize/_linprog_ip.py +25 -10
  271. scipy/optimize/_linprog_util.py +14 -16
  272. scipy/optimize/_lsap.cpython-313-darwin.so +0 -0
  273. scipy/optimize/_lsq/common.py +3 -3
  274. scipy/optimize/_lsq/dogbox.py +16 -2
  275. scipy/optimize/_lsq/givens_elimination.cpython-313-darwin.so +0 -0
  276. scipy/optimize/_lsq/least_squares.py +198 -126
  277. scipy/optimize/_lsq/lsq_linear.py +6 -6
  278. scipy/optimize/_lsq/trf.py +35 -8
  279. scipy/optimize/_milp.py +3 -1
  280. scipy/optimize/_minimize.py +105 -36
  281. scipy/optimize/_minpack.cpython-313-darwin.so +0 -0
  282. scipy/optimize/_minpack_py.py +21 -14
  283. scipy/optimize/_moduleTNC.cpython-313-darwin.so +0 -0
  284. scipy/optimize/_nnls.py +20 -21
  285. scipy/optimize/_nonlin.py +34 -3
  286. scipy/optimize/_numdiff.py +288 -110
  287. scipy/optimize/_optimize.py +86 -48
  288. scipy/optimize/_pava_pybind.cpython-313-darwin.so +0 -0
  289. scipy/optimize/_remove_redundancy.py +5 -5
  290. scipy/optimize/_root_scalar.py +1 -1
  291. scipy/optimize/_shgo.py +6 -0
  292. scipy/optimize/_shgo_lib/_complex.py +1 -1
  293. scipy/optimize/_slsqp_py.py +216 -124
  294. scipy/optimize/_slsqplib.cpython-313-darwin.so +0 -0
  295. scipy/optimize/_spectral.py +1 -1
  296. scipy/optimize/_tnc.py +8 -1
  297. scipy/optimize/_trlib/_trlib.cpython-313-darwin.so +0 -0
  298. scipy/optimize/_trustregion.py +20 -6
  299. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  300. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  301. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  302. scipy/optimize/_trustregion_constr/projections.py +12 -8
  303. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  304. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  305. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  306. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  307. scipy/optimize/_trustregion_exact.py +0 -1
  308. scipy/optimize/_zeros.cpython-313-darwin.so +0 -0
  309. scipy/optimize/_zeros_py.py +97 -17
  310. scipy/optimize/cython_optimize/_zeros.cpython-313-darwin.so +0 -0
  311. scipy/optimize/slsqp.py +0 -1
  312. scipy/optimize/tests/test__basinhopping.py +1 -1
  313. scipy/optimize/tests/test__differential_evolution.py +4 -4
  314. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  315. scipy/optimize/tests/test__numdiff.py +66 -22
  316. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  317. scipy/optimize/tests/test__shgo.py +9 -1
  318. scipy/optimize/tests/test_bracket.py +36 -46
  319. scipy/optimize/tests/test_chandrupatla.py +133 -135
  320. scipy/optimize/tests/test_cobyla.py +74 -45
  321. scipy/optimize/tests/test_constraints.py +1 -1
  322. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  323. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  324. scipy/optimize/tests/test_least_squares.py +125 -13
  325. scipy/optimize/tests/test_linear_assignment.py +3 -3
  326. scipy/optimize/tests/test_linprog.py +3 -3
  327. scipy/optimize/tests/test_lsq_linear.py +6 -6
  328. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  329. scipy/optimize/tests/test_minpack.py +4 -4
  330. scipy/optimize/tests/test_nnls.py +43 -3
  331. scipy/optimize/tests/test_nonlin.py +36 -0
  332. scipy/optimize/tests/test_optimize.py +95 -17
  333. scipy/optimize/tests/test_slsqp.py +36 -4
  334. scipy/optimize/tests/test_zeros.py +34 -1
  335. scipy/signal/__init__.py +12 -23
  336. scipy/signal/_delegators.py +568 -0
  337. scipy/signal/_filter_design.py +459 -241
  338. scipy/signal/_fir_filter_design.py +262 -90
  339. scipy/signal/_lti_conversion.py +3 -2
  340. scipy/signal/_ltisys.py +118 -91
  341. scipy/signal/_max_len_seq_inner.cpython-313-darwin.so +0 -0
  342. scipy/signal/_peak_finding_utils.cpython-313-darwin.so +0 -0
  343. scipy/signal/_polyutils.py +172 -0
  344. scipy/signal/_short_time_fft.py +519 -70
  345. scipy/signal/_signal_api.py +30 -0
  346. scipy/signal/_signaltools.py +719 -399
  347. scipy/signal/_sigtools.cpython-313-darwin.so +0 -0
  348. scipy/signal/_sosfilt.cpython-313-darwin.so +0 -0
  349. scipy/signal/_spectral_py.py +230 -50
  350. scipy/signal/_spline.cpython-313-darwin.so +0 -0
  351. scipy/signal/_spline_filters.py +108 -68
  352. scipy/signal/_support_alternative_backends.py +73 -0
  353. scipy/signal/_upfirdn.py +4 -1
  354. scipy/signal/_upfirdn_apply.cpython-313-darwin.so +0 -0
  355. scipy/signal/_waveforms.py +2 -11
  356. scipy/signal/_wavelets.py +1 -1
  357. scipy/signal/fir_filter_design.py +1 -0
  358. scipy/signal/spline.py +4 -11
  359. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  360. scipy/signal/tests/test_bsplines.py +114 -79
  361. scipy/signal/tests/test_cont2discrete.py +9 -2
  362. scipy/signal/tests/test_filter_design.py +721 -481
  363. scipy/signal/tests/test_fir_filter_design.py +332 -140
  364. scipy/signal/tests/test_savitzky_golay.py +4 -3
  365. scipy/signal/tests/test_short_time_fft.py +221 -3
  366. scipy/signal/tests/test_signaltools.py +2144 -1348
  367. scipy/signal/tests/test_spectral.py +50 -6
  368. scipy/signal/tests/test_splines.py +161 -96
  369. scipy/signal/tests/test_upfirdn.py +84 -50
  370. scipy/signal/tests/test_waveforms.py +20 -0
  371. scipy/signal/tests/test_windows.py +607 -466
  372. scipy/signal/windows/_windows.py +287 -148
  373. scipy/sparse/__init__.py +23 -4
  374. scipy/sparse/_base.py +270 -108
  375. scipy/sparse/_bsr.py +7 -4
  376. scipy/sparse/_compressed.py +59 -231
  377. scipy/sparse/_construct.py +90 -38
  378. scipy/sparse/_coo.py +115 -181
  379. scipy/sparse/_csc.py +4 -4
  380. scipy/sparse/_csparsetools.cpython-313-darwin.so +0 -0
  381. scipy/sparse/_csr.py +2 -2
  382. scipy/sparse/_data.py +48 -48
  383. scipy/sparse/_dia.py +105 -18
  384. scipy/sparse/_dok.py +0 -23
  385. scipy/sparse/_index.py +4 -4
  386. scipy/sparse/_matrix.py +23 -0
  387. scipy/sparse/_sparsetools.cpython-313-darwin.so +0 -0
  388. scipy/sparse/_sputils.py +37 -22
  389. scipy/sparse/base.py +0 -9
  390. scipy/sparse/bsr.py +0 -14
  391. scipy/sparse/compressed.py +0 -23
  392. scipy/sparse/construct.py +0 -6
  393. scipy/sparse/coo.py +0 -14
  394. scipy/sparse/csc.py +0 -3
  395. scipy/sparse/csgraph/_flow.cpython-313-darwin.so +0 -0
  396. scipy/sparse/csgraph/_matching.cpython-313-darwin.so +0 -0
  397. scipy/sparse/csgraph/_min_spanning_tree.cpython-313-darwin.so +0 -0
  398. scipy/sparse/csgraph/_reordering.cpython-313-darwin.so +0 -0
  399. scipy/sparse/csgraph/_shortest_path.cpython-313-darwin.so +0 -0
  400. scipy/sparse/csgraph/_tools.cpython-313-darwin.so +0 -0
  401. scipy/sparse/csgraph/_traversal.cpython-313-darwin.so +0 -0
  402. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  403. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  404. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  405. scipy/sparse/csr.py +0 -5
  406. scipy/sparse/data.py +1 -6
  407. scipy/sparse/dia.py +0 -7
  408. scipy/sparse/dok.py +0 -10
  409. scipy/sparse/linalg/_dsolve/_superlu.cpython-313-darwin.so +0 -0
  410. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  411. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  412. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313-darwin.so +0 -0
  413. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  414. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  415. scipy/sparse/linalg/_interface.py +17 -18
  416. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  417. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  418. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  419. scipy/sparse/linalg/_isolve/minres.py +5 -5
  420. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  421. scipy/sparse/linalg/_isolve/utils.py +2 -8
  422. scipy/sparse/linalg/_matfuncs.py +1 -1
  423. scipy/sparse/linalg/_norm.py +1 -1
  424. scipy/sparse/linalg/_propack/_cpropack.cpython-313-darwin.so +0 -0
  425. scipy/sparse/linalg/_propack/_dpropack.cpython-313-darwin.so +0 -0
  426. scipy/sparse/linalg/_propack/_spropack.cpython-313-darwin.so +0 -0
  427. scipy/sparse/linalg/_propack/_zpropack.cpython-313-darwin.so +0 -0
  428. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  429. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  430. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  431. scipy/sparse/tests/test_base.py +214 -42
  432. scipy/sparse/tests/test_common1d.py +7 -7
  433. scipy/sparse/tests/test_construct.py +1 -1
  434. scipy/sparse/tests/test_coo.py +272 -4
  435. scipy/sparse/tests/test_sparsetools.py +5 -0
  436. scipy/sparse/tests/test_sputils.py +36 -7
  437. scipy/spatial/_ckdtree.cpython-313-darwin.so +0 -0
  438. scipy/spatial/_distance_pybind.cpython-313-darwin.so +0 -0
  439. scipy/spatial/_distance_wrap.cpython-313-darwin.so +0 -0
  440. scipy/spatial/_hausdorff.cpython-313-darwin.so +0 -0
  441. scipy/spatial/_qhull.cpython-313-darwin.so +0 -0
  442. scipy/spatial/_voronoi.cpython-313-darwin.so +0 -0
  443. scipy/spatial/distance.py +49 -42
  444. scipy/spatial/tests/test_distance.py +15 -1
  445. scipy/spatial/tests/test_kdtree.py +1 -0
  446. scipy/spatial/tests/test_qhull.py +7 -2
  447. scipy/spatial/transform/__init__.py +5 -3
  448. scipy/spatial/transform/_rigid_transform.cpython-313-darwin.so +0 -0
  449. scipy/spatial/transform/_rotation.cpython-313-darwin.so +0 -0
  450. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  451. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  452. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  453. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  454. scipy/special/__init__.py +1 -47
  455. scipy/special/_add_newdocs.py +34 -772
  456. scipy/special/_basic.py +22 -25
  457. scipy/special/_comb.cpython-313-darwin.so +0 -0
  458. scipy/special/_ellip_harm_2.cpython-313-darwin.so +0 -0
  459. scipy/special/_gufuncs.cpython-313-darwin.so +0 -0
  460. scipy/special/_logsumexp.py +67 -58
  461. scipy/special/_orthogonal.pyi +1 -1
  462. scipy/special/_specfun.cpython-313-darwin.so +0 -0
  463. scipy/special/_special_ufuncs.cpython-313-darwin.so +0 -0
  464. scipy/special/_spherical_bessel.py +4 -4
  465. scipy/special/_support_alternative_backends.py +212 -119
  466. scipy/special/_test_internal.cpython-313-darwin.so +0 -0
  467. scipy/special/_testutils.py +4 -4
  468. scipy/special/_ufuncs.cpython-313-darwin.so +0 -0
  469. scipy/special/_ufuncs.pyi +1 -0
  470. scipy/special/_ufuncs.pyx +215 -1400
  471. scipy/special/_ufuncs_cxx.cpython-313-darwin.so +0 -0
  472. scipy/special/_ufuncs_cxx.pxd +2 -15
  473. scipy/special/_ufuncs_cxx.pyx +5 -44
  474. scipy/special/_ufuncs_cxx_defs.h +2 -16
  475. scipy/special/_ufuncs_defs.h +0 -8
  476. scipy/special/cython_special.cpython-313-darwin.so +0 -0
  477. scipy/special/cython_special.pxd +1 -1
  478. scipy/special/tests/_cython_examples/meson.build +10 -1
  479. scipy/special/tests/test_basic.py +153 -20
  480. scipy/special/tests/test_boost_ufuncs.py +3 -0
  481. scipy/special/tests/test_cdflib.py +35 -11
  482. scipy/special/tests/test_gammainc.py +16 -0
  483. scipy/special/tests/test_hyp2f1.py +2 -2
  484. scipy/special/tests/test_log1mexp.py +85 -0
  485. scipy/special/tests/test_logsumexp.py +206 -64
  486. scipy/special/tests/test_mpmath.py +1 -0
  487. scipy/special/tests/test_nan_inputs.py +1 -1
  488. scipy/special/tests/test_orthogonal.py +17 -18
  489. scipy/special/tests/test_sf_error.py +3 -2
  490. scipy/special/tests/test_sph_harm.py +6 -7
  491. scipy/special/tests/test_support_alternative_backends.py +211 -76
  492. scipy/stats/__init__.py +4 -1
  493. scipy/stats/_ansari_swilk_statistics.cpython-313-darwin.so +0 -0
  494. scipy/stats/_axis_nan_policy.py +5 -12
  495. scipy/stats/_biasedurn.cpython-313-darwin.so +0 -0
  496. scipy/stats/_continued_fraction.py +387 -0
  497. scipy/stats/_continuous_distns.py +277 -310
  498. scipy/stats/_correlation.py +1 -1
  499. scipy/stats/_covariance.py +6 -3
  500. scipy/stats/_discrete_distns.py +39 -32
  501. scipy/stats/_distn_infrastructure.py +39 -12
  502. scipy/stats/_distribution_infrastructure.py +900 -238
  503. scipy/stats/_entropy.py +9 -10
  504. scipy/{_lib → stats}/_finite_differences.py +1 -1
  505. scipy/stats/_hypotests.py +83 -50
  506. scipy/stats/_kde.py +53 -49
  507. scipy/stats/_ksstats.py +1 -1
  508. scipy/stats/_levy_stable/__init__.py +7 -15
  509. scipy/stats/_levy_stable/levyst.cpython-313-darwin.so +0 -0
  510. scipy/stats/_morestats.py +118 -73
  511. scipy/stats/_mstats_basic.py +13 -17
  512. scipy/stats/_mstats_extras.py +8 -8
  513. scipy/stats/_multivariate.py +89 -113
  514. scipy/stats/_new_distributions.py +97 -20
  515. scipy/stats/_page_trend_test.py +12 -5
  516. scipy/stats/_probability_distribution.py +265 -43
  517. scipy/stats/_qmc.py +14 -9
  518. scipy/stats/_qmc_cy.cpython-313-darwin.so +0 -0
  519. scipy/stats/_qmvnt.py +16 -95
  520. scipy/stats/_qmvnt_cy.cpython-313-darwin.so +0 -0
  521. scipy/stats/_quantile.py +335 -0
  522. scipy/stats/_rcont/rcont.cpython-313-darwin.so +0 -0
  523. scipy/stats/_resampling.py +4 -29
  524. scipy/stats/_sampling.py +1 -1
  525. scipy/stats/_sobol.cpython-313-darwin.so +0 -0
  526. scipy/stats/_stats.cpython-313-darwin.so +0 -0
  527. scipy/stats/_stats_mstats_common.py +21 -2
  528. scipy/stats/_stats_py.py +550 -476
  529. scipy/stats/_stats_pythran.cpython-313-darwin.so +0 -0
  530. scipy/stats/_unuran/unuran_wrapper.cpython-313-darwin.so +0 -0
  531. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  532. scipy/stats/_variation.py +6 -8
  533. scipy/stats/_wilcoxon.py +13 -7
  534. scipy/stats/tests/common_tests.py +6 -4
  535. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  536. scipy/stats/tests/test_continued_fraction.py +173 -0
  537. scipy/stats/tests/test_continuous.py +379 -60
  538. scipy/stats/tests/test_continuous_basic.py +18 -12
  539. scipy/stats/tests/test_discrete_basic.py +14 -8
  540. scipy/stats/tests/test_discrete_distns.py +16 -16
  541. scipy/stats/tests/test_distributions.py +95 -75
  542. scipy/stats/tests/test_entropy.py +40 -48
  543. scipy/stats/tests/test_fit.py +4 -3
  544. scipy/stats/tests/test_hypotests.py +153 -24
  545. scipy/stats/tests/test_kdeoth.py +109 -41
  546. scipy/stats/tests/test_marray.py +289 -0
  547. scipy/stats/tests/test_morestats.py +79 -47
  548. scipy/stats/tests/test_mstats_basic.py +3 -3
  549. scipy/stats/tests/test_multivariate.py +434 -83
  550. scipy/stats/tests/test_qmc.py +13 -10
  551. scipy/stats/tests/test_quantile.py +199 -0
  552. scipy/stats/tests/test_rank.py +119 -112
  553. scipy/stats/tests/test_resampling.py +47 -56
  554. scipy/stats/tests/test_sampling.py +9 -4
  555. scipy/stats/tests/test_stats.py +799 -939
  556. scipy/stats/tests/test_variation.py +8 -6
  557. scipy/version.py +2 -2
  558. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  559. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  560. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +561 -568
  561. scipy-1.16.0rc2.dist-info/WHEEL +6 -0
  562. scipy/_lib/array_api_extra/_funcs.py +0 -484
  563. scipy/_lib/array_api_extra/_typing.py +0 -8
  564. scipy/interpolate/_bspl.cpython-313-darwin.so +0 -0
  565. scipy/optimize/_cobyla.cpython-313-darwin.so +0 -0
  566. scipy/optimize/_cython_nnls.cpython-313-darwin.so +0 -0
  567. scipy/optimize/_slsqp.cpython-313-darwin.so +0 -0
  568. scipy/spatial/qhull_src/COPYING.txt +0 -38
  569. scipy/special/libsf_error_state.dylib +0 -0
  570. scipy/special/tests/test_log_softmax.py +0 -109
  571. scipy/special/tests/test_xsf_cuda.py +0 -114
  572. scipy/special/xsf/binom.h +0 -89
  573. scipy/special/xsf/cdflib.h +0 -100
  574. scipy/special/xsf/cephes/airy.h +0 -307
  575. scipy/special/xsf/cephes/besselpoly.h +0 -51
  576. scipy/special/xsf/cephes/beta.h +0 -257
  577. scipy/special/xsf/cephes/cbrt.h +0 -131
  578. scipy/special/xsf/cephes/chbevl.h +0 -85
  579. scipy/special/xsf/cephes/chdtr.h +0 -193
  580. scipy/special/xsf/cephes/const.h +0 -87
  581. scipy/special/xsf/cephes/ellie.h +0 -293
  582. scipy/special/xsf/cephes/ellik.h +0 -251
  583. scipy/special/xsf/cephes/ellpe.h +0 -107
  584. scipy/special/xsf/cephes/ellpk.h +0 -117
  585. scipy/special/xsf/cephes/expn.h +0 -260
  586. scipy/special/xsf/cephes/gamma.h +0 -398
  587. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  588. scipy/special/xsf/cephes/hyperg.h +0 -361
  589. scipy/special/xsf/cephes/i0.h +0 -149
  590. scipy/special/xsf/cephes/i1.h +0 -158
  591. scipy/special/xsf/cephes/igam.h +0 -421
  592. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  593. scipy/special/xsf/cephes/igami.h +0 -313
  594. scipy/special/xsf/cephes/j0.h +0 -225
  595. scipy/special/xsf/cephes/j1.h +0 -198
  596. scipy/special/xsf/cephes/jv.h +0 -715
  597. scipy/special/xsf/cephes/k0.h +0 -164
  598. scipy/special/xsf/cephes/k1.h +0 -163
  599. scipy/special/xsf/cephes/kn.h +0 -243
  600. scipy/special/xsf/cephes/lanczos.h +0 -112
  601. scipy/special/xsf/cephes/ndtr.h +0 -275
  602. scipy/special/xsf/cephes/poch.h +0 -85
  603. scipy/special/xsf/cephes/polevl.h +0 -167
  604. scipy/special/xsf/cephes/psi.h +0 -194
  605. scipy/special/xsf/cephes/rgamma.h +0 -111
  606. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  607. scipy/special/xsf/cephes/shichi.h +0 -248
  608. scipy/special/xsf/cephes/sici.h +0 -224
  609. scipy/special/xsf/cephes/sindg.h +0 -221
  610. scipy/special/xsf/cephes/tandg.h +0 -139
  611. scipy/special/xsf/cephes/trig.h +0 -58
  612. scipy/special/xsf/cephes/unity.h +0 -186
  613. scipy/special/xsf/cephes/zeta.h +0 -172
  614. scipy/special/xsf/config.h +0 -304
  615. scipy/special/xsf/digamma.h +0 -205
  616. scipy/special/xsf/error.h +0 -57
  617. scipy/special/xsf/evalpoly.h +0 -47
  618. scipy/special/xsf/expint.h +0 -266
  619. scipy/special/xsf/hyp2f1.h +0 -694
  620. scipy/special/xsf/iv_ratio.h +0 -173
  621. scipy/special/xsf/lambertw.h +0 -150
  622. scipy/special/xsf/loggamma.h +0 -163
  623. scipy/special/xsf/sici.h +0 -200
  624. scipy/special/xsf/tools.h +0 -427
  625. scipy/special/xsf/trig.h +0 -164
  626. scipy/special/xsf/wright_bessel.h +0 -843
  627. scipy/special/xsf/zlog1.h +0 -35
  628. scipy/stats/_mvn.cpython-313-darwin.so +0 -0
  629. scipy-1.15.3.dist-info/WHEEL +0 -4
@@ -8,9 +8,10 @@ import pytest
8
8
  from pytest import raises as assert_raises
9
9
 
10
10
  from scipy import signal
11
+ from scipy._lib._array_api import xp_assert_close
11
12
  from scipy.fft import fftfreq, rfftfreq, fft, irfft
12
13
  from scipy.integrate import trapezoid
13
- from scipy.signal import (periodogram, welch, lombscargle, coherence,
14
+ from scipy.signal import (periodogram, welch, lombscargle, coherence, csd,
14
15
  spectrogram, check_COLA, check_NOLA)
15
16
  from scipy.signal.windows import hann
16
17
  from scipy.signal._spectral_py import _spectral_helper
@@ -18,7 +19,6 @@ from scipy.signal._spectral_py import _spectral_helper
18
19
  # Compare ShortTimeFFT.stft() / ShortTimeFFT.istft() with stft() / istft():
19
20
  from scipy.signal.tests._scipy_spectral_test_shim import stft_compare as stft
20
21
  from scipy.signal.tests._scipy_spectral_test_shim import istft_compare as istft
21
- from scipy.signal.tests._scipy_spectral_test_shim import csd_compare as csd
22
22
 
23
23
 
24
24
  class TestPeriodogram:
@@ -416,8 +416,7 @@ class TestWelch:
416
416
  #for string-like window, input signal length < nperseg value gives
417
417
  #UserWarning, sets nperseg to x.shape[-1]
418
418
  with suppress_warnings() as sup:
419
- msg = "nperseg = 256 is greater than input length = 8, using nperseg = 8"
420
- sup.filter(UserWarning, msg)
419
+ sup.filter(UserWarning, "nperseg=256 is greater than signal.*")
421
420
  f, p = welch(x,window='hann') # default nperseg
422
421
  f1, p1 = welch(x,window='hann', nperseg=256) # user-specified nperseg
423
422
  f2, p2 = welch(x, nperseg=8) # valid nperseg, doesn't give warning
@@ -560,6 +559,15 @@ class TestWelch:
560
559
  assert_raises(ValueError, welch, x, nperseg=8,
561
560
  average='unrecognised-average')
562
561
 
562
+ def test_ratio_scale_to(self):
563
+ """Verify the factor of ``sum(abs(window)**2)*fs / abs(sum(window))**2``
564
+ used in the `welch` and `csd` docstrs. """
565
+ x, win, fs = np.array([1., 0, 0, 0]), np.ones(4), 12
566
+ params = dict(fs=fs, window=win, return_onesided=False, detrend=None)
567
+ p_dens = welch(x, scaling='density', **params)[1]
568
+ p_spec = welch(x, scaling='spectrum', **params)[1]
569
+ p_fac = sum(win**2)*fs / abs(sum(win))**2
570
+ assert_allclose(p_spec / p_dens, p_fac)
563
571
 
564
572
  class TestCSD:
565
573
  def test_pad_shorter_x(self):
@@ -584,6 +592,36 @@ class TestCSD:
584
592
  assert_allclose(f, f1)
585
593
  assert_allclose(c, c1)
586
594
 
595
+ def test_unequal_length_input_1D(self):
596
+ """Test zero-padding for input `x.shape[axis] != y.shape[axis]` for 1d arrays.
597
+
598
+ This test ensures that issue 23036 is fixed.
599
+ """
600
+ x = np.tile([4, 0, -4, 0], 4)
601
+
602
+ kw = dict(fs=len(x), window='boxcar', nperseg=4)
603
+ X0 = signal.csd(x, np.copy(x), **kw)[1] # `x is x` must be False
604
+ X1 = signal.csd(x, x[:8], **kw)[1]
605
+ X2 = signal.csd(x[:8], x, **kw)[1]
606
+ xp_assert_close(X1, X0 / 2)
607
+ xp_assert_close(X2, X0 / 2)
608
+
609
+ def test_unequal_length_input_3D(self):
610
+ """Test zero-padding for input `x.shape[axis] != y.shape[axis]` for 3d arrays.
611
+
612
+ This test ensures that issue 23036 is fixed.
613
+ """
614
+ n = 8
615
+ x = np.zeros(2 * 3 * n).reshape(2, n, 3)
616
+ x[:, 0, :] = n
617
+
618
+ kw = dict(fs=n, window='boxcar', nperseg=n, detrend=None, axis=1)
619
+ X0 = signal.csd(x, x.copy(), **kw)[1] # `x is x` must be False
620
+ X1 = signal.csd(x, x[:, :2, :], **kw)[1]
621
+ X2 = signal.csd(x[:, :2, :], x, **kw)[1]
622
+ xp_assert_close(X1, X0)
623
+ xp_assert_close(X2, X0)
624
+
587
625
  def test_real_onesided_even(self):
588
626
  x = np.zeros(16)
589
627
  x[0] = 1
@@ -735,6 +773,8 @@ class TestCSD:
735
773
  win_err = signal.get_window('hann', 32)
736
774
  assert_raises(ValueError, csd, x, x,
737
775
  10, win_err, nperseg=None) # because win longer than signal
776
+ with pytest.raises(ValueError, match="Parameter nperseg=0.*"):
777
+ csd(x, x, 0, nperseg=0)
738
778
 
739
779
  def test_empty_input(self):
740
780
  f, p = csd([],np.zeros(10))
@@ -779,8 +819,7 @@ class TestCSD:
779
819
  #for string-like window, input signal length < nperseg value gives
780
820
  #UserWarning, sets nperseg to x.shape[-1]
781
821
  with suppress_warnings() as sup:
782
- msg = "nperseg = 256 is greater than input length = 8, using nperseg = 8"
783
- sup.filter(UserWarning, msg)
822
+ sup.filter(UserWarning, "nperseg=256 is greater than signal length.*")
784
823
  f, p = csd(x, x, window='hann') # default nperseg
785
824
  f1, p1 = csd(x, x, window='hann', nperseg=256) # user-specified nperseg
786
825
  f2, p2 = csd(x, x, nperseg=8) # valid nperseg, doesn't give warning
@@ -811,6 +850,11 @@ class TestCSD:
811
850
  assert_raises(ValueError, csd, np.ones(12), np.zeros(12), nfft=3,
812
851
  nperseg=4)
813
852
 
853
+ def test_incompatible_inputs(self):
854
+ with pytest.raises(ValueError, match='x and y cannot be broadcast.*'):
855
+ csd(np.ones((1, 8, 1)), np.ones((2, 8)), nperseg=4)
856
+
857
+
814
858
  def test_real_onesided_even_32(self):
815
859
  x = np.zeros(16, 'f')
816
860
  x[0] = 1
@@ -1,12 +1,21 @@
1
1
  # pylint: disable=missing-docstring
2
+ import math
2
3
  import numpy as np
3
4
  import pytest
4
- from scipy._lib._array_api import xp_assert_close
5
+ import scipy._lib.array_api_extra as xpx
6
+ from scipy._lib._array_api import is_cupy, xp_assert_close, xp_default_dtype
5
7
 
6
8
  from scipy.signal._spline import (
7
9
  symiirorder1_ic, symiirorder2_ic_fwd, symiirorder2_ic_bwd)
8
10
  from scipy.signal import symiirorder1, symiirorder2
9
11
 
12
+ skip_xp_backends = pytest.mark.skip_xp_backends
13
+ xfail_xp_backends = pytest.mark.xfail_xp_backends
14
+
15
+
16
+ def npr(xp, *args):
17
+ return xp.concat(tuple(xpx.atleast_nd(x, ndim=1, xp=xp) for x in args))
18
+
10
19
 
11
20
  def _compute_symiirorder2_bwd_hs(k, cs, rsq, omega):
12
21
  cssq = cs * cs
@@ -20,13 +29,18 @@ def _compute_symiirorder2_bwd_hs(k, cs, rsq, omega):
20
29
 
21
30
 
22
31
  class TestSymIIR:
32
+
33
+ @skip_xp_backends(np_only=True, reason="_ic functions are private and numpy-only")
23
34
  @pytest.mark.parametrize(
24
- 'dtype', [np.float32, np.float64, np.complex64, np.complex128])
35
+ 'dtype', ['float32', 'float64', 'complex64', 'complex128'])
25
36
  @pytest.mark.parametrize('precision', [-1.0, 0.7, 0.5, 0.25, 0.0075])
26
- def test_symiir1_ic(self, dtype, precision):
37
+ def test_symiir1_ic(self, dtype, precision, xp):
38
+
39
+ dtype = getattr(xp, dtype)
40
+
27
41
  c_precision = precision
28
42
  if precision <= 0.0 or precision > 1.0:
29
- if dtype in {np.float32, np.complex64}:
43
+ if dtype in {xp.float32, xp.complex64}:
30
44
  c_precision = 1e-6
31
45
  else:
32
46
  c_precision = 1e-11
@@ -45,33 +59,34 @@ class TestSymIIR:
45
59
  # using the partial sum formula: (1 - b**n) / (1 - b)
46
60
  # This holds due to the input being a step signal.
47
61
  b = 0.85
48
- n_exp = int(np.ceil(np.log(c_precision) / np.log(b)))
49
- expected = np.asarray([[(1 - b ** n_exp) / (1 - b)]], dtype=dtype)
62
+ n_exp = int(math.ceil(math.log(c_precision) / math.log(b)))
63
+ expected = xp.asarray([[(1 - b ** n_exp) / (1 - b)]], dtype=dtype)
50
64
  expected = 1 + b * expected
51
65
 
52
66
  # Create a step signal of size n + 1
53
- x = np.ones(n_exp + 1, dtype=dtype)
67
+ x = xp.ones(n_exp + 1, dtype=dtype)
54
68
  xp_assert_close(symiirorder1_ic(x, b, precision), expected,
55
69
  atol=2e-6, rtol=2e-7)
56
70
 
57
71
  # Check the conditions for a exponential decreasing signal with base 2.
58
72
  # Same conditions hold, as the product of 0.5^n * 0.85^n is
59
73
  # still a geometric series
60
- b_d = np.asarray(b, dtype=dtype)
74
+ b_d = xp.asarray(b, dtype=dtype)
61
75
  expected = np.asarray(
62
76
  [[(1 - (0.5 * b_d) ** n_exp) / (1 - (0.5 * b_d))]], dtype=dtype)
63
77
  expected = 1 + b_d * expected
64
78
 
65
79
  # Create an exponential decreasing signal of size n + 1
66
- x = 2 ** -np.arange(n_exp + 1, dtype=dtype)
80
+ x = 2 ** -xp.arange(n_exp + 1, dtype=dtype)
67
81
  xp_assert_close(symiirorder1_ic(x, b, precision), expected,
68
82
  atol=2e-6, rtol=2e-7)
69
83
 
70
- def test_symiir1_ic_fails(self):
84
+ @skip_xp_backends(np_only=True, reason="_ic functions are private and numpy-only")
85
+ def test_symiir1_ic_fails(self, xp):
71
86
  # Test that symiirorder1_ic fails whenever \sum_{n = 1}^{n} b^n > eps
72
87
  b = 0.85
73
88
  # Create a step signal of size 100
74
- x = np.ones(100, dtype=np.float64)
89
+ x = xp.ones(100, dtype=xp.float64)
75
90
 
76
91
  # Compute the closed form for the geometrical series
77
92
  precision = 1 / (1 - b)
@@ -81,13 +96,20 @@ class TestSymIIR:
81
96
  pytest.raises(ValueError, symiirorder1_ic, x, 1.0, -1)
82
97
  pytest.raises(ValueError, symiirorder1_ic, x, 2.0, -1)
83
98
 
99
+ @skip_xp_backends(
100
+ cpu_only=True, exceptions=["cupy"], reason="internals are numpy-only"
101
+ )
102
+ @xfail_xp_backends("cupy", reason="sum did not converge")
103
+ @skip_xp_backends("jax.numpy", reason="item assignment in tests")
84
104
  @pytest.mark.parametrize(
85
- 'dtype', [np.float32, np.float64, np.complex64, np.complex128])
105
+ 'dtype', ['float32', 'float64', 'complex64', 'complex128'])
86
106
  @pytest.mark.parametrize('precision', [-1.0, 0.7, 0.5, 0.25, 0.0075])
87
- def test_symiir1(self, dtype, precision):
107
+ def test_symiir1(self, dtype, precision, xp):
108
+ dtype = getattr(xp, dtype)
109
+
88
110
  c_precision = precision
89
111
  if precision <= 0.0 or precision > 1.0:
90
- if dtype in {np.float32, np.complex64}:
112
+ if dtype in {xp.float32, xp.complex64}:
91
113
  c_precision = 1e-6
92
114
  else:
93
115
  c_precision = 1e-11
@@ -97,12 +119,12 @@ class TestSymIIR:
97
119
  c0 = 0.15
98
120
  z1 = 0.85
99
121
  n = 200
100
- signal = np.ones(n, dtype=dtype)
122
+ signal = xp.ones(n, dtype=dtype)
101
123
 
102
124
  # Find the initial condition. See test_symiir1_ic for a detailed
103
125
  # explanation
104
- n_exp = int(np.ceil(np.log(c_precision) / np.log(z1)))
105
- initial = np.asarray((1 - z1 ** n_exp) / (1 - z1), dtype=dtype)
126
+ n_exp = int(math.ceil(math.log(c_precision) / math.log(z1)))
127
+ initial = xp.asarray((1 - z1 ** n_exp) / (1 - z1), dtype=dtype)
106
128
  initial = 1 + z1 * initial
107
129
 
108
130
  # Forward pass
@@ -117,15 +139,15 @@ class TestSymIIR:
117
139
  # d is the Kronecker delta function, and u is the unit step
118
140
 
119
141
  # y0 * z1**n * u[n]
120
- pos = np.arange(n, dtype=dtype)
142
+ pos = xp.astype(xp.arange(n), dtype)
121
143
  comp1 = initial * z1**pos
122
144
 
123
145
  # -z1 / (1 - z1) * z1**(k - 1) * u[k - 1]
124
- comp2 = np.zeros(n, dtype=dtype)
146
+ comp2 = xp.zeros(n, dtype=dtype)
125
147
  comp2[1:] = -z1 / (1 - z1) * z1**pos[:-1]
126
148
 
127
149
  # 1 / (1 - z1) * u[k - 1]
128
- comp3 = np.zeros(n, dtype=dtype)
150
+ comp3 = xp.zeros(n, dtype=dtype)
129
151
  comp3[1:] = 1 / (1 - z1)
130
152
 
131
153
  expected_fwd = comp1 + comp2 + comp3
@@ -139,63 +161,73 @@ class TestSymIIR:
139
161
 
140
162
  # Computing a closed form for the complete expression is difficult
141
163
  # The result will be computed iteratively from the difference equation
142
- exp_out = np.zeros(n, dtype=dtype)
164
+ exp_out = xp.zeros(n, dtype=dtype)
143
165
  exp_out[0] = sym_cond
144
166
 
145
167
  for i in range(1, n):
146
168
  exp_out[i] = c0 * expected_fwd[n - 1 - i] + z1 * exp_out[i - 1]
147
169
 
148
- exp_out = exp_out[::-1]
170
+ exp_out = xp.flip(exp_out)
149
171
 
150
172
  out = symiirorder1(signal, c0, z1, precision)
151
173
  xp_assert_close(out, exp_out, atol=4e-6, rtol=6e-7)
152
174
 
175
+ @xfail_xp_backends("cupy", reason="sum did not converge")
176
+ @skip_xp_backends(
177
+ cpu_only=True, exceptions=["cupy"], reason="internals are numpy-only"
178
+ )
153
179
  @pytest.mark.parametrize('dtype', ['float32', 'float64'])
154
- def test_symiir1_values(self, dtype):
180
+ def test_symiir1_values(self, dtype, xp):
155
181
  rng = np.random.RandomState(1234)
156
- dtype = getattr(np, dtype)
157
182
  s = rng.uniform(size=16).astype(dtype)
183
+ dtype = getattr(xp, dtype)
184
+ s = xp.asarray(s)
158
185
  res = symiirorder1(s, 0.5, 0.1)
159
186
 
160
187
  # values from scipy 1.9.1
161
- exp_res = np.array([0.14387447, 0.35166047, 0.29735238, 0.46295986, 0.45174927,
162
- 0.19982875, 0.20355805, 0.47378628, 0.57232247, 0.51597393,
163
- 0.25935107, 0.31438554, 0.41096728, 0.4190693 , 0.25812255,
164
- 0.33671467], dtype=res.dtype)
165
- assert res.dtype == dtype
166
- atol = {np.float64: 1e-15, np.float32: 1e-7}[dtype]
188
+ exp_res = xp.asarray([
189
+ 0.14387447, 0.35166047, 0.29735238, 0.46295986, 0.45174927,
190
+ 0.19982875, 0.20355805, 0.47378628, 0.57232247, 0.51597393,
191
+ 0.25935107, 0.31438554, 0.41096728, 0.4190693 , 0.25812255,
192
+ 0.33671467], dtype=res.dtype)
193
+ atol = {xp.float64: 1e-15, xp.float32: 1e-7}[dtype]
167
194
  xp_assert_close(res, exp_res, atol=atol)
168
195
 
169
- s = s + 1j*s
196
+ I1 = xp.asarray(
197
+ 1 + 1j, dtype=xp.result_type(s, xp.complex64)
198
+ )
199
+ s = s * I1
170
200
  res = symiirorder1(s, 0.5, 0.1)
171
- assert res.dtype == np.complex64 if dtype == np.float32 else np.complex128
172
- xp_assert_close(res, exp_res + 1j*exp_res, atol=atol)
201
+ assert res.dtype == xp.complex64 if dtype == xp.float32 else xp.complex128
202
+ xp_assert_close(res, I1 * exp_res, atol=atol)
173
203
 
204
+ @skip_xp_backends(np_only=True,
205
+ reason="_initial_fwd functions are private and numpy-only")
174
206
  @pytest.mark.parametrize(
175
207
  'dtype', ['float32', 'float64'])
176
208
  @pytest.mark.parametrize('precision', [-1.0, 0.7, 0.5, 0.25, 0.0075])
177
- def test_symiir2_initial_fwd(self, dtype, precision):
178
- dtype = getattr(np, dtype)
209
+ def test_symiir2_initial_fwd(self, dtype, precision, xp):
210
+ dtype = getattr(xp, dtype)
179
211
  c_precision = precision
180
212
  if precision <= 0.0 or precision > 1.0:
181
- if dtype in {np.float32, np.complex64}:
213
+ if dtype in {xp.float32, xp.complex64}:
182
214
  c_precision = 1e-6
183
215
  else:
184
216
  c_precision = 1e-11
185
217
 
186
218
  # Compute the initial conditions for a order-two symmetrical low-pass
187
219
  # filter with r = 0.5 and omega = pi / 3 for an unit step input.
188
- r = np.asarray(0.5, dtype=dtype)
189
- omega = np.asarray(np.pi / 3.0, dtype=dtype)
190
- cs = 1 - 2 * r * np.cos(omega) + r**2
220
+ r = xp.asarray(0.5, dtype=dtype)
221
+ omega = xp.asarray(np.pi / 3.0, dtype=dtype)
222
+ cs = 1 - 2 * r * xp.cos(omega) + r**2
191
223
 
192
224
  # The index n for the initial condition is bound from 0 to the
193
225
  # first position where sin(omega * (n + 2)) = 0 => omega * (n + 2) = pi
194
226
  # For omega = pi / 3, the maximum initial condition occurs when
195
227
  # sqrt(3) / 2 * r**n < precision.
196
228
  # => n = log(2 * sqrt(3) / 3 * precision) / log(r)
197
- ub = np.ceil(np.log(c_precision / np.sin(omega)) / np.log(c_precision))
198
- lb = np.ceil(np.pi / omega) - 2
229
+ ub = xp.ceil(xp.log(c_precision / xp.sin(omega)) / math.log(c_precision))
230
+ lb = xp.ceil(math.pi / omega) - 2
199
231
  n_exp = min(ub, lb)
200
232
 
201
233
  # The forward initial condition for a filter of order two is:
@@ -207,10 +239,10 @@ class TestSymIIR:
207
239
  # r**(n + 3) * np.sin(omega * (n + 2)) / np.sin(omega) + cs
208
240
  fwd_initial_1 = (
209
241
  cs +
210
- 2 * r * np.cos(omega) -
242
+ 2 * r * xp.cos(omega) -
211
243
  r**2 -
212
- r**(n_exp + 2) * np.sin(omega * (n_exp + 3)) / np.sin(omega) +
213
- r**(n_exp + 3) * np.sin(omega * (n_exp + 2)) / np.sin(omega))
244
+ r**(n_exp + 2) * xp.sin(omega * (n_exp + 3)) / xp.sin(omega) +
245
+ r**(n_exp + 3) * xp.sin(omega * (n_exp + 2)) / xp.sin(omega))
214
246
 
215
247
  # The second initial condition is given by
216
248
  # s[n] = 1 / np.sin(omega) * (
@@ -218,19 +250,19 @@ class TestSymIIR:
218
250
  # r**3 * np.sin(2 * omega) -
219
251
  # r**(n + 3) * np.sin(omega * (n + 4)) +
220
252
  # r**(n + 4) * np.sin(omega * (n + 3)))
221
- ub = np.ceil(np.log(c_precision / np.sin(omega)) / np.log(c_precision))
222
- lb = np.ceil(np.pi / omega) - 3
253
+ ub = xp.ceil(xp.log(c_precision / xp.sin(omega)) / math.log(c_precision))
254
+ lb = xp.ceil(xp.pi / omega) - 3
223
255
  n_exp = min(ub, lb)
224
256
 
225
257
  fwd_initial_2 = (
226
- cs + cs * 2 * r * np.cos(omega) +
227
- (r**2 * np.sin(3 * omega) -
228
- r**3 * np.sin(2 * omega) -
229
- r**(n_exp + 3) * np.sin(omega * (n_exp + 4)) +
230
- r**(n_exp + 4) * np.sin(omega * (n_exp + 3))) / np.sin(omega))
258
+ cs + cs * 2 * r * xp.cos(omega) +
259
+ (r**2 * xp.sin(3 * omega) -
260
+ r**3 * xp.sin(2 * omega) -
261
+ r**(n_exp + 3) * xp.sin(omega * (n_exp + 4)) +
262
+ r**(n_exp + 4) * xp.sin(omega * (n_exp + 3))) / xp.sin(omega))
231
263
 
232
- expected = np.r_[fwd_initial_1, fwd_initial_2][None, :]
233
- expected = expected.astype(dtype)
264
+ expected = npr(xp, fwd_initial_1, fwd_initial_2)[None, :]
265
+ expected = xp.astype(expected, dtype)
234
266
 
235
267
  n = 100
236
268
  signal = np.ones(n, dtype=dtype)
@@ -238,29 +270,33 @@ class TestSymIIR:
238
270
  out = symiirorder2_ic_fwd(signal, r, omega, precision)
239
271
  xp_assert_close(out, expected, atol=4e-6, rtol=6e-7)
240
272
 
273
+ @skip_xp_backends(np_only=True,
274
+ reason="_initial_bwd functions are private and numpy-only")
241
275
  @pytest.mark.parametrize(
242
- 'dtype', [np.float32, np.float64])
276
+ 'dtype', ['float32', 'float64'])
243
277
  @pytest.mark.parametrize('precision', [-1.0, 0.7, 0.5, 0.25, 0.0075])
244
- def test_symiir2_initial_bwd(self, dtype, precision):
278
+ def test_symiir2_initial_bwd(self, dtype, precision, xp):
279
+ dtype = getattr(xp, dtype)
280
+
245
281
  c_precision = precision
246
282
  if precision <= 0.0 or precision > 1.0:
247
- if dtype in {np.float32, np.complex64}:
283
+ if dtype in {xp.float32, xp.complex64}:
248
284
  c_precision = 1e-6
249
285
  else:
250
286
  c_precision = 1e-11
251
287
 
252
- r = np.asarray(0.5, dtype=dtype)
253
- omega = np.asarray(np.pi / 3.0, dtype=dtype)
254
- cs = 1 - 2 * r * np.cos(omega) + r * r
255
- a2 = 2 * r * np.cos(omega)
288
+ r = xp.asarray(0.5, dtype=dtype)
289
+ omega = xp.asarray(xp.pi / 3.0, dtype=dtype)
290
+ cs = 1 - 2 * r * xp.cos(omega) + r * r
291
+ a2 = 2 * r * xp.cos(omega)
256
292
  a3 = -r * r
257
293
 
258
294
  n = 100
259
- signal = np.ones(n, dtype=dtype)
295
+ signal = xp.ones(n, dtype=dtype)
260
296
 
261
297
  # Compute initial forward conditions
262
298
  ic = symiirorder2_ic_fwd(signal, r, omega, precision)
263
- out = np.zeros(n + 2, dtype=dtype)
299
+ out = xp.zeros(n + 2, dtype=dtype)
264
300
  out[:2] = ic[0]
265
301
 
266
302
  # Apply the forward system cs / (1 - a2 * z^-1 - a3 * z^-2))
@@ -268,52 +304,61 @@ class TestSymIIR:
268
304
  out[i] = cs * signal[i - 2] + a2 * out[i - 1] + a3 * out[i - 2]
269
305
 
270
306
  # Find the backward initial conditions
271
- ic2 = np.zeros(2, dtype=dtype)
272
- idx = np.arange(n)
307
+ ic2 = xp.zeros(2, dtype=dtype)
308
+ idx = xp.arange(n)
273
309
 
274
310
  diff = (_compute_symiirorder2_bwd_hs(idx, cs, r * r, omega) +
275
311
  _compute_symiirorder2_bwd_hs(idx + 1, cs, r * r, omega))
276
312
  ic2_0_all = np.cumsum(diff * out[:1:-1])
277
- pos = np.where(diff ** 2 < c_precision)[0]
313
+ pos = xp.nonzero(diff ** 2 < c_precision)[0]
278
314
  ic2[0] = ic2_0_all[pos[0]]
279
315
 
280
316
  diff = (_compute_symiirorder2_bwd_hs(idx - 1, cs, r * r, omega) +
281
317
  _compute_symiirorder2_bwd_hs(idx + 2, cs, r * r, omega))
282
- ic2_1_all = np.cumsum(diff * out[:1:-1])
283
- pos = np.where(diff ** 2 < c_precision)[0]
318
+
319
+ ic2_1_all = xp.cumulative_sum(diff * out[:1:-1])
320
+ pos = xp.nonzero(diff ** 2 < c_precision)[0]
284
321
  ic2[1] = ic2_1_all[pos[0]]
285
322
 
286
323
  out_ic = symiirorder2_ic_bwd(out, r, omega, precision)[0]
287
324
  xp_assert_close(out_ic, ic2, atol=4e-6, rtol=6e-7)
288
325
 
326
+ @skip_xp_backends(cpu_only=True, reason="internals are numpy-only")
327
+ @skip_xp_backends("jax.numpy", reason="item assignment in tests")
289
328
  @pytest.mark.parametrize(
290
- 'dtype', [np.float32, np.float64])
329
+ 'dtype', ['float32', 'float64'])
291
330
  @pytest.mark.parametrize('precision', [-1.0, 0.7, 0.5, 0.25, 0.0075])
292
- def test_symiir2(self, dtype, precision):
293
- r = np.asarray(0.5, dtype=dtype)
294
- omega = np.asarray(np.pi / 3.0, dtype=dtype)
295
- cs = 1 - 2 * r * np.cos(omega) + r * r
296
- a2 = 2 * r * np.cos(omega)
331
+ def test_symiir2(self, dtype, precision, xp):
332
+ dtype = getattr(xp, dtype)
333
+
334
+ r = 0.5
335
+ omega = math.pi / 3.0
336
+ cs = 1 - 2 * r * math.cos(omega) + r * r
337
+ a2 = 2 * r * math.cos(omega)
297
338
  a3 = -r * r
298
339
 
299
340
  n = 100
300
- signal = np.ones(n, dtype=dtype)
341
+ signal = xp.ones(n, dtype=dtype)
301
342
 
302
343
  # Compute initial forward conditions
303
- ic = symiirorder2_ic_fwd(signal, r, omega, precision)
304
- out1 = np.zeros(n + 2, dtype=dtype)
305
- out1[:2] = ic[0]
344
+ signal_np = np.asarray(signal)
345
+ ic = symiirorder2_ic_fwd(signal_np, r, omega, precision)
346
+ ic = xp.asarray(ic)
347
+ out1 = xp.zeros(n + 2, dtype=dtype)
348
+ out1[:2] = ic[0, :]
306
349
 
307
350
  # Apply the forward system cs / (1 - a2 * z^-1 - a3 * z^-2))
308
351
  for i in range(2, n + 2):
309
352
  out1[i] = cs * signal[i - 2] + a2 * out1[i - 1] + a3 * out1[i - 2]
310
353
 
311
354
  # Find the backward initial conditions
312
- ic2 = symiirorder2_ic_bwd(out1, r, omega, precision)[0]
355
+ ic2 = symiirorder2_ic_bwd(np.asarray(out1), r, omega, precision)[0]
356
+ ic2 = xp.asarray(ic2)
313
357
 
314
358
  # Apply the system cs / (1 - a2 * z - a3 * z^2)) in backwards
315
- exp = np.empty(n, dtype=dtype)
316
- exp[-2:] = ic2[::-1]
359
+ exp = xp.empty(n, dtype=dtype)
360
+
361
+ exp[-2:] = xp.flip(ic2)
317
362
 
318
363
  for i in range(n - 3, -1, -1):
319
364
  exp[i] = cs * out1[i] + a2 * exp[i + 1] + a3 * exp[i + 2]
@@ -321,20 +366,26 @@ class TestSymIIR:
321
366
  out = symiirorder2(signal, r, omega, precision)
322
367
  xp_assert_close(out, exp, atol=4e-6, rtol=6e-7)
323
368
 
369
+ @skip_xp_backends(cpu_only=True, exceptions=["cupy"], reason="C internals")
324
370
  @pytest.mark.parametrize('dtyp', ['float32', 'float64'])
325
- def test_symiir2_values(self, dtyp):
326
- dtyp = getattr(np, dtyp)
371
+ def test_symiir2_values(self, dtyp, xp):
327
372
  rng = np.random.RandomState(1234)
328
373
  s = rng.uniform(size=16).astype(dtyp)
374
+ s = xp.asarray(s)
375
+
376
+ # cupy returns f64 for f32 inputs
377
+ dtype = xp.float64 if is_cupy(xp) else getattr(xp, dtyp)
378
+
329
379
  res = symiirorder2(s, 0.1, 0.1, precision=1e-10)
330
380
 
331
381
  # values from scipy 1.9.1
332
- exp_res = np.array([0.26572609, 0.53408018, 0.51032696, 0.72115829, 0.69486885,
333
- 0.3649055 , 0.37349478, 0.74165032, 0.89718521, 0.80582483,
334
- 0.46758053, 0.51898709, 0.65025605, 0.65394321, 0.45273595,
335
- 0.53539183], dtype=dtyp)
382
+ exp_res = xp.asarray(
383
+ [0.26572609, 0.53408018, 0.51032696, 0.72115829, 0.69486885,
384
+ 0.3649055 , 0.37349478, 0.74165032, 0.89718521, 0.80582483,
385
+ 0.46758053, 0.51898709, 0.65025605, 0.65394321, 0.45273595,
386
+ 0.53539183], dtype=dtype
387
+ )
336
388
 
337
- assert res.dtype == dtyp
338
389
  # The values in SciPy 1.14 agree with those in SciPy 1.9.1 to this
339
390
  # accuracy only. Implementation differences are twofold:
340
391
  # 1. boundary conditions are computed differently
@@ -345,18 +396,32 @@ class TestSymIIR:
345
396
  # In that respect, sosfilt is likely doing a better job.
346
397
  xp_assert_close(res, exp_res, atol=2e-6)
347
398
 
348
- s = s + 1j*s
349
- with pytest.raises(TypeError):
399
+ I1 = xp.asarray(1 + 1j, dtype=xp.result_type(s, xp.complex64))
400
+ s = s * I1
401
+
402
+ with pytest.raises((TypeError, ValueError)):
350
403
  res = symiirorder2(s, 0.5, 0.1)
351
404
 
352
- def test_symiir1_integer_input(self):
353
- s = np.where(np.arange(100) % 2, -1, 1)
354
- expected = symiirorder1(s.astype(float), 0.5, 0.5)
405
+ @skip_xp_backends(cpu_only=True, exceptions=["cupy"], reason="C internals")
406
+ @xfail_xp_backends("cupy", reason="cupy does not accept integer arrays")
407
+ def test_symiir1_integer_input(self, xp):
408
+ s = xp.where(
409
+ xp.astype(xp.arange(100) % 2, xp.bool),
410
+ xp.asarray(-1),
411
+ xp.asarray(1),
412
+ )
413
+ expected = symiirorder1(xp.astype(s, xp_default_dtype(xp)), 0.5, 0.5)
355
414
  out = symiirorder1(s, 0.5, 0.5)
356
415
  xp_assert_close(out, expected)
357
416
 
358
- def test_symiir2_integer_input(self):
359
- s = np.where(np.arange(100) % 2, -1, 1)
360
- expected = symiirorder2(s.astype(float), 0.5, np.pi / 3.0)
361
- out = symiirorder2(s, 0.5, np.pi / 3.0)
417
+ @skip_xp_backends(cpu_only=True, exceptions=["cupy"], reason="C internals")
418
+ @xfail_xp_backends("cupy", reason="cupy does not accept integer arrays")
419
+ def test_symiir2_integer_input(self, xp):
420
+ s = xp.where(
421
+ xp.astype(xp.arange(100) % 2, xp.bool),
422
+ xp.asarray(-1),
423
+ xp.asarray(1),
424
+ )
425
+ expected = symiirorder2(xp.astype(s, xp_default_dtype(xp)), 0.5, xp.pi / 3.0)
426
+ out = symiirorder2(s, 0.5, xp.pi / 3.0)
362
427
  xp_assert_close(out, expected)