scipy 1.15.3__cp313-cp313-musllinux_1_2_aarch64.whl → 1.16.0__cp313-cp313-musllinux_1_2_aarch64.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 (642) hide show
  1. scipy/__config__.py +11 -11
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cpython-313-aarch64-linux-musl.so +0 -0
  4. scipy/_lib/_array_api.py +486 -161
  5. scipy/_lib/_array_api_compat_vendor.py +9 -0
  6. scipy/_lib/_bunch.py +4 -0
  7. scipy/_lib/_ccallback_c.cpython-313-aarch64-linux-musl.so +0 -0
  8. scipy/_lib/_docscrape.py +1 -1
  9. scipy/_lib/_elementwise_iterative_method.py +15 -26
  10. scipy/_lib/_fpumode.cpython-313-aarch64-linux-musl.so +0 -0
  11. scipy/_lib/_sparse.py +41 -0
  12. scipy/_lib/_test_ccallback.cpython-313-aarch64-linux-musl.so +0 -0
  13. scipy/_lib/_test_deprecation_call.cpython-313-aarch64-linux-musl.so +0 -0
  14. scipy/_lib/_test_deprecation_def.cpython-313-aarch64-linux-musl.so +0 -0
  15. scipy/_lib/_testutils.py +6 -2
  16. scipy/_lib/_uarray/_uarray.cpython-313-aarch64-linux-musl.so +0 -0
  17. scipy/_lib/_util.py +222 -125
  18. scipy/_lib/array_api_compat/__init__.py +4 -4
  19. scipy/_lib/array_api_compat/_internal.py +19 -6
  20. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  21. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  22. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  23. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  24. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  25. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  26. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  27. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  28. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  29. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  30. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  31. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  32. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  33. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  34. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  35. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  36. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  37. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  38. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  39. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  40. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  41. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  42. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  43. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  44. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  45. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  46. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  47. scipy/_lib/array_api_extra/__init__.py +26 -3
  48. scipy/_lib/array_api_extra/_delegation.py +171 -0
  49. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  50. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  51. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  52. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  53. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  54. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  58. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  59. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  60. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  61. scipy/_lib/array_api_extra/testing.py +359 -0
  62. scipy/_lib/decorator.py +2 -2
  63. scipy/_lib/doccer.py +1 -7
  64. scipy/_lib/messagestream.cpython-313-aarch64-linux-musl.so +0 -0
  65. scipy/_lib/pyprima/__init__.py +212 -0
  66. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  67. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  68. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  69. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  70. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  71. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  72. scipy/_lib/pyprima/cobyla/update.py +289 -0
  73. scipy/_lib/pyprima/common/__init__.py +0 -0
  74. scipy/_lib/pyprima/common/_bounds.py +34 -0
  75. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  76. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  77. scipy/_lib/pyprima/common/_project.py +173 -0
  78. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  79. scipy/_lib/pyprima/common/consts.py +47 -0
  80. scipy/_lib/pyprima/common/evaluate.py +99 -0
  81. scipy/_lib/pyprima/common/history.py +38 -0
  82. scipy/_lib/pyprima/common/infos.py +30 -0
  83. scipy/_lib/pyprima/common/linalg.py +435 -0
  84. scipy/_lib/pyprima/common/message.py +290 -0
  85. scipy/_lib/pyprima/common/powalg.py +131 -0
  86. scipy/_lib/pyprima/common/preproc.py +277 -0
  87. scipy/_lib/pyprima/common/present.py +5 -0
  88. scipy/_lib/pyprima/common/ratio.py +54 -0
  89. scipy/_lib/pyprima/common/redrho.py +47 -0
  90. scipy/_lib/pyprima/common/selectx.py +296 -0
  91. scipy/_lib/tests/test__util.py +105 -121
  92. scipy/_lib/tests/test_array_api.py +166 -35
  93. scipy/_lib/tests/test_bunch.py +7 -0
  94. scipy/_lib/tests/test_ccallback.py +2 -10
  95. scipy/_lib/tests/test_public_api.py +13 -0
  96. scipy/cluster/_hierarchy.cpython-313-aarch64-linux-musl.so +0 -0
  97. scipy/cluster/_optimal_leaf_ordering.cpython-313-aarch64-linux-musl.so +0 -0
  98. scipy/cluster/_vq.cpython-313-aarch64-linux-musl.so +0 -0
  99. scipy/cluster/hierarchy.py +393 -223
  100. scipy/cluster/tests/test_hierarchy.py +273 -335
  101. scipy/cluster/tests/test_vq.py +45 -61
  102. scipy/cluster/vq.py +39 -35
  103. scipy/conftest.py +282 -151
  104. scipy/constants/_constants.py +4 -1
  105. scipy/constants/tests/test_codata.py +2 -2
  106. scipy/constants/tests/test_constants.py +11 -18
  107. scipy/datasets/_download_all.py +15 -1
  108. scipy/datasets/_fetchers.py +7 -1
  109. scipy/datasets/_utils.py +1 -1
  110. scipy/differentiate/_differentiate.py +25 -25
  111. scipy/differentiate/tests/test_differentiate.py +24 -25
  112. scipy/fft/_basic.py +20 -0
  113. scipy/fft/_helper.py +3 -34
  114. scipy/fft/_pocketfft/helper.py +29 -1
  115. scipy/fft/_pocketfft/pypocketfft.cpython-313-aarch64-linux-musl.so +0 -0
  116. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  117. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  118. scipy/fft/_realtransforms.py +13 -0
  119. scipy/fft/tests/test_basic.py +27 -25
  120. scipy/fft/tests/test_fftlog.py +16 -7
  121. scipy/fft/tests/test_helper.py +18 -34
  122. scipy/fft/tests/test_real_transforms.py +8 -10
  123. scipy/fftpack/convolve.cpython-313-aarch64-linux-musl.so +0 -0
  124. scipy/fftpack/tests/test_basic.py +2 -4
  125. scipy/fftpack/tests/test_real_transforms.py +8 -9
  126. scipy/integrate/_bvp.py +9 -3
  127. scipy/integrate/_cubature.py +3 -2
  128. scipy/integrate/_dop.cpython-313-aarch64-linux-musl.so +0 -0
  129. scipy/integrate/_lsoda.cpython-313-aarch64-linux-musl.so +0 -0
  130. scipy/integrate/_ode.py +9 -2
  131. scipy/integrate/_odepack.cpython-313-aarch64-linux-musl.so +0 -0
  132. scipy/integrate/_quad_vec.py +21 -29
  133. scipy/integrate/_quadpack.cpython-313-aarch64-linux-musl.so +0 -0
  134. scipy/integrate/_quadpack_py.py +11 -7
  135. scipy/integrate/_quadrature.py +3 -3
  136. scipy/integrate/_rules/_base.py +2 -2
  137. scipy/integrate/_tanhsinh.py +48 -47
  138. scipy/integrate/_test_multivariate.cpython-313-aarch64-linux-musl.so +0 -0
  139. scipy/integrate/_test_odeint_banded.cpython-313-aarch64-linux-musl.so +0 -0
  140. scipy/integrate/_vode.cpython-313-aarch64-linux-musl.so +0 -0
  141. scipy/integrate/tests/test__quad_vec.py +0 -6
  142. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  143. scipy/integrate/tests/test_cubature.py +21 -35
  144. scipy/integrate/tests/test_quadrature.py +6 -8
  145. scipy/integrate/tests/test_tanhsinh.py +56 -48
  146. scipy/interpolate/__init__.py +70 -58
  147. scipy/interpolate/_bary_rational.py +22 -22
  148. scipy/interpolate/_bsplines.py +119 -66
  149. scipy/interpolate/_cubic.py +65 -50
  150. scipy/interpolate/_dfitpack.cpython-313-aarch64-linux-musl.so +0 -0
  151. scipy/interpolate/_dierckx.cpython-313-aarch64-linux-musl.so +0 -0
  152. scipy/interpolate/_fitpack.cpython-313-aarch64-linux-musl.so +0 -0
  153. scipy/interpolate/_fitpack2.py +9 -6
  154. scipy/interpolate/_fitpack_impl.py +32 -26
  155. scipy/interpolate/_fitpack_repro.py +23 -19
  156. scipy/interpolate/_interpnd.cpython-313-aarch64-linux-musl.so +0 -0
  157. scipy/interpolate/_interpolate.py +30 -12
  158. scipy/interpolate/_ndbspline.py +13 -18
  159. scipy/interpolate/_ndgriddata.py +5 -8
  160. scipy/interpolate/_polyint.py +95 -31
  161. scipy/interpolate/_ppoly.cpython-313-aarch64-linux-musl.so +0 -0
  162. scipy/interpolate/_rbf.py +2 -2
  163. scipy/interpolate/_rbfinterp.py +1 -1
  164. scipy/interpolate/_rbfinterp_pythran.cpython-313-aarch64-linux-musl.so +0 -0
  165. scipy/interpolate/_rgi.py +31 -26
  166. scipy/interpolate/_rgi_cython.cpython-313-aarch64-linux-musl.so +0 -0
  167. scipy/interpolate/dfitpack.py +0 -20
  168. scipy/interpolate/interpnd.py +1 -2
  169. scipy/interpolate/tests/test_bary_rational.py +2 -2
  170. scipy/interpolate/tests/test_bsplines.py +97 -1
  171. scipy/interpolate/tests/test_fitpack2.py +39 -1
  172. scipy/interpolate/tests/test_interpnd.py +32 -20
  173. scipy/interpolate/tests/test_interpolate.py +48 -4
  174. scipy/interpolate/tests/test_rgi.py +2 -1
  175. scipy/io/_fast_matrix_market/__init__.py +2 -0
  176. scipy/io/_fast_matrix_market/_fmm_core.cpython-313-aarch64-linux-musl.so +0 -0
  177. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  178. scipy/io/_harwell_boeing/hb.py +7 -11
  179. scipy/io/_idl.py +5 -7
  180. scipy/io/_netcdf.py +15 -5
  181. scipy/io/_test_fortran.cpython-313-aarch64-linux-musl.so +0 -0
  182. scipy/io/arff/tests/test_arffread.py +3 -3
  183. scipy/io/matlab/__init__.py +5 -3
  184. scipy/io/matlab/_mio.py +4 -1
  185. scipy/io/matlab/_mio5.py +19 -13
  186. scipy/io/matlab/_mio5_utils.cpython-313-aarch64-linux-musl.so +0 -0
  187. scipy/io/matlab/_mio_utils.cpython-313-aarch64-linux-musl.so +0 -0
  188. scipy/io/matlab/_miobase.py +4 -1
  189. scipy/io/matlab/_streams.cpython-313-aarch64-linux-musl.so +0 -0
  190. scipy/io/matlab/tests/test_mio.py +46 -18
  191. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  192. scipy/io/tests/test_mmio.py +7 -1
  193. scipy/io/tests/test_wavfile.py +41 -0
  194. scipy/io/wavfile.py +57 -10
  195. scipy/linalg/_basic.py +113 -86
  196. scipy/linalg/_cythonized_array_utils.cpython-313-aarch64-linux-musl.so +0 -0
  197. scipy/linalg/_decomp.py +22 -9
  198. scipy/linalg/_decomp_cholesky.py +28 -13
  199. scipy/linalg/_decomp_cossin.py +45 -30
  200. scipy/linalg/_decomp_interpolative.cpython-313-aarch64-linux-musl.so +0 -0
  201. scipy/linalg/_decomp_ldl.py +4 -1
  202. scipy/linalg/_decomp_lu.py +18 -6
  203. scipy/linalg/_decomp_lu_cython.cpython-313-aarch64-linux-musl.so +0 -0
  204. scipy/linalg/_decomp_polar.py +2 -0
  205. scipy/linalg/_decomp_qr.py +6 -2
  206. scipy/linalg/_decomp_qz.py +3 -0
  207. scipy/linalg/_decomp_schur.py +3 -1
  208. scipy/linalg/_decomp_svd.py +13 -2
  209. scipy/linalg/_decomp_update.cpython-313-aarch64-linux-musl.so +0 -0
  210. scipy/linalg/_expm_frechet.py +4 -0
  211. scipy/linalg/_fblas.cpython-313-aarch64-linux-musl.so +0 -0
  212. scipy/linalg/_flapack.cpython-313-aarch64-linux-musl.so +0 -0
  213. scipy/linalg/_linalg_pythran.cpython-313-aarch64-linux-musl.so +0 -0
  214. scipy/linalg/_matfuncs.py +187 -4
  215. scipy/linalg/_matfuncs_expm.cpython-313-aarch64-linux-musl.so +0 -0
  216. scipy/linalg/_matfuncs_schur_sqrtm.cpython-313-aarch64-linux-musl.so +0 -0
  217. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  218. scipy/linalg/_matfuncs_sqrtm_triu.cpython-313-aarch64-linux-musl.so +0 -0
  219. scipy/linalg/_procrustes.py +2 -0
  220. scipy/linalg/_sketches.py +17 -6
  221. scipy/linalg/_solve_toeplitz.cpython-313-aarch64-linux-musl.so +0 -0
  222. scipy/linalg/_solvers.py +7 -2
  223. scipy/linalg/_special_matrices.py +26 -36
  224. scipy/linalg/blas.py +35 -24
  225. scipy/linalg/cython_blas.cpython-313-aarch64-linux-musl.so +0 -0
  226. scipy/linalg/cython_lapack.cpython-313-aarch64-linux-musl.so +0 -0
  227. scipy/linalg/lapack.py +22 -2
  228. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  229. scipy/linalg/tests/test_basic.py +31 -16
  230. scipy/linalg/tests/test_batch.py +588 -0
  231. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  232. scipy/linalg/tests/test_decomp.py +40 -3
  233. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  234. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  235. scipy/linalg/tests/test_lapack.py +115 -7
  236. scipy/linalg/tests/test_matfuncs.py +157 -102
  237. scipy/linalg/tests/test_procrustes.py +0 -7
  238. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  239. scipy/linalg/tests/test_special_matrices.py +1 -5
  240. scipy/ndimage/__init__.py +1 -0
  241. scipy/ndimage/_ctest.cpython-313-aarch64-linux-musl.so +0 -0
  242. scipy/ndimage/_cytest.cpython-313-aarch64-linux-musl.so +0 -0
  243. scipy/ndimage/_delegators.py +8 -2
  244. scipy/ndimage/_filters.py +453 -5
  245. scipy/ndimage/_interpolation.py +36 -6
  246. scipy/ndimage/_measurements.py +4 -2
  247. scipy/ndimage/_morphology.py +5 -0
  248. scipy/ndimage/_nd_image.cpython-313-aarch64-linux-musl.so +0 -0
  249. scipy/ndimage/_ni_docstrings.py +5 -1
  250. scipy/ndimage/_ni_label.cpython-313-aarch64-linux-musl.so +0 -0
  251. scipy/ndimage/_ni_support.py +1 -5
  252. scipy/ndimage/_rank_filter_1d.cpython-313-aarch64-linux-musl.so +0 -0
  253. scipy/ndimage/_support_alternative_backends.py +18 -6
  254. scipy/ndimage/tests/test_filters.py +370 -259
  255. scipy/ndimage/tests/test_fourier.py +7 -9
  256. scipy/ndimage/tests/test_interpolation.py +68 -61
  257. scipy/ndimage/tests/test_measurements.py +18 -35
  258. scipy/ndimage/tests/test_morphology.py +143 -131
  259. scipy/ndimage/tests/test_splines.py +1 -3
  260. scipy/odr/__odrpack.cpython-313-aarch64-linux-musl.so +0 -0
  261. scipy/optimize/_basinhopping.py +13 -7
  262. scipy/optimize/_bglu_dense.cpython-313-aarch64-linux-musl.so +0 -0
  263. scipy/optimize/_bracket.py +17 -24
  264. scipy/optimize/_chandrupatla.py +9 -10
  265. scipy/optimize/_cobyla_py.py +104 -123
  266. scipy/optimize/_constraints.py +14 -10
  267. scipy/optimize/_differentiable_functions.py +371 -230
  268. scipy/optimize/_differentialevolution.py +4 -3
  269. scipy/optimize/_direct.cpython-313-aarch64-linux-musl.so +0 -0
  270. scipy/optimize/_dual_annealing.py +1 -1
  271. scipy/optimize/_elementwise.py +1 -4
  272. scipy/optimize/_group_columns.cpython-313-aarch64-linux-musl.so +0 -0
  273. scipy/optimize/_highspy/_core.cpython-313-aarch64-linux-musl.so +0 -0
  274. scipy/optimize/_highspy/_highs_options.cpython-313-aarch64-linux-musl.so +0 -0
  275. scipy/optimize/_lbfgsb.cpython-313-aarch64-linux-musl.so +0 -0
  276. scipy/optimize/_lbfgsb_py.py +80 -24
  277. scipy/optimize/_linprog_doc.py +2 -2
  278. scipy/optimize/_linprog_highs.py +2 -2
  279. scipy/optimize/_linprog_ip.py +25 -10
  280. scipy/optimize/_linprog_util.py +14 -16
  281. scipy/optimize/_lsap.cpython-313-aarch64-linux-musl.so +0 -0
  282. scipy/optimize/_lsq/common.py +3 -3
  283. scipy/optimize/_lsq/dogbox.py +16 -2
  284. scipy/optimize/_lsq/givens_elimination.cpython-313-aarch64-linux-musl.so +0 -0
  285. scipy/optimize/_lsq/least_squares.py +198 -126
  286. scipy/optimize/_lsq/lsq_linear.py +6 -6
  287. scipy/optimize/_lsq/trf.py +35 -8
  288. scipy/optimize/_milp.py +3 -1
  289. scipy/optimize/_minimize.py +105 -36
  290. scipy/optimize/_minpack.cpython-313-aarch64-linux-musl.so +0 -0
  291. scipy/optimize/_minpack_py.py +21 -14
  292. scipy/optimize/_moduleTNC.cpython-313-aarch64-linux-musl.so +0 -0
  293. scipy/optimize/_nnls.py +20 -21
  294. scipy/optimize/_nonlin.py +34 -3
  295. scipy/optimize/_numdiff.py +288 -110
  296. scipy/optimize/_optimize.py +86 -48
  297. scipy/optimize/_pava_pybind.cpython-313-aarch64-linux-musl.so +0 -0
  298. scipy/optimize/_remove_redundancy.py +5 -5
  299. scipy/optimize/_root_scalar.py +1 -1
  300. scipy/optimize/_shgo.py +6 -0
  301. scipy/optimize/_shgo_lib/_complex.py +1 -1
  302. scipy/optimize/_slsqp_py.py +216 -124
  303. scipy/optimize/_slsqplib.cpython-313-aarch64-linux-musl.so +0 -0
  304. scipy/optimize/_spectral.py +1 -1
  305. scipy/optimize/_tnc.py +8 -1
  306. scipy/optimize/_trlib/_trlib.cpython-313-aarch64-linux-musl.so +0 -0
  307. scipy/optimize/_trustregion.py +20 -6
  308. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  309. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  310. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  311. scipy/optimize/_trustregion_constr/projections.py +12 -8
  312. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  313. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  314. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  315. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  316. scipy/optimize/_trustregion_exact.py +0 -1
  317. scipy/optimize/_zeros.cpython-313-aarch64-linux-musl.so +0 -0
  318. scipy/optimize/_zeros_py.py +97 -17
  319. scipy/optimize/cython_optimize/_zeros.cpython-313-aarch64-linux-musl.so +0 -0
  320. scipy/optimize/slsqp.py +0 -1
  321. scipy/optimize/tests/test__basinhopping.py +1 -1
  322. scipy/optimize/tests/test__differential_evolution.py +4 -4
  323. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  324. scipy/optimize/tests/test__numdiff.py +66 -22
  325. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  326. scipy/optimize/tests/test__shgo.py +9 -1
  327. scipy/optimize/tests/test_bracket.py +36 -46
  328. scipy/optimize/tests/test_chandrupatla.py +133 -135
  329. scipy/optimize/tests/test_cobyla.py +74 -45
  330. scipy/optimize/tests/test_constraints.py +1 -1
  331. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  332. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  333. scipy/optimize/tests/test_least_squares.py +125 -13
  334. scipy/optimize/tests/test_linear_assignment.py +3 -3
  335. scipy/optimize/tests/test_linprog.py +3 -3
  336. scipy/optimize/tests/test_lsq_linear.py +6 -6
  337. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  338. scipy/optimize/tests/test_minpack.py +4 -4
  339. scipy/optimize/tests/test_nnls.py +43 -3
  340. scipy/optimize/tests/test_nonlin.py +36 -0
  341. scipy/optimize/tests/test_optimize.py +98 -20
  342. scipy/optimize/tests/test_slsqp.py +36 -4
  343. scipy/optimize/tests/test_zeros.py +34 -1
  344. scipy/signal/__init__.py +12 -23
  345. scipy/signal/_delegators.py +568 -0
  346. scipy/signal/_filter_design.py +459 -241
  347. scipy/signal/_fir_filter_design.py +262 -90
  348. scipy/signal/_lti_conversion.py +3 -2
  349. scipy/signal/_ltisys.py +118 -91
  350. scipy/signal/_max_len_seq_inner.cpython-313-aarch64-linux-musl.so +0 -0
  351. scipy/signal/_peak_finding_utils.cpython-313-aarch64-linux-musl.so +0 -0
  352. scipy/signal/_polyutils.py +172 -0
  353. scipy/signal/_short_time_fft.py +519 -70
  354. scipy/signal/_signal_api.py +30 -0
  355. scipy/signal/_signaltools.py +719 -399
  356. scipy/signal/_sigtools.cpython-313-aarch64-linux-musl.so +0 -0
  357. scipy/signal/_sosfilt.cpython-313-aarch64-linux-musl.so +0 -0
  358. scipy/signal/_spectral_py.py +230 -50
  359. scipy/signal/_spline.cpython-313-aarch64-linux-musl.so +0 -0
  360. scipy/signal/_spline_filters.py +108 -68
  361. scipy/signal/_support_alternative_backends.py +73 -0
  362. scipy/signal/_upfirdn.py +4 -1
  363. scipy/signal/_upfirdn_apply.cpython-313-aarch64-linux-musl.so +0 -0
  364. scipy/signal/_waveforms.py +2 -11
  365. scipy/signal/_wavelets.py +1 -1
  366. scipy/signal/fir_filter_design.py +1 -0
  367. scipy/signal/spline.py +4 -11
  368. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  369. scipy/signal/tests/test_bsplines.py +114 -79
  370. scipy/signal/tests/test_cont2discrete.py +9 -2
  371. scipy/signal/tests/test_filter_design.py +721 -481
  372. scipy/signal/tests/test_fir_filter_design.py +332 -140
  373. scipy/signal/tests/test_savitzky_golay.py +4 -3
  374. scipy/signal/tests/test_short_time_fft.py +221 -3
  375. scipy/signal/tests/test_signaltools.py +2145 -1349
  376. scipy/signal/tests/test_spectral.py +50 -6
  377. scipy/signal/tests/test_splines.py +161 -96
  378. scipy/signal/tests/test_upfirdn.py +84 -50
  379. scipy/signal/tests/test_waveforms.py +20 -0
  380. scipy/signal/tests/test_windows.py +607 -466
  381. scipy/signal/windows/_windows.py +287 -148
  382. scipy/sparse/__init__.py +23 -4
  383. scipy/sparse/_base.py +270 -108
  384. scipy/sparse/_bsr.py +7 -4
  385. scipy/sparse/_compressed.py +59 -231
  386. scipy/sparse/_construct.py +90 -38
  387. scipy/sparse/_coo.py +115 -181
  388. scipy/sparse/_csc.py +4 -4
  389. scipy/sparse/_csparsetools.cpython-313-aarch64-linux-musl.so +0 -0
  390. scipy/sparse/_csr.py +2 -2
  391. scipy/sparse/_data.py +48 -48
  392. scipy/sparse/_dia.py +105 -18
  393. scipy/sparse/_dok.py +0 -23
  394. scipy/sparse/_index.py +4 -4
  395. scipy/sparse/_matrix.py +23 -0
  396. scipy/sparse/_sparsetools.cpython-313-aarch64-linux-musl.so +0 -0
  397. scipy/sparse/_sputils.py +37 -22
  398. scipy/sparse/base.py +0 -9
  399. scipy/sparse/bsr.py +0 -14
  400. scipy/sparse/compressed.py +0 -23
  401. scipy/sparse/construct.py +0 -6
  402. scipy/sparse/coo.py +0 -14
  403. scipy/sparse/csc.py +0 -3
  404. scipy/sparse/csgraph/_flow.cpython-313-aarch64-linux-musl.so +0 -0
  405. scipy/sparse/csgraph/_matching.cpython-313-aarch64-linux-musl.so +0 -0
  406. scipy/sparse/csgraph/_min_spanning_tree.cpython-313-aarch64-linux-musl.so +0 -0
  407. scipy/sparse/csgraph/_reordering.cpython-313-aarch64-linux-musl.so +0 -0
  408. scipy/sparse/csgraph/_shortest_path.cpython-313-aarch64-linux-musl.so +0 -0
  409. scipy/sparse/csgraph/_tools.cpython-313-aarch64-linux-musl.so +0 -0
  410. scipy/sparse/csgraph/_traversal.cpython-313-aarch64-linux-musl.so +0 -0
  411. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  412. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  413. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  414. scipy/sparse/csr.py +0 -5
  415. scipy/sparse/data.py +1 -6
  416. scipy/sparse/dia.py +0 -7
  417. scipy/sparse/dok.py +0 -10
  418. scipy/sparse/linalg/_dsolve/_superlu.cpython-313-aarch64-linux-musl.so +0 -0
  419. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  420. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  421. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313-aarch64-linux-musl.so +0 -0
  422. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  423. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  424. scipy/sparse/linalg/_interface.py +17 -18
  425. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  426. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  427. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  428. scipy/sparse/linalg/_isolve/minres.py +5 -5
  429. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  430. scipy/sparse/linalg/_isolve/utils.py +2 -8
  431. scipy/sparse/linalg/_matfuncs.py +1 -1
  432. scipy/sparse/linalg/_norm.py +1 -1
  433. scipy/sparse/linalg/_propack/_cpropack.cpython-313-aarch64-linux-musl.so +0 -0
  434. scipy/sparse/linalg/_propack/_dpropack.cpython-313-aarch64-linux-musl.so +0 -0
  435. scipy/sparse/linalg/_propack/_spropack.cpython-313-aarch64-linux-musl.so +0 -0
  436. scipy/sparse/linalg/_propack/_zpropack.cpython-313-aarch64-linux-musl.so +0 -0
  437. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  438. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  439. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  440. scipy/sparse/tests/test_base.py +214 -42
  441. scipy/sparse/tests/test_common1d.py +7 -7
  442. scipy/sparse/tests/test_construct.py +1 -1
  443. scipy/sparse/tests/test_coo.py +272 -4
  444. scipy/sparse/tests/test_sparsetools.py +5 -0
  445. scipy/sparse/tests/test_sputils.py +36 -7
  446. scipy/spatial/_ckdtree.cpython-313-aarch64-linux-musl.so +0 -0
  447. scipy/spatial/_distance_pybind.cpython-313-aarch64-linux-musl.so +0 -0
  448. scipy/spatial/_distance_wrap.cpython-313-aarch64-linux-musl.so +0 -0
  449. scipy/spatial/_hausdorff.cpython-313-aarch64-linux-musl.so +0 -0
  450. scipy/spatial/_qhull.cpython-313-aarch64-linux-musl.so +0 -0
  451. scipy/spatial/_voronoi.cpython-313-aarch64-linux-musl.so +0 -0
  452. scipy/spatial/distance.py +49 -42
  453. scipy/spatial/tests/test_distance.py +15 -1
  454. scipy/spatial/tests/test_kdtree.py +1 -0
  455. scipy/spatial/tests/test_qhull.py +7 -2
  456. scipy/spatial/transform/__init__.py +5 -3
  457. scipy/spatial/transform/_rigid_transform.cpython-313-aarch64-linux-musl.so +0 -0
  458. scipy/spatial/transform/_rotation.cpython-313-aarch64-linux-musl.so +0 -0
  459. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  460. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  461. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  462. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  463. scipy/special/__init__.py +1 -47
  464. scipy/special/_add_newdocs.py +34 -772
  465. scipy/special/_basic.py +22 -25
  466. scipy/special/_comb.cpython-313-aarch64-linux-musl.so +0 -0
  467. scipy/special/_ellip_harm_2.cpython-313-aarch64-linux-musl.so +0 -0
  468. scipy/special/_gufuncs.cpython-313-aarch64-linux-musl.so +0 -0
  469. scipy/special/_logsumexp.py +67 -58
  470. scipy/special/_orthogonal.pyi +1 -1
  471. scipy/special/_specfun.cpython-313-aarch64-linux-musl.so +0 -0
  472. scipy/special/_special_ufuncs.cpython-313-aarch64-linux-musl.so +0 -0
  473. scipy/special/_spherical_bessel.py +4 -4
  474. scipy/special/_support_alternative_backends.py +212 -119
  475. scipy/special/_test_internal.cpython-313-aarch64-linux-musl.so +0 -0
  476. scipy/special/_testutils.py +4 -4
  477. scipy/special/_ufuncs.cpython-313-aarch64-linux-musl.so +0 -0
  478. scipy/special/_ufuncs.pyi +1 -0
  479. scipy/special/_ufuncs.pyx +215 -1400
  480. scipy/special/_ufuncs_cxx.cpython-313-aarch64-linux-musl.so +0 -0
  481. scipy/special/_ufuncs_cxx.pxd +2 -15
  482. scipy/special/_ufuncs_cxx.pyx +5 -44
  483. scipy/special/_ufuncs_cxx_defs.h +2 -16
  484. scipy/special/_ufuncs_defs.h +0 -8
  485. scipy/special/cython_special.cpython-313-aarch64-linux-musl.so +0 -0
  486. scipy/special/cython_special.pxd +1 -1
  487. scipy/special/tests/_cython_examples/meson.build +10 -1
  488. scipy/special/tests/test_basic.py +153 -20
  489. scipy/special/tests/test_boost_ufuncs.py +3 -0
  490. scipy/special/tests/test_cdflib.py +35 -11
  491. scipy/special/tests/test_gammainc.py +16 -0
  492. scipy/special/tests/test_hyp2f1.py +2 -2
  493. scipy/special/tests/test_log1mexp.py +85 -0
  494. scipy/special/tests/test_logsumexp.py +206 -64
  495. scipy/special/tests/test_mpmath.py +1 -0
  496. scipy/special/tests/test_nan_inputs.py +1 -1
  497. scipy/special/tests/test_orthogonal.py +17 -18
  498. scipy/special/tests/test_sf_error.py +3 -2
  499. scipy/special/tests/test_sph_harm.py +6 -7
  500. scipy/special/tests/test_support_alternative_backends.py +211 -76
  501. scipy/stats/__init__.py +4 -1
  502. scipy/stats/_ansari_swilk_statistics.cpython-313-aarch64-linux-musl.so +0 -0
  503. scipy/stats/_axis_nan_policy.py +5 -12
  504. scipy/stats/_biasedurn.cpython-313-aarch64-linux-musl.so +0 -0
  505. scipy/stats/_continued_fraction.py +387 -0
  506. scipy/stats/_continuous_distns.py +277 -310
  507. scipy/stats/_correlation.py +1 -1
  508. scipy/stats/_covariance.py +6 -3
  509. scipy/stats/_discrete_distns.py +39 -32
  510. scipy/stats/_distn_infrastructure.py +39 -12
  511. scipy/stats/_distribution_infrastructure.py +920 -238
  512. scipy/stats/_entropy.py +9 -10
  513. scipy/{_lib → stats}/_finite_differences.py +1 -1
  514. scipy/stats/_hypotests.py +83 -50
  515. scipy/stats/_kde.py +53 -49
  516. scipy/stats/_ksstats.py +1 -1
  517. scipy/stats/_levy_stable/__init__.py +7 -15
  518. scipy/stats/_levy_stable/levyst.cpython-313-aarch64-linux-musl.so +0 -0
  519. scipy/stats/_morestats.py +118 -73
  520. scipy/stats/_mstats_basic.py +13 -17
  521. scipy/stats/_mstats_extras.py +8 -8
  522. scipy/stats/_multivariate.py +89 -113
  523. scipy/stats/_new_distributions.py +97 -20
  524. scipy/stats/_page_trend_test.py +12 -5
  525. scipy/stats/_probability_distribution.py +265 -43
  526. scipy/stats/_qmc.py +14 -9
  527. scipy/stats/_qmc_cy.cpython-313-aarch64-linux-musl.so +0 -0
  528. scipy/stats/_qmvnt.py +16 -95
  529. scipy/stats/_qmvnt_cy.cpython-313-aarch64-linux-musl.so +0 -0
  530. scipy/stats/_quantile.py +335 -0
  531. scipy/stats/_rcont/rcont.cpython-313-aarch64-linux-musl.so +0 -0
  532. scipy/stats/_resampling.py +5 -30
  533. scipy/stats/_sampling.py +1 -1
  534. scipy/stats/_sobol.cpython-313-aarch64-linux-musl.so +0 -0
  535. scipy/stats/_stats.cpython-313-aarch64-linux-musl.so +0 -0
  536. scipy/stats/_stats_mstats_common.py +21 -2
  537. scipy/stats/_stats_py.py +551 -477
  538. scipy/stats/_stats_pythran.cpython-313-aarch64-linux-musl.so +0 -0
  539. scipy/stats/_unuran/unuran_wrapper.cpython-313-aarch64-linux-musl.so +0 -0
  540. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  541. scipy/stats/_variation.py +6 -8
  542. scipy/stats/_wilcoxon.py +13 -7
  543. scipy/stats/tests/common_tests.py +6 -4
  544. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  545. scipy/stats/tests/test_continued_fraction.py +173 -0
  546. scipy/stats/tests/test_continuous.py +379 -60
  547. scipy/stats/tests/test_continuous_basic.py +18 -12
  548. scipy/stats/tests/test_discrete_basic.py +14 -8
  549. scipy/stats/tests/test_discrete_distns.py +16 -16
  550. scipy/stats/tests/test_distributions.py +95 -75
  551. scipy/stats/tests/test_entropy.py +40 -48
  552. scipy/stats/tests/test_fit.py +4 -3
  553. scipy/stats/tests/test_hypotests.py +153 -24
  554. scipy/stats/tests/test_kdeoth.py +109 -41
  555. scipy/stats/tests/test_marray.py +289 -0
  556. scipy/stats/tests/test_morestats.py +81 -49
  557. scipy/stats/tests/test_mstats_basic.py +3 -3
  558. scipy/stats/tests/test_multivariate.py +434 -83
  559. scipy/stats/tests/test_qmc.py +13 -10
  560. scipy/stats/tests/test_quantile.py +199 -0
  561. scipy/stats/tests/test_rank.py +119 -112
  562. scipy/stats/tests/test_resampling.py +47 -56
  563. scipy/stats/tests/test_sampling.py +9 -4
  564. scipy/stats/tests/test_stats.py +799 -939
  565. scipy/stats/tests/test_variation.py +8 -6
  566. scipy/version.py +2 -2
  567. {scipy-1.15.3.dist-info → scipy-1.16.0.dist-info}/LICENSE.txt +4 -4
  568. {scipy-1.15.3.dist-info → scipy-1.16.0.dist-info}/METADATA +11 -11
  569. {scipy-1.15.3.dist-info → scipy-1.16.0.dist-info}/RECORD +1284 -1291
  570. scipy.libs/libgcc_s-2d945d6c.so.1 +0 -0
  571. scipy.libs/libgfortran-67378ab2.so.5.0.0 +0 -0
  572. scipy.libs/{libstdc++-1b614e01.so.6.0.32 → libstdc++-85f2cd6d.so.6.0.33} +0 -0
  573. scipy/_lib/array_api_extra/_funcs.py +0 -484
  574. scipy/_lib/array_api_extra/_typing.py +0 -8
  575. scipy/interpolate/_bspl.cpython-313-aarch64-linux-musl.so +0 -0
  576. scipy/optimize/_cobyla.cpython-313-aarch64-linux-musl.so +0 -0
  577. scipy/optimize/_cython_nnls.cpython-313-aarch64-linux-musl.so +0 -0
  578. scipy/optimize/_slsqp.cpython-313-aarch64-linux-musl.so +0 -0
  579. scipy/spatial/qhull_src/COPYING.txt +0 -38
  580. scipy/special/libsf_error_state.so +0 -0
  581. scipy/special/tests/test_log_softmax.py +0 -109
  582. scipy/special/tests/test_xsf_cuda.py +0 -114
  583. scipy/special/xsf/binom.h +0 -89
  584. scipy/special/xsf/cdflib.h +0 -100
  585. scipy/special/xsf/cephes/airy.h +0 -307
  586. scipy/special/xsf/cephes/besselpoly.h +0 -51
  587. scipy/special/xsf/cephes/beta.h +0 -257
  588. scipy/special/xsf/cephes/cbrt.h +0 -131
  589. scipy/special/xsf/cephes/chbevl.h +0 -85
  590. scipy/special/xsf/cephes/chdtr.h +0 -193
  591. scipy/special/xsf/cephes/const.h +0 -87
  592. scipy/special/xsf/cephes/ellie.h +0 -293
  593. scipy/special/xsf/cephes/ellik.h +0 -251
  594. scipy/special/xsf/cephes/ellpe.h +0 -107
  595. scipy/special/xsf/cephes/ellpk.h +0 -117
  596. scipy/special/xsf/cephes/expn.h +0 -260
  597. scipy/special/xsf/cephes/gamma.h +0 -398
  598. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  599. scipy/special/xsf/cephes/hyperg.h +0 -361
  600. scipy/special/xsf/cephes/i0.h +0 -149
  601. scipy/special/xsf/cephes/i1.h +0 -158
  602. scipy/special/xsf/cephes/igam.h +0 -421
  603. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  604. scipy/special/xsf/cephes/igami.h +0 -313
  605. scipy/special/xsf/cephes/j0.h +0 -225
  606. scipy/special/xsf/cephes/j1.h +0 -198
  607. scipy/special/xsf/cephes/jv.h +0 -715
  608. scipy/special/xsf/cephes/k0.h +0 -164
  609. scipy/special/xsf/cephes/k1.h +0 -163
  610. scipy/special/xsf/cephes/kn.h +0 -243
  611. scipy/special/xsf/cephes/lanczos.h +0 -112
  612. scipy/special/xsf/cephes/ndtr.h +0 -275
  613. scipy/special/xsf/cephes/poch.h +0 -85
  614. scipy/special/xsf/cephes/polevl.h +0 -167
  615. scipy/special/xsf/cephes/psi.h +0 -194
  616. scipy/special/xsf/cephes/rgamma.h +0 -111
  617. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  618. scipy/special/xsf/cephes/shichi.h +0 -248
  619. scipy/special/xsf/cephes/sici.h +0 -224
  620. scipy/special/xsf/cephes/sindg.h +0 -221
  621. scipy/special/xsf/cephes/tandg.h +0 -139
  622. scipy/special/xsf/cephes/trig.h +0 -58
  623. scipy/special/xsf/cephes/unity.h +0 -186
  624. scipy/special/xsf/cephes/zeta.h +0 -172
  625. scipy/special/xsf/config.h +0 -304
  626. scipy/special/xsf/digamma.h +0 -205
  627. scipy/special/xsf/error.h +0 -57
  628. scipy/special/xsf/evalpoly.h +0 -47
  629. scipy/special/xsf/expint.h +0 -266
  630. scipy/special/xsf/hyp2f1.h +0 -694
  631. scipy/special/xsf/iv_ratio.h +0 -173
  632. scipy/special/xsf/lambertw.h +0 -150
  633. scipy/special/xsf/loggamma.h +0 -163
  634. scipy/special/xsf/sici.h +0 -200
  635. scipy/special/xsf/tools.h +0 -427
  636. scipy/special/xsf/trig.h +0 -164
  637. scipy/special/xsf/wright_bessel.h +0 -843
  638. scipy/special/xsf/zlog1.h +0 -35
  639. scipy/stats/_mvn.cpython-313-aarch64-linux-musl.so +0 -0
  640. scipy.libs/libgcc_s-7393e603.so.1 +0 -0
  641. scipy.libs/libgfortran-eb933d8e.so.5.0.0 +0 -0
  642. {scipy-1.15.3.dist-info → scipy-1.16.0.dist-info}/WHEEL +0 -0
@@ -35,20 +35,27 @@
35
35
  import numpy as np
36
36
  from itertools import product
37
37
 
38
- from scipy._lib._array_api import xp_assert_close
39
38
  from pytest import raises as assert_raises
40
39
  import pytest
41
40
 
41
+ from scipy._lib import array_api_extra as xpx
42
+ from scipy._lib._array_api import (
43
+ xp_assert_close, array_namespace
44
+ )
42
45
  from scipy.signal import upfirdn, firwin
43
46
  from scipy.signal._upfirdn import _output_len, _upfirdn_modes
44
47
  from scipy.signal._upfirdn_apply import _pad_test
45
48
 
49
+ skip_xp_backends = pytest.mark.skip_xp_backends
50
+
51
+
46
52
 
47
53
  def upfirdn_naive(x, h, up=1, down=1):
48
54
  """Naive upfirdn processing in Python.
49
55
 
50
56
  Note: arg order (x, h) differs to facilitate apply_along_axis use.
51
57
  """
58
+ x = np.asarray(x)
52
59
  h = np.asarray(h)
53
60
  out = np.zeros(len(x) * up, x.dtype)
54
61
  out[::up] = x
@@ -110,33 +117,37 @@ class UpFIRDnCase:
110
117
  xp_assert_close(yr.astype(y.dtype), y)
111
118
 
112
119
 
113
- _UPFIRDN_TYPES = (int, np.float32, np.complex64, float, complex)
120
+ _UPFIRDN_TYPES = ("int64", "float32", "complex64", "float64", "complex128")
114
121
 
115
122
 
123
+ @skip_xp_backends(cpu_only=True, reason='Cython implementation')
116
124
  class TestUpfirdn:
117
125
 
118
- def test_valid_input(self):
126
+ @skip_xp_backends(np_only=True, reason="enough to only test on numpy")
127
+ def test_valid_input(self, xp):
119
128
  assert_raises(ValueError, upfirdn, [1], [1], 1, 0) # up or down < 1
120
129
  assert_raises(ValueError, upfirdn, [], [1], 1, 1) # h.ndim != 1
121
130
  assert_raises(ValueError, upfirdn, [[1]], [1], 1, 1)
122
131
 
123
132
  @pytest.mark.parametrize('len_h', [1, 2, 3, 4, 5])
124
133
  @pytest.mark.parametrize('len_x', [1, 2, 3, 4, 5])
125
- def test_singleton(self, len_h, len_x):
134
+ def test_singleton(self, len_h, len_x, xp):
126
135
  # gh-9844: lengths producing expected outputs
127
- h = np.zeros(len_h)
128
- h[len_h // 2] = 1. # make h a delta
129
- x = np.ones(len_x)
136
+ h = xp.zeros(len_h)
137
+ h = xpx.at(h)[len_h // 2].set(1.) # make h a delta
138
+ x = xp.ones(len_x)
130
139
  y = upfirdn(h, x, 1, 1)
131
- want = np.pad(x, (len_h // 2, (len_h - 1) // 2), 'constant')
140
+ want = xpx.pad(x, (len_h // 2, (len_h - 1) // 2), 'constant', xp=xp)
132
141
  xp_assert_close(y, want)
133
142
 
134
- def test_shift_x(self):
143
+ def test_shift_x(self, xp):
135
144
  # gh-9844: shifted x can change values?
136
- y = upfirdn([1, 1], [1.], 1, 1)
137
- xp_assert_close(y, np.asarray([1.0, 1.0])) # was [0, 1] in the issue
138
- y = upfirdn([1, 1], [0., 1.], 1, 1)
139
- xp_assert_close(y, np.asarray([0.0, 1.0, 1.0]))
145
+ y = upfirdn(xp.asarray([1, 1]), xp.asarray([1.]), 1, 1)
146
+ xp_assert_close(
147
+ y, xp.asarray([1.0, 1.0], dtype=xp.float64) # was [0, 1] in the issue
148
+ )
149
+ y = upfirdn(xp.asarray([1, 1]), xp.asarray([0., 1.]), 1, 1)
150
+ xp_assert_close(y, xp.asarray([0.0, 1.0, 1.0], dtype=xp.float64))
140
151
 
141
152
  # A bunch of lengths/factors chosen because they exposed differences
142
153
  # between the "old way" and new way of computing length, and then
@@ -148,49 +159,56 @@ class TestUpfirdn:
148
159
  (3, 2, 6, 2, [1, 0, 0, 1, 0]),
149
160
  (4, 11, 3, 5, [1, 0, 0, 1, 0, 0, 1]),
150
161
  ])
151
- def test_length_factors(self, len_h, len_x, up, down, expected):
162
+ def test_length_factors(self, len_h, len_x, up, down, expected, xp):
152
163
  # gh-9844: weird factors
153
- h = np.zeros(len_h)
154
- h[0] = 1.
155
- x = np.ones(len_x)
164
+ h = xp.zeros(len_h)
165
+ h = xpx.at(h)[0].set(1.)
166
+ x = xp.ones(len_x, dtype=xp.float64)
156
167
  y = upfirdn(h, x, up, down)
157
- expected = np.asarray(expected, dtype=np.float64)
168
+ expected = xp.asarray(expected, dtype=xp.float64)
158
169
  xp_assert_close(y, expected)
159
170
 
171
+ @pytest.mark.parametrize(
172
+ 'dtype', ["int64", "float32", "complex64", "float64", "complex128"]
173
+ )
160
174
  @pytest.mark.parametrize('down, want_len', [ # lengths from MATLAB
161
175
  (2, 5015),
162
176
  (11, 912),
163
177
  (79, 127),
164
178
  ])
165
- def test_vs_convolve(self, down, want_len):
179
+ def test_vs_convolve(self, down, want_len, dtype, xp):
166
180
  # Check that up=1.0 gives same answer as convolve + slicing
167
181
  random_state = np.random.RandomState(17)
168
- try_types = (int, np.float32, np.complex64, float, complex)
169
182
  size = 10000
170
183
 
171
- for dtype in try_types:
172
- x = random_state.randn(size).astype(dtype)
173
- if dtype in (np.complex64, np.complex128):
174
- x += 1j * random_state.randn(size)
184
+ np_dtype = getattr(np, dtype)
185
+ x = random_state.randn(size).astype(np_dtype)
186
+ if np_dtype in (np.complex64, np.complex128):
187
+ x += 1j * random_state.randn(size)
188
+
189
+ dtype = getattr(xp, dtype)
190
+ x = xp.asarray(x, dtype=dtype)
175
191
 
176
- h = firwin(31, 1. / down, window='hamming')
177
- yl = upfirdn_naive(x, h, 1, down)
178
- y = upfirdn(h, x, up=1, down=down)
179
- assert y.shape == (want_len,)
180
- assert yl.shape[0] == y.shape[0]
181
- xp_assert_close(yl, y, atol=1e-7, rtol=1e-7)
192
+ h = xp.asarray(firwin(31, 1. / down, window='hamming'))
193
+ yl = xp.asarray(upfirdn_naive(x, h, 1, down))
194
+ y = upfirdn(h, x, up=1, down=down)
195
+ assert y.shape == (want_len,)
196
+ assert yl.shape[0] == y.shape[0]
197
+ xp_assert_close(yl, y, atol=1e-7, rtol=1e-7)
182
198
 
199
+ @skip_xp_backends(np_only=True, reason="apply_along_axis")
183
200
  @pytest.mark.parametrize('x_dtype', _UPFIRDN_TYPES)
184
201
  @pytest.mark.parametrize('h', (1., 1j))
185
202
  @pytest.mark.parametrize('up, down', [(1, 1), (2, 2), (3, 2), (2, 3)])
186
- def test_vs_naive_delta(self, x_dtype, h, up, down):
203
+ def test_vs_naive_delta(self, x_dtype, h, up, down, xp):
187
204
  UpFIRDnCase(up, down, h, x_dtype)()
188
205
 
206
+ @skip_xp_backends(np_only=True, reason="apply_along_axis")
189
207
  @pytest.mark.parametrize('x_dtype', _UPFIRDN_TYPES)
190
208
  @pytest.mark.parametrize('h_dtype', _UPFIRDN_TYPES)
191
209
  @pytest.mark.parametrize('p_max, q_max',
192
210
  list(product((10, 100), (10, 100))))
193
- def test_vs_naive(self, x_dtype, h_dtype, p_max, q_max):
211
+ def test_vs_naive(self, x_dtype, h_dtype, p_max, q_max, xp):
194
212
  tests = self._random_factors(p_max, q_max, h_dtype, x_dtype)
195
213
  for test in tests:
196
214
  test()
@@ -220,27 +238,34 @@ class TestUpfirdn:
220
238
  return tests
221
239
 
222
240
  @pytest.mark.parametrize('mode', _upfirdn_modes)
223
- def test_extensions(self, mode):
241
+ def test_extensions(self, mode, xp):
224
242
  """Test vs. manually computed results for modes not in numpy's pad."""
225
- x = np.array([1, 2, 3, 1], dtype=float)
243
+ x = np.asarray([1, 2, 3, 1], dtype=np.float64)
226
244
  npre, npost = 6, 6
227
245
  y = _pad_test(x, npre=npre, npost=npost, mode=mode)
246
+
247
+ x = xp.asarray(x)
248
+ y = xp.asarray(y)
228
249
  if mode == 'antisymmetric':
229
- y_expected = np.asarray(
250
+ y_expected = xp.asarray(
230
251
  [3.0, 1, -1, -3, -2, -1, 1, 2, 3, 1, -1, -3, -2, -1, 1, 2])
231
252
  elif mode == 'antireflect':
232
- y_expected = np.asarray(
253
+ y_expected = xp.asarray(
233
254
  [1.0, 2, 3, 1, -1, 0, 1, 2, 3, 1, -1, 0, 1, 2, 3, 1])
234
255
  elif mode == 'smooth':
235
- y_expected = np.asarray(
256
+ y_expected = xp.asarray(
236
257
  [-5.0, -4, -3, -2, -1, 0, 1, 2, 3, 1, -1, -3, -5, -7, -9, -11])
237
258
  elif mode == "line":
238
- lin_slope = (x[-1] - x[0]) / (len(x) - 1)
239
- left = x[0] + np.arange(-npre, 0, 1) * lin_slope
240
- right = x[-1] + np.arange(1, npost + 1) * lin_slope
241
- y_expected = np.concatenate((left, x, right))
259
+ lin_slope = (x[-1] - x[0]) / (x.shape[0] - 1)
260
+ left = x[0] + xp.arange(-npre, 0, 1, dtype=xp.float64) * lin_slope
261
+ right = x[-1] + xp.arange(1, npost + 1, dtype=xp.float64) * lin_slope
262
+ concat = array_namespace(left).concat
263
+ y_expected = concat((left, x, right))
242
264
  else:
243
- y_expected = np.pad(x, (npre, npost), mode=mode)
265
+ y_expected = np.pad(np.asarray(x), (npre, npost), mode=mode)
266
+ y_expected = xp.asarray(y_expected)
267
+
268
+ y_expected = xp.asarray(y_expected, dtype=xp.float64)
244
269
  xp_assert_close(y, y_expected)
245
270
 
246
271
  @pytest.mark.parametrize(
@@ -249,32 +274,41 @@ class TestUpfirdn:
249
274
  [8],
250
275
  [4, 5, 26], # include cases with h_len > 2*size
251
276
  _upfirdn_modes,
252
- [np.float32, np.float64, np.complex64, np.complex128],
277
+ ["float32", "float64", "complex64", "complex128"],
253
278
  )
254
279
  )
255
- def test_modes(self, size, h_len, mode, dtype):
280
+ def test_modes(self, size, h_len, mode, dtype, xp):
281
+ dtype_np = getattr(np, dtype)
282
+ dtype_xp = getattr(xp, dtype)
283
+
256
284
  random_state = np.random.RandomState(5)
257
- x = random_state.randn(size).astype(dtype)
258
- if dtype in (np.complex64, np.complex128):
285
+ x = random_state.randn(size).astype(dtype_np)
286
+ if dtype in ("complex64", "complex128"):
259
287
  x += 1j * random_state.randn(size)
260
288
  h = np.arange(1, 1 + h_len, dtype=x.real.dtype)
261
289
 
290
+ x = xp.asarray(x, dtype=dtype_xp)
291
+ h = xp.asarray(h)
292
+
262
293
  y = upfirdn(h, x, up=1, down=1, mode=mode)
263
294
  # expected result: pad the input, filter with zero padding, then crop
264
295
  npad = h_len - 1
265
296
  if mode in ['antisymmetric', 'antireflect', 'smooth', 'line']:
266
297
  # use _pad_test test function for modes not supported by np.pad.
267
- xpad = _pad_test(x, npre=npad, npost=npad, mode=mode)
298
+ xpad = _pad_test(np.asarray(x), npre=npad, npost=npad, mode=mode)
268
299
  else:
269
- xpad = np.pad(x, npad, mode=mode)
300
+ xpad = np.pad(np.asarray(x), npad, mode=mode)
301
+
302
+ xpad = xp.asarray(xpad)
270
303
  ypad = upfirdn(h, xpad, up=1, down=1, mode='constant')
271
304
  y_expected = ypad[npad:-npad]
272
305
 
273
- atol = rtol = np.finfo(dtype).eps * 1e2
306
+ atol = rtol = xp.finfo(dtype_xp).eps * 1e2
274
307
  xp_assert_close(y, y_expected, atol=atol, rtol=rtol)
275
308
 
276
309
 
277
- def test_output_len_long_input():
310
+ @skip_xp_backends(cpu_only=True, reason='Cython implementation')
311
+ def test_output_len_long_input(xp):
278
312
  # Regression test for gh-17375. On Windows, a large enough input
279
313
  # that should have been well within the capabilities of 64 bit integers
280
314
  # would result in a 32 bit overflow because of a bug in Cython 0.29.32.
@@ -378,3 +378,23 @@ class TestUnitImpulse:
378
378
 
379
379
  imp = waveforms.unit_impulse((5, 2), (3, 1), dtype=complex)
380
380
  assert np.issubdtype(imp.dtype, np.complexfloating)
381
+
382
+
383
+ class TestSawtoothWaveform:
384
+ def test_dtype(self):
385
+ waveform = waveforms.sawtooth(
386
+ np.array(1, dtype=np.float32), width=np.float32(1)
387
+ )
388
+ assert waveform.dtype == np.float64
389
+
390
+ waveform = waveforms.sawtooth(1)
391
+ assert waveform.dtype == np.float64
392
+
393
+
394
+ class TestSquareWaveform:
395
+ def test_dtype(self):
396
+ waveform = waveforms.square(np.array(1, dtype=np.float32), duty=np.float32(0.5))
397
+ assert waveform.dtype == np.float64
398
+
399
+ waveform = waveforms.square(1)
400
+ assert waveform.dtype == np.float64