scipy 1.15.3__cp312-cp312-musllinux_1_2_aarch64.whl → 1.16.0rc2__cp312-cp312-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 (641) hide show
  1. scipy/__config__.py +10 -10
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cpython-312-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-312-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-312-aarch64-linux-musl.so +0 -0
  11. scipy/_lib/_sparse.py +41 -0
  12. scipy/_lib/_test_ccallback.cpython-312-aarch64-linux-musl.so +0 -0
  13. scipy/_lib/_test_deprecation_call.cpython-312-aarch64-linux-musl.so +0 -0
  14. scipy/_lib/_test_deprecation_def.cpython-312-aarch64-linux-musl.so +0 -0
  15. scipy/_lib/_testutils.py +6 -2
  16. scipy/_lib/_uarray/_uarray.cpython-312-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-312-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-312-aarch64-linux-musl.so +0 -0
  97. scipy/cluster/_optimal_leaf_ordering.cpython-312-aarch64-linux-musl.so +0 -0
  98. scipy/cluster/_vq.cpython-312-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 +263 -157
  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-312-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-312-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-312-aarch64-linux-musl.so +0 -0
  129. scipy/integrate/_lsoda.cpython-312-aarch64-linux-musl.so +0 -0
  130. scipy/integrate/_ode.py +9 -2
  131. scipy/integrate/_odepack.cpython-312-aarch64-linux-musl.so +0 -0
  132. scipy/integrate/_quad_vec.py +21 -29
  133. scipy/integrate/_quadpack.cpython-312-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-312-aarch64-linux-musl.so +0 -0
  139. scipy/integrate/_test_odeint_banded.cpython-312-aarch64-linux-musl.so +0 -0
  140. scipy/integrate/_vode.cpython-312-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-312-aarch64-linux-musl.so +0 -0
  151. scipy/interpolate/_dierckx.cpython-312-aarch64-linux-musl.so +0 -0
  152. scipy/interpolate/_fitpack.cpython-312-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-312-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-312-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-312-aarch64-linux-musl.so +0 -0
  165. scipy/interpolate/_rgi.py +31 -26
  166. scipy/interpolate/_rgi_cython.cpython-312-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-312-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-312-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-312-aarch64-linux-musl.so +0 -0
  187. scipy/io/matlab/_mio_utils.cpython-312-aarch64-linux-musl.so +0 -0
  188. scipy/io/matlab/_miobase.py +4 -1
  189. scipy/io/matlab/_streams.cpython-312-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-312-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-312-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-312-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-312-aarch64-linux-musl.so +0 -0
  210. scipy/linalg/_expm_frechet.py +4 -0
  211. scipy/linalg/_fblas.cpython-312-aarch64-linux-musl.so +0 -0
  212. scipy/linalg/_flapack.cpython-312-aarch64-linux-musl.so +0 -0
  213. scipy/linalg/_linalg_pythran.cpython-312-aarch64-linux-musl.so +0 -0
  214. scipy/linalg/_matfuncs.py +187 -4
  215. scipy/linalg/_matfuncs_expm.cpython-312-aarch64-linux-musl.so +0 -0
  216. scipy/linalg/_matfuncs_schur_sqrtm.cpython-312-aarch64-linux-musl.so +0 -0
  217. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  218. scipy/linalg/_matfuncs_sqrtm_triu.cpython-312-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-312-aarch64-linux-musl.so +0 -0
  222. scipy/linalg/_solvers.py +7 -2
  223. scipy/linalg/_special_matrices.py +26 -36
  224. scipy/linalg/cython_blas.cpython-312-aarch64-linux-musl.so +0 -0
  225. scipy/linalg/cython_lapack.cpython-312-aarch64-linux-musl.so +0 -0
  226. scipy/linalg/lapack.py +22 -2
  227. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  228. scipy/linalg/tests/test_basic.py +31 -16
  229. scipy/linalg/tests/test_batch.py +588 -0
  230. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  231. scipy/linalg/tests/test_decomp.py +40 -3
  232. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  233. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  234. scipy/linalg/tests/test_lapack.py +115 -7
  235. scipy/linalg/tests/test_matfuncs.py +157 -102
  236. scipy/linalg/tests/test_procrustes.py +0 -7
  237. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  238. scipy/linalg/tests/test_special_matrices.py +1 -5
  239. scipy/ndimage/__init__.py +1 -0
  240. scipy/ndimage/_ctest.cpython-312-aarch64-linux-musl.so +0 -0
  241. scipy/ndimage/_cytest.cpython-312-aarch64-linux-musl.so +0 -0
  242. scipy/ndimage/_delegators.py +8 -2
  243. scipy/ndimage/_filters.py +453 -5
  244. scipy/ndimage/_interpolation.py +36 -6
  245. scipy/ndimage/_measurements.py +4 -2
  246. scipy/ndimage/_morphology.py +5 -0
  247. scipy/ndimage/_nd_image.cpython-312-aarch64-linux-musl.so +0 -0
  248. scipy/ndimage/_ni_docstrings.py +5 -1
  249. scipy/ndimage/_ni_label.cpython-312-aarch64-linux-musl.so +0 -0
  250. scipy/ndimage/_ni_support.py +1 -5
  251. scipy/ndimage/_rank_filter_1d.cpython-312-aarch64-linux-musl.so +0 -0
  252. scipy/ndimage/_support_alternative_backends.py +18 -6
  253. scipy/ndimage/tests/test_filters.py +370 -259
  254. scipy/ndimage/tests/test_fourier.py +7 -9
  255. scipy/ndimage/tests/test_interpolation.py +68 -61
  256. scipy/ndimage/tests/test_measurements.py +18 -35
  257. scipy/ndimage/tests/test_morphology.py +143 -131
  258. scipy/ndimage/tests/test_splines.py +1 -3
  259. scipy/odr/__odrpack.cpython-312-aarch64-linux-musl.so +0 -0
  260. scipy/optimize/_basinhopping.py +13 -7
  261. scipy/optimize/_bglu_dense.cpython-312-aarch64-linux-musl.so +0 -0
  262. scipy/optimize/_bracket.py +17 -24
  263. scipy/optimize/_chandrupatla.py +9 -10
  264. scipy/optimize/_cobyla_py.py +104 -123
  265. scipy/optimize/_constraints.py +14 -10
  266. scipy/optimize/_differentiable_functions.py +371 -230
  267. scipy/optimize/_differentialevolution.py +4 -3
  268. scipy/optimize/_direct.cpython-312-aarch64-linux-musl.so +0 -0
  269. scipy/optimize/_dual_annealing.py +1 -1
  270. scipy/optimize/_elementwise.py +1 -4
  271. scipy/optimize/_group_columns.cpython-312-aarch64-linux-musl.so +0 -0
  272. scipy/optimize/_highspy/_core.cpython-312-aarch64-linux-musl.so +0 -0
  273. scipy/optimize/_highspy/_highs_options.cpython-312-aarch64-linux-musl.so +0 -0
  274. scipy/optimize/_lbfgsb.cpython-312-aarch64-linux-musl.so +0 -0
  275. scipy/optimize/_lbfgsb_py.py +57 -16
  276. scipy/optimize/_linprog_doc.py +2 -2
  277. scipy/optimize/_linprog_highs.py +2 -2
  278. scipy/optimize/_linprog_ip.py +25 -10
  279. scipy/optimize/_linprog_util.py +14 -16
  280. scipy/optimize/_lsap.cpython-312-aarch64-linux-musl.so +0 -0
  281. scipy/optimize/_lsq/common.py +3 -3
  282. scipy/optimize/_lsq/dogbox.py +16 -2
  283. scipy/optimize/_lsq/givens_elimination.cpython-312-aarch64-linux-musl.so +0 -0
  284. scipy/optimize/_lsq/least_squares.py +198 -126
  285. scipy/optimize/_lsq/lsq_linear.py +6 -6
  286. scipy/optimize/_lsq/trf.py +35 -8
  287. scipy/optimize/_milp.py +3 -1
  288. scipy/optimize/_minimize.py +105 -36
  289. scipy/optimize/_minpack.cpython-312-aarch64-linux-musl.so +0 -0
  290. scipy/optimize/_minpack_py.py +21 -14
  291. scipy/optimize/_moduleTNC.cpython-312-aarch64-linux-musl.so +0 -0
  292. scipy/optimize/_nnls.py +20 -21
  293. scipy/optimize/_nonlin.py +34 -3
  294. scipy/optimize/_numdiff.py +288 -110
  295. scipy/optimize/_optimize.py +86 -48
  296. scipy/optimize/_pava_pybind.cpython-312-aarch64-linux-musl.so +0 -0
  297. scipy/optimize/_remove_redundancy.py +5 -5
  298. scipy/optimize/_root_scalar.py +1 -1
  299. scipy/optimize/_shgo.py +6 -0
  300. scipy/optimize/_shgo_lib/_complex.py +1 -1
  301. scipy/optimize/_slsqp_py.py +216 -124
  302. scipy/optimize/_slsqplib.cpython-312-aarch64-linux-musl.so +0 -0
  303. scipy/optimize/_spectral.py +1 -1
  304. scipy/optimize/_tnc.py +8 -1
  305. scipy/optimize/_trlib/_trlib.cpython-312-aarch64-linux-musl.so +0 -0
  306. scipy/optimize/_trustregion.py +20 -6
  307. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  308. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  309. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  310. scipy/optimize/_trustregion_constr/projections.py +12 -8
  311. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  312. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  313. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  314. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  315. scipy/optimize/_trustregion_exact.py +0 -1
  316. scipy/optimize/_zeros.cpython-312-aarch64-linux-musl.so +0 -0
  317. scipy/optimize/_zeros_py.py +97 -17
  318. scipy/optimize/cython_optimize/_zeros.cpython-312-aarch64-linux-musl.so +0 -0
  319. scipy/optimize/slsqp.py +0 -1
  320. scipy/optimize/tests/test__basinhopping.py +1 -1
  321. scipy/optimize/tests/test__differential_evolution.py +4 -4
  322. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  323. scipy/optimize/tests/test__numdiff.py +66 -22
  324. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  325. scipy/optimize/tests/test__shgo.py +9 -1
  326. scipy/optimize/tests/test_bracket.py +36 -46
  327. scipy/optimize/tests/test_chandrupatla.py +133 -135
  328. scipy/optimize/tests/test_cobyla.py +74 -45
  329. scipy/optimize/tests/test_constraints.py +1 -1
  330. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  331. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  332. scipy/optimize/tests/test_least_squares.py +125 -13
  333. scipy/optimize/tests/test_linear_assignment.py +3 -3
  334. scipy/optimize/tests/test_linprog.py +3 -3
  335. scipy/optimize/tests/test_lsq_linear.py +6 -6
  336. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  337. scipy/optimize/tests/test_minpack.py +4 -4
  338. scipy/optimize/tests/test_nnls.py +43 -3
  339. scipy/optimize/tests/test_nonlin.py +36 -0
  340. scipy/optimize/tests/test_optimize.py +95 -17
  341. scipy/optimize/tests/test_slsqp.py +36 -4
  342. scipy/optimize/tests/test_zeros.py +34 -1
  343. scipy/signal/__init__.py +12 -23
  344. scipy/signal/_delegators.py +568 -0
  345. scipy/signal/_filter_design.py +459 -241
  346. scipy/signal/_fir_filter_design.py +262 -90
  347. scipy/signal/_lti_conversion.py +3 -2
  348. scipy/signal/_ltisys.py +118 -91
  349. scipy/signal/_max_len_seq_inner.cpython-312-aarch64-linux-musl.so +0 -0
  350. scipy/signal/_peak_finding_utils.cpython-312-aarch64-linux-musl.so +0 -0
  351. scipy/signal/_polyutils.py +172 -0
  352. scipy/signal/_short_time_fft.py +519 -70
  353. scipy/signal/_signal_api.py +30 -0
  354. scipy/signal/_signaltools.py +719 -399
  355. scipy/signal/_sigtools.cpython-312-aarch64-linux-musl.so +0 -0
  356. scipy/signal/_sosfilt.cpython-312-aarch64-linux-musl.so +0 -0
  357. scipy/signal/_spectral_py.py +230 -50
  358. scipy/signal/_spline.cpython-312-aarch64-linux-musl.so +0 -0
  359. scipy/signal/_spline_filters.py +108 -68
  360. scipy/signal/_support_alternative_backends.py +73 -0
  361. scipy/signal/_upfirdn.py +4 -1
  362. scipy/signal/_upfirdn_apply.cpython-312-aarch64-linux-musl.so +0 -0
  363. scipy/signal/_waveforms.py +2 -11
  364. scipy/signal/_wavelets.py +1 -1
  365. scipy/signal/fir_filter_design.py +1 -0
  366. scipy/signal/spline.py +4 -11
  367. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  368. scipy/signal/tests/test_bsplines.py +114 -79
  369. scipy/signal/tests/test_cont2discrete.py +9 -2
  370. scipy/signal/tests/test_filter_design.py +721 -481
  371. scipy/signal/tests/test_fir_filter_design.py +332 -140
  372. scipy/signal/tests/test_savitzky_golay.py +4 -3
  373. scipy/signal/tests/test_short_time_fft.py +221 -3
  374. scipy/signal/tests/test_signaltools.py +2144 -1348
  375. scipy/signal/tests/test_spectral.py +50 -6
  376. scipy/signal/tests/test_splines.py +161 -96
  377. scipy/signal/tests/test_upfirdn.py +84 -50
  378. scipy/signal/tests/test_waveforms.py +20 -0
  379. scipy/signal/tests/test_windows.py +607 -466
  380. scipy/signal/windows/_windows.py +287 -148
  381. scipy/sparse/__init__.py +23 -4
  382. scipy/sparse/_base.py +270 -108
  383. scipy/sparse/_bsr.py +7 -4
  384. scipy/sparse/_compressed.py +59 -231
  385. scipy/sparse/_construct.py +90 -38
  386. scipy/sparse/_coo.py +115 -181
  387. scipy/sparse/_csc.py +4 -4
  388. scipy/sparse/_csparsetools.cpython-312-aarch64-linux-musl.so +0 -0
  389. scipy/sparse/_csr.py +2 -2
  390. scipy/sparse/_data.py +48 -48
  391. scipy/sparse/_dia.py +105 -18
  392. scipy/sparse/_dok.py +0 -23
  393. scipy/sparse/_index.py +4 -4
  394. scipy/sparse/_matrix.py +23 -0
  395. scipy/sparse/_sparsetools.cpython-312-aarch64-linux-musl.so +0 -0
  396. scipy/sparse/_sputils.py +37 -22
  397. scipy/sparse/base.py +0 -9
  398. scipy/sparse/bsr.py +0 -14
  399. scipy/sparse/compressed.py +0 -23
  400. scipy/sparse/construct.py +0 -6
  401. scipy/sparse/coo.py +0 -14
  402. scipy/sparse/csc.py +0 -3
  403. scipy/sparse/csgraph/_flow.cpython-312-aarch64-linux-musl.so +0 -0
  404. scipy/sparse/csgraph/_matching.cpython-312-aarch64-linux-musl.so +0 -0
  405. scipy/sparse/csgraph/_min_spanning_tree.cpython-312-aarch64-linux-musl.so +0 -0
  406. scipy/sparse/csgraph/_reordering.cpython-312-aarch64-linux-musl.so +0 -0
  407. scipy/sparse/csgraph/_shortest_path.cpython-312-aarch64-linux-musl.so +0 -0
  408. scipy/sparse/csgraph/_tools.cpython-312-aarch64-linux-musl.so +0 -0
  409. scipy/sparse/csgraph/_traversal.cpython-312-aarch64-linux-musl.so +0 -0
  410. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  411. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  412. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  413. scipy/sparse/csr.py +0 -5
  414. scipy/sparse/data.py +1 -6
  415. scipy/sparse/dia.py +0 -7
  416. scipy/sparse/dok.py +0 -10
  417. scipy/sparse/linalg/_dsolve/_superlu.cpython-312-aarch64-linux-musl.so +0 -0
  418. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  419. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  420. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-312-aarch64-linux-musl.so +0 -0
  421. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  422. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  423. scipy/sparse/linalg/_interface.py +17 -18
  424. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  425. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  426. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  427. scipy/sparse/linalg/_isolve/minres.py +5 -5
  428. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  429. scipy/sparse/linalg/_isolve/utils.py +2 -8
  430. scipy/sparse/linalg/_matfuncs.py +1 -1
  431. scipy/sparse/linalg/_norm.py +1 -1
  432. scipy/sparse/linalg/_propack/_cpropack.cpython-312-aarch64-linux-musl.so +0 -0
  433. scipy/sparse/linalg/_propack/_dpropack.cpython-312-aarch64-linux-musl.so +0 -0
  434. scipy/sparse/linalg/_propack/_spropack.cpython-312-aarch64-linux-musl.so +0 -0
  435. scipy/sparse/linalg/_propack/_zpropack.cpython-312-aarch64-linux-musl.so +0 -0
  436. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  437. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  438. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  439. scipy/sparse/tests/test_base.py +214 -42
  440. scipy/sparse/tests/test_common1d.py +7 -7
  441. scipy/sparse/tests/test_construct.py +1 -1
  442. scipy/sparse/tests/test_coo.py +272 -4
  443. scipy/sparse/tests/test_sparsetools.py +5 -0
  444. scipy/sparse/tests/test_sputils.py +36 -7
  445. scipy/spatial/_ckdtree.cpython-312-aarch64-linux-musl.so +0 -0
  446. scipy/spatial/_distance_pybind.cpython-312-aarch64-linux-musl.so +0 -0
  447. scipy/spatial/_distance_wrap.cpython-312-aarch64-linux-musl.so +0 -0
  448. scipy/spatial/_hausdorff.cpython-312-aarch64-linux-musl.so +0 -0
  449. scipy/spatial/_qhull.cpython-312-aarch64-linux-musl.so +0 -0
  450. scipy/spatial/_voronoi.cpython-312-aarch64-linux-musl.so +0 -0
  451. scipy/spatial/distance.py +49 -42
  452. scipy/spatial/tests/test_distance.py +15 -1
  453. scipy/spatial/tests/test_kdtree.py +1 -0
  454. scipy/spatial/tests/test_qhull.py +7 -2
  455. scipy/spatial/transform/__init__.py +5 -3
  456. scipy/spatial/transform/_rigid_transform.cpython-312-aarch64-linux-musl.so +0 -0
  457. scipy/spatial/transform/_rotation.cpython-312-aarch64-linux-musl.so +0 -0
  458. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  459. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  460. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  461. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  462. scipy/special/__init__.py +1 -47
  463. scipy/special/_add_newdocs.py +34 -772
  464. scipy/special/_basic.py +22 -25
  465. scipy/special/_comb.cpython-312-aarch64-linux-musl.so +0 -0
  466. scipy/special/_ellip_harm_2.cpython-312-aarch64-linux-musl.so +0 -0
  467. scipy/special/_gufuncs.cpython-312-aarch64-linux-musl.so +0 -0
  468. scipy/special/_logsumexp.py +67 -58
  469. scipy/special/_orthogonal.pyi +1 -1
  470. scipy/special/_specfun.cpython-312-aarch64-linux-musl.so +0 -0
  471. scipy/special/_special_ufuncs.cpython-312-aarch64-linux-musl.so +0 -0
  472. scipy/special/_spherical_bessel.py +4 -4
  473. scipy/special/_support_alternative_backends.py +212 -119
  474. scipy/special/_test_internal.cpython-312-aarch64-linux-musl.so +0 -0
  475. scipy/special/_testutils.py +4 -4
  476. scipy/special/_ufuncs.cpython-312-aarch64-linux-musl.so +0 -0
  477. scipy/special/_ufuncs.pyi +1 -0
  478. scipy/special/_ufuncs.pyx +215 -1400
  479. scipy/special/_ufuncs_cxx.cpython-312-aarch64-linux-musl.so +0 -0
  480. scipy/special/_ufuncs_cxx.pxd +2 -15
  481. scipy/special/_ufuncs_cxx.pyx +5 -44
  482. scipy/special/_ufuncs_cxx_defs.h +2 -16
  483. scipy/special/_ufuncs_defs.h +0 -8
  484. scipy/special/cython_special.cpython-312-aarch64-linux-musl.so +0 -0
  485. scipy/special/cython_special.pxd +1 -1
  486. scipy/special/tests/_cython_examples/meson.build +10 -1
  487. scipy/special/tests/test_basic.py +153 -20
  488. scipy/special/tests/test_boost_ufuncs.py +3 -0
  489. scipy/special/tests/test_cdflib.py +35 -11
  490. scipy/special/tests/test_gammainc.py +16 -0
  491. scipy/special/tests/test_hyp2f1.py +2 -2
  492. scipy/special/tests/test_log1mexp.py +85 -0
  493. scipy/special/tests/test_logsumexp.py +206 -64
  494. scipy/special/tests/test_mpmath.py +1 -0
  495. scipy/special/tests/test_nan_inputs.py +1 -1
  496. scipy/special/tests/test_orthogonal.py +17 -18
  497. scipy/special/tests/test_sf_error.py +3 -2
  498. scipy/special/tests/test_sph_harm.py +6 -7
  499. scipy/special/tests/test_support_alternative_backends.py +211 -76
  500. scipy/stats/__init__.py +4 -1
  501. scipy/stats/_ansari_swilk_statistics.cpython-312-aarch64-linux-musl.so +0 -0
  502. scipy/stats/_axis_nan_policy.py +5 -12
  503. scipy/stats/_biasedurn.cpython-312-aarch64-linux-musl.so +0 -0
  504. scipy/stats/_continued_fraction.py +387 -0
  505. scipy/stats/_continuous_distns.py +277 -310
  506. scipy/stats/_correlation.py +1 -1
  507. scipy/stats/_covariance.py +6 -3
  508. scipy/stats/_discrete_distns.py +39 -32
  509. scipy/stats/_distn_infrastructure.py +39 -12
  510. scipy/stats/_distribution_infrastructure.py +900 -238
  511. scipy/stats/_entropy.py +9 -10
  512. scipy/{_lib → stats}/_finite_differences.py +1 -1
  513. scipy/stats/_hypotests.py +83 -50
  514. scipy/stats/_kde.py +53 -49
  515. scipy/stats/_ksstats.py +1 -1
  516. scipy/stats/_levy_stable/__init__.py +7 -15
  517. scipy/stats/_levy_stable/levyst.cpython-312-aarch64-linux-musl.so +0 -0
  518. scipy/stats/_morestats.py +118 -73
  519. scipy/stats/_mstats_basic.py +13 -17
  520. scipy/stats/_mstats_extras.py +8 -8
  521. scipy/stats/_multivariate.py +89 -113
  522. scipy/stats/_new_distributions.py +97 -20
  523. scipy/stats/_page_trend_test.py +12 -5
  524. scipy/stats/_probability_distribution.py +265 -43
  525. scipy/stats/_qmc.py +14 -9
  526. scipy/stats/_qmc_cy.cpython-312-aarch64-linux-musl.so +0 -0
  527. scipy/stats/_qmvnt.py +16 -95
  528. scipy/stats/_qmvnt_cy.cpython-312-aarch64-linux-musl.so +0 -0
  529. scipy/stats/_quantile.py +335 -0
  530. scipy/stats/_rcont/rcont.cpython-312-aarch64-linux-musl.so +0 -0
  531. scipy/stats/_resampling.py +4 -29
  532. scipy/stats/_sampling.py +1 -1
  533. scipy/stats/_sobol.cpython-312-aarch64-linux-musl.so +0 -0
  534. scipy/stats/_stats.cpython-312-aarch64-linux-musl.so +0 -0
  535. scipy/stats/_stats_mstats_common.py +21 -2
  536. scipy/stats/_stats_py.py +550 -476
  537. scipy/stats/_stats_pythran.cpython-312-aarch64-linux-musl.so +0 -0
  538. scipy/stats/_unuran/unuran_wrapper.cpython-312-aarch64-linux-musl.so +0 -0
  539. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  540. scipy/stats/_variation.py +6 -8
  541. scipy/stats/_wilcoxon.py +13 -7
  542. scipy/stats/tests/common_tests.py +6 -4
  543. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  544. scipy/stats/tests/test_continued_fraction.py +173 -0
  545. scipy/stats/tests/test_continuous.py +379 -60
  546. scipy/stats/tests/test_continuous_basic.py +18 -12
  547. scipy/stats/tests/test_discrete_basic.py +14 -8
  548. scipy/stats/tests/test_discrete_distns.py +16 -16
  549. scipy/stats/tests/test_distributions.py +95 -75
  550. scipy/stats/tests/test_entropy.py +40 -48
  551. scipy/stats/tests/test_fit.py +4 -3
  552. scipy/stats/tests/test_hypotests.py +153 -24
  553. scipy/stats/tests/test_kdeoth.py +109 -41
  554. scipy/stats/tests/test_marray.py +289 -0
  555. scipy/stats/tests/test_morestats.py +79 -47
  556. scipy/stats/tests/test_mstats_basic.py +3 -3
  557. scipy/stats/tests/test_multivariate.py +434 -83
  558. scipy/stats/tests/test_qmc.py +13 -10
  559. scipy/stats/tests/test_quantile.py +199 -0
  560. scipy/stats/tests/test_rank.py +119 -112
  561. scipy/stats/tests/test_resampling.py +47 -56
  562. scipy/stats/tests/test_sampling.py +9 -4
  563. scipy/stats/tests/test_stats.py +799 -939
  564. scipy/stats/tests/test_variation.py +8 -6
  565. scipy/version.py +2 -2
  566. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  567. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  568. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +1262 -1269
  569. scipy.libs/libgcc_s-69c45f16.so.1 +0 -0
  570. scipy.libs/libgfortran-db0b6589.so.5.0.0 +0 -0
  571. scipy.libs/{libstdc++-1b614e01.so.6.0.32 → libstdc++-1f1a71be.so.6.0.33} +0 -0
  572. scipy/_lib/array_api_extra/_funcs.py +0 -484
  573. scipy/_lib/array_api_extra/_typing.py +0 -8
  574. scipy/interpolate/_bspl.cpython-312-aarch64-linux-musl.so +0 -0
  575. scipy/optimize/_cobyla.cpython-312-aarch64-linux-musl.so +0 -0
  576. scipy/optimize/_cython_nnls.cpython-312-aarch64-linux-musl.so +0 -0
  577. scipy/optimize/_slsqp.cpython-312-aarch64-linux-musl.so +0 -0
  578. scipy/spatial/qhull_src/COPYING.txt +0 -38
  579. scipy/special/libsf_error_state.so +0 -0
  580. scipy/special/tests/test_log_softmax.py +0 -109
  581. scipy/special/tests/test_xsf_cuda.py +0 -114
  582. scipy/special/xsf/binom.h +0 -89
  583. scipy/special/xsf/cdflib.h +0 -100
  584. scipy/special/xsf/cephes/airy.h +0 -307
  585. scipy/special/xsf/cephes/besselpoly.h +0 -51
  586. scipy/special/xsf/cephes/beta.h +0 -257
  587. scipy/special/xsf/cephes/cbrt.h +0 -131
  588. scipy/special/xsf/cephes/chbevl.h +0 -85
  589. scipy/special/xsf/cephes/chdtr.h +0 -193
  590. scipy/special/xsf/cephes/const.h +0 -87
  591. scipy/special/xsf/cephes/ellie.h +0 -293
  592. scipy/special/xsf/cephes/ellik.h +0 -251
  593. scipy/special/xsf/cephes/ellpe.h +0 -107
  594. scipy/special/xsf/cephes/ellpk.h +0 -117
  595. scipy/special/xsf/cephes/expn.h +0 -260
  596. scipy/special/xsf/cephes/gamma.h +0 -398
  597. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  598. scipy/special/xsf/cephes/hyperg.h +0 -361
  599. scipy/special/xsf/cephes/i0.h +0 -149
  600. scipy/special/xsf/cephes/i1.h +0 -158
  601. scipy/special/xsf/cephes/igam.h +0 -421
  602. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  603. scipy/special/xsf/cephes/igami.h +0 -313
  604. scipy/special/xsf/cephes/j0.h +0 -225
  605. scipy/special/xsf/cephes/j1.h +0 -198
  606. scipy/special/xsf/cephes/jv.h +0 -715
  607. scipy/special/xsf/cephes/k0.h +0 -164
  608. scipy/special/xsf/cephes/k1.h +0 -163
  609. scipy/special/xsf/cephes/kn.h +0 -243
  610. scipy/special/xsf/cephes/lanczos.h +0 -112
  611. scipy/special/xsf/cephes/ndtr.h +0 -275
  612. scipy/special/xsf/cephes/poch.h +0 -85
  613. scipy/special/xsf/cephes/polevl.h +0 -167
  614. scipy/special/xsf/cephes/psi.h +0 -194
  615. scipy/special/xsf/cephes/rgamma.h +0 -111
  616. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  617. scipy/special/xsf/cephes/shichi.h +0 -248
  618. scipy/special/xsf/cephes/sici.h +0 -224
  619. scipy/special/xsf/cephes/sindg.h +0 -221
  620. scipy/special/xsf/cephes/tandg.h +0 -139
  621. scipy/special/xsf/cephes/trig.h +0 -58
  622. scipy/special/xsf/cephes/unity.h +0 -186
  623. scipy/special/xsf/cephes/zeta.h +0 -172
  624. scipy/special/xsf/config.h +0 -304
  625. scipy/special/xsf/digamma.h +0 -205
  626. scipy/special/xsf/error.h +0 -57
  627. scipy/special/xsf/evalpoly.h +0 -47
  628. scipy/special/xsf/expint.h +0 -266
  629. scipy/special/xsf/hyp2f1.h +0 -694
  630. scipy/special/xsf/iv_ratio.h +0 -173
  631. scipy/special/xsf/lambertw.h +0 -150
  632. scipy/special/xsf/loggamma.h +0 -163
  633. scipy/special/xsf/sici.h +0 -200
  634. scipy/special/xsf/tools.h +0 -427
  635. scipy/special/xsf/trig.h +0 -164
  636. scipy/special/xsf/wright_bessel.h +0 -843
  637. scipy/special/xsf/zlog1.h +0 -35
  638. scipy/stats/_mvn.cpython-312-aarch64-linux-musl.so +0 -0
  639. scipy.libs/libgcc_s-7393e603.so.1 +0 -0
  640. scipy.libs/libgfortran-eb933d8e.so.5.0.0 +0 -0
  641. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
@@ -1,9 +1,12 @@
1
- from numpy import (asarray, pi, zeros_like,
2
- array, arctan2, tan, ones, arange, floor,
3
- r_, atleast_1d, sqrt, exp, greater, cos, add, sin,
4
- moveaxis, abs, arctan, complex64, float32)
1
+ import math
2
+
3
+ from numpy import (zeros_like, array, tan, arange, floor,
4
+ r_, atleast_1d, greater, cos, add, sin,
5
+ moveaxis, abs, complex64, float32)
5
6
  import numpy as np
6
7
 
8
+ from scipy._lib._array_api import array_namespace, xp_promote
9
+
7
10
  from scipy._lib._util import normalize_axis_index
8
11
 
9
12
  # From splinemodule.c
@@ -57,6 +60,9 @@ def spline_filter(Iin, lmbda=5.0):
57
60
  >>> plt.show()
58
61
 
59
62
  """
63
+ xp = array_namespace(Iin)
64
+ Iin = np.asarray(Iin)
65
+
60
66
  if Iin.dtype not in [np.float32, np.float64, np.complex64, np.complex128]:
61
67
  raise TypeError(f"Invalid data type for Iin: {Iin.dtype = }")
62
68
 
@@ -73,7 +79,7 @@ def spline_filter(Iin, lmbda=5.0):
73
79
  ck = cspline2d(Iin, lmbda)
74
80
  out = sepfir2d(ck, hcol, hcol)
75
81
  out = out.astype(intype)
76
- return out
82
+ return xp.asarray(out)
77
83
 
78
84
 
79
85
  _splinefunc_cache = {}
@@ -124,32 +130,37 @@ def gauss_spline(x, n):
124
130
  array([0.15418033, 0.6909883, 0.15418033]) # may vary
125
131
 
126
132
  """
127
- x = asarray(x)
133
+ xp = array_namespace(x)
134
+ x = xp.asarray(x)
128
135
  signsq = (n + 1) / 12.0
129
- return 1 / sqrt(2 * pi * signsq) * exp(-x ** 2 / 2 / signsq)
136
+ return 1 / math.sqrt(2 * math.pi * signsq) * xp.exp(-x ** 2 / 2 / signsq)
130
137
 
131
138
 
132
139
  def _cubic(x):
133
- x = asarray(x, dtype=float)
140
+ xp = array_namespace(x)
141
+
142
+ x = np.asarray(x, dtype=float)
134
143
  b = BSpline.basis_element([-2, -1, 0, 1, 2], extrapolate=False)
135
144
  out = b(x)
136
145
  out[(x < -2) | (x > 2)] = 0
137
- return out
146
+ return xp.asarray(out)
138
147
 
139
148
 
140
149
  def _quadratic(x):
141
- x = abs(asarray(x, dtype=float))
150
+ xp = array_namespace(x)
151
+
152
+ x = abs(np.asarray(x, dtype=float))
142
153
  b = BSpline.basis_element([-1.5, -0.5, 0.5, 1.5], extrapolate=False)
143
154
  out = b(x)
144
155
  out[(x < -1.5) | (x > 1.5)] = 0
145
- return out
156
+ return xp.asarray(out)
146
157
 
147
158
 
148
159
  def _coeff_smooth(lam):
149
- xi = 1 - 96 * lam + 24 * lam * sqrt(3 + 144 * lam)
150
- omeg = arctan2(sqrt(144 * lam - 1), sqrt(xi))
151
- rho = (24 * lam - 1 - sqrt(xi)) / (24 * lam)
152
- rho = rho * sqrt((48 * lam + 24 * lam * sqrt(3 + 144 * lam)) / xi)
160
+ xi = 1 - 96 * lam + 24 * lam * math.sqrt(3 + 144 * lam)
161
+ omeg = math.atan2(math.sqrt(144 * lam - 1), math.sqrt(xi))
162
+ rho = (24 * lam - 1 - math.sqrt(xi)) / (24 * lam)
163
+ rho = rho * math.sqrt((48 * lam + 24 * lam * math.sqrt(3 + 144 * lam)) / xi)
153
164
  return rho, omeg
154
165
 
155
166
 
@@ -167,6 +178,8 @@ def _hs(k, cs, rho, omega):
167
178
 
168
179
 
169
180
  def _cubic_smooth_coeff(signal, lamb):
181
+ signal = np.asarray(signal)
182
+
170
183
  rho, omega = _coeff_smooth(lamb)
171
184
  cs = 1 - 2 * rho * cos(omega) + rho * rho
172
185
  K = len(signal)
@@ -209,9 +222,11 @@ def _cubic_smooth_coeff(signal, lamb):
209
222
 
210
223
 
211
224
  def _cubic_coeff(signal):
212
- zi = -2 + sqrt(3)
225
+ signal = np.asarray(signal)
226
+
227
+ zi = -2 + math.sqrt(3)
213
228
  K = len(signal)
214
- powers = zi ** arange(K)
229
+ powers = zi ** np.arange(K)
215
230
 
216
231
  if K == 1:
217
232
  yplus = signal[0] + zi * add.reduce(powers * signal)
@@ -223,10 +238,10 @@ def _cubic_coeff(signal):
223
238
  # for k in range(1, K):
224
239
  # yplus[k] = signal[k] + zi * yplus[k - 1]
225
240
 
226
- state = lfiltic(1, r_[1, -zi], atleast_1d(add.reduce(powers * signal)))
241
+ state = lfiltic(1, np.r_[1, -zi], np.atleast_1d(add.reduce(powers * signal)))
227
242
 
228
- b = ones(1)
229
- a = r_[1, -zi]
243
+ b = np.ones(1)
244
+ a = np.r_[1, -zi]
230
245
  yplus, _ = lfilter(b, a, signal, zi=state)
231
246
 
232
247
  # Reverse filter:
@@ -234,21 +249,23 @@ def _cubic_coeff(signal):
234
249
  # for k in range(K - 2, -1, -1):
235
250
  # output[k] = zi * (output[k + 1] - yplus[k])
236
251
  out_last = zi / (zi - 1) * yplus[K - 1]
237
- state = lfiltic(-zi, r_[1, -zi], atleast_1d(out_last))
252
+ state = lfiltic(-zi, r_[1, -zi], np.atleast_1d(out_last))
238
253
 
239
- b = asarray([-zi])
254
+ b = np.asarray([-zi])
240
255
  output, _ = lfilter(b, a, yplus[-2::-1], zi=state)
241
- output = r_[output[::-1], out_last]
256
+ output = np.r_[output[::-1], out_last]
242
257
  return output * 6.0
243
258
 
244
259
 
245
260
  def _quadratic_coeff(signal):
246
- zi = -3 + 2 * sqrt(2.0)
261
+ signal = np.asarray(signal)
262
+
263
+ zi = -3 + 2 * math.sqrt(2.0)
247
264
  K = len(signal)
248
- powers = zi ** arange(K)
265
+ powers = zi ** np.arange(K)
249
266
 
250
267
  if K == 1:
251
- yplus = signal[0] + zi * add.reduce(powers * signal)
268
+ yplus = signal[0] + zi * np.add.reduce(powers * signal)
252
269
  output = zi / (zi - 1) * yplus
253
270
  return atleast_1d(output)
254
271
 
@@ -257,10 +274,10 @@ def _quadratic_coeff(signal):
257
274
  # for k in range(1, K):
258
275
  # yplus[k] = signal[k] + zi * yplus[k - 1]
259
276
 
260
- state = lfiltic(1, r_[1, -zi], atleast_1d(add.reduce(powers * signal)))
277
+ state = lfiltic(1, np.r_[1, -zi], np.atleast_1d(np.add.reduce(powers * signal)))
261
278
 
262
- b = ones(1)
263
- a = r_[1, -zi]
279
+ b = np.ones(1)
280
+ a = np.r_[1, -zi]
264
281
  yplus, _ = lfilter(b, a, signal, zi=state)
265
282
 
266
283
  # Reverse filter:
@@ -268,21 +285,21 @@ def _quadratic_coeff(signal):
268
285
  # for k in range(K - 2, -1, -1):
269
286
  # output[k] = zi * (output[k + 1] - yplus[k])
270
287
  out_last = zi / (zi - 1) * yplus[K - 1]
271
- state = lfiltic(-zi, r_[1, -zi], atleast_1d(out_last))
288
+ state = lfiltic(-zi, r_[1, -zi], np.atleast_1d(out_last))
272
289
 
273
- b = asarray([-zi])
290
+ b = np.asarray([-zi])
274
291
  output, _ = lfilter(b, a, yplus[-2::-1], zi=state)
275
- output = r_[output[::-1], out_last]
292
+ output = np.r_[output[::-1], out_last]
276
293
  return output * 8.0
277
294
 
278
295
 
279
296
  def compute_root_from_lambda(lamb):
280
- tmp = sqrt(3 + 144 * lamb)
297
+ tmp = math.sqrt(3 + 144 * lamb)
281
298
  xi = 1 - 96 * lamb + 24 * lamb * tmp
282
- omega = arctan(sqrt((144 * lamb - 1.0) / xi))
283
- tmp2 = sqrt(xi)
299
+ omega = math.atan(math.sqrt((144 * lamb - 1.0) / xi))
300
+ tmp2 = math.sqrt(xi)
284
301
  r = ((24 * lamb - 1 - tmp2) / (24 * lamb) *
285
- sqrt(48*lamb + 24 * lamb * tmp) / tmp2)
302
+ math.sqrt(48*lamb + 24 * lamb * tmp) / tmp2)
286
303
  return r, omega
287
304
 
288
305
 
@@ -330,10 +347,13 @@ def cspline1d(signal, lamb=0.0):
330
347
  >>> plt.show()
331
348
 
332
349
  """
350
+ xp = array_namespace(signal)
351
+
333
352
  if lamb != 0.0:
334
- return _cubic_smooth_coeff(signal, lamb)
353
+ ret = _cubic_smooth_coeff(signal, lamb)
335
354
  else:
336
- return _cubic_coeff(signal)
355
+ ret = _cubic_coeff(signal)
356
+ return xp.asarray(ret)
337
357
 
338
358
 
339
359
  def qspline1d(signal, lamb=0.0):
@@ -381,10 +401,12 @@ def qspline1d(signal, lamb=0.0):
381
401
  >>> plt.show()
382
402
 
383
403
  """
404
+ xp = array_namespace(signal)
405
+
384
406
  if lamb != 0.0:
385
407
  raise ValueError("Smoothing quadratic splines not supported yet.")
386
408
  else:
387
- return _quadratic_coeff(signal)
409
+ return xp.asarray(_quadratic_coeff(signal))
388
410
 
389
411
 
390
412
  def collapse_2d(x, axis):
@@ -445,7 +467,7 @@ def qspline2d(signal, lamb=0.0, precision=-1.0):
445
467
  raise ValueError('lambda must be negative or zero')
446
468
 
447
469
  # normal quadratic spline
448
- r = -3 + 2 * sqrt(2.0)
470
+ r = -3 + 2 * math.sqrt(2.0)
449
471
  c0 = -r * 8.0
450
472
  z1 = r
451
473
 
@@ -476,15 +498,18 @@ def cspline2d(signal, lamb=0.0, precision=-1.0):
476
498
  output : ndarray
477
499
  The filtered signal.
478
500
  """
501
+ xp = array_namespace(signal)
502
+ signal = np.asarray(signal)
503
+
479
504
  if precision < 0.0 or precision >= 1.0:
480
- if signal.dtype in [float32, complex64]:
505
+ if signal.dtype in [np.float32, np.complex64]:
481
506
  precision = 1e-3
482
507
  else:
483
508
  precision = 1e-6
484
509
 
485
510
  if lamb <= 1 / 144.0:
486
511
  # Normal cubic spline
487
- r = -2 + sqrt(3.0)
512
+ r = -2 + math.sqrt(3.0)
488
513
  out = symiirorder_nd(
489
514
  symiirorder1, signal, -r * 6.0, r, precision=precision, axis=-1)
490
515
  out = symiirorder_nd(
@@ -496,7 +521,7 @@ def cspline2d(signal, lamb=0.0, precision=-1.0):
496
521
  precision=precision, axis=-1)
497
522
  out = symiirorder_nd(symiirorder2, out, r, omega,
498
523
  precision=precision, axis=0)
499
- return out
524
+ return xp.asarray(out)
500
525
 
501
526
 
502
527
  def cspline1d_eval(cj, newx, dx=1.0, x0=0):
@@ -549,10 +574,17 @@ def cspline1d_eval(cj, newx, dx=1.0, x0=0):
549
574
  >>> plt.show()
550
575
 
551
576
  """
552
- newx = (asarray(newx) - x0) / float(dx)
577
+ xp = array_namespace(cj, newx)
578
+
579
+ newx = (np.asarray(newx) - x0) / float(dx)
580
+ cj = np.asarray(cj)
581
+
582
+ if cj.size == 0:
583
+ raise ValueError("Spline coefficients 'cj' must not be empty.")
584
+
553
585
  res = zeros_like(newx, dtype=cj.dtype)
554
586
  if res.size == 0:
555
- return res
587
+ return xp.asarray(res)
556
588
  N = len(cj)
557
589
  cond1 = newx < 0
558
590
  cond2 = newx > (N - 1)
@@ -562,7 +594,7 @@ def cspline1d_eval(cj, newx, dx=1.0, x0=0):
562
594
  res[cond2] = cspline1d_eval(cj, 2 * (N - 1) - newx[cond2])
563
595
  newx = newx[cond3]
564
596
  if newx.size == 0:
565
- return res
597
+ return xp.asarray(res)
566
598
  result = zeros_like(newx, dtype=cj.dtype)
567
599
  jlower = floor(newx - 2).astype(int) + 1
568
600
  for i in range(4):
@@ -570,7 +602,7 @@ def cspline1d_eval(cj, newx, dx=1.0, x0=0):
570
602
  indj = thisj.clip(0, N - 1) # handle edge cases
571
603
  result += cj[indj] * _cubic(newx - thisj)
572
604
  res[cond3] = result
573
- return res
605
+ return xp.asarray(res)
574
606
 
575
607
 
576
608
  def qspline1d_eval(cj, newx, dx=1.0, x0=0):
@@ -625,10 +657,17 @@ def qspline1d_eval(cj, newx, dx=1.0, x0=0):
625
657
  >>> plt.show()
626
658
 
627
659
  """
628
- newx = (asarray(newx) - x0) / dx
629
- res = zeros_like(newx)
660
+ xp = array_namespace(newx, cj)
661
+
662
+ newx = (np.asarray(newx) - x0) / dx
663
+ res = np.zeros_like(newx)
630
664
  if res.size == 0:
631
- return res
665
+ return xp.asarray(res)
666
+
667
+ cj = np.asarray(cj)
668
+ if cj.size == 0:
669
+ raise ValueError("Spline coefficients 'cj' must not be empty.")
670
+
632
671
  N = len(cj)
633
672
  cond1 = newx < 0
634
673
  cond2 = newx > (N - 1)
@@ -638,7 +677,7 @@ def qspline1d_eval(cj, newx, dx=1.0, x0=0):
638
677
  res[cond2] = qspline1d_eval(cj, 2 * (N - 1) - newx[cond2])
639
678
  newx = newx[cond3]
640
679
  if newx.size == 0:
641
- return res
680
+ return xp.asarray(res)
642
681
  result = zeros_like(newx)
643
682
  jlower = floor(newx - 1.5).astype(int) + 1
644
683
  for i in range(3):
@@ -646,7 +685,7 @@ def qspline1d_eval(cj, newx, dx=1.0, x0=0):
646
685
  indj = thisj.clip(0, N - 1) # handle edge cases
647
686
  result += cj[indj] * _quadratic(newx - thisj)
648
687
  res[cond3] = result
649
- return res
688
+ return xp.asarray(res)
650
689
 
651
690
 
652
691
  def symiirorder1(signal, c0, z1, precision=-1.0):
@@ -680,7 +719,12 @@ def symiirorder1(signal, c0, z1, precision=-1.0):
680
719
  output : ndarray
681
720
  The filtered signal.
682
721
  """
683
- if np.abs(z1) >= 1:
722
+ xp = array_namespace(signal)
723
+ signal = xp_promote(signal, force_floating=True, xp=xp)
724
+ # This function uses C internals
725
+ signal = np.asarray(signal)
726
+
727
+ if abs(z1) >= 1:
684
728
  raise ValueError('|z1| must be less than 1.0')
685
729
 
686
730
  if signal.ndim > 2:
@@ -691,9 +735,6 @@ def symiirorder1(signal, c0, z1, precision=-1.0):
691
735
  signal = signal[None, :]
692
736
  squeeze_dim = True
693
737
 
694
- if np.issubdtype(signal.dtype, np.integer):
695
- signal = signal.astype(np.promote_types(signal.dtype, np.float32))
696
-
697
738
  y0 = symiirorder1_ic(signal, z1, precision)
698
739
 
699
740
  # Apply first the system 1 / (1 - z1 * z^-1)
@@ -722,7 +763,7 @@ def symiirorder1(signal, c0, z1, precision=-1.0):
722
763
  if squeeze_dim:
723
764
  out = out[0]
724
765
 
725
- return out
766
+ return xp.asarray(out)
726
767
 
727
768
 
728
769
  def symiirorder2(input, r, omega, precision=-1.0):
@@ -758,28 +799,27 @@ def symiirorder2(input, r, omega, precision=-1.0):
758
799
  output : ndarray
759
800
  The filtered signal.
760
801
  """
802
+ xp = array_namespace(input)
803
+ input = xp_promote(input, force_floating=True, xp=xp)
804
+ # This function uses C internals
805
+ input = np.ascontiguousarray(input)
806
+
761
807
  if r >= 1.0:
762
808
  raise ValueError('r must be less than 1.0')
763
809
 
764
810
  if input.ndim > 2:
765
811
  raise ValueError('Input must be 1D or 2D')
766
812
 
767
- if not input.flags.c_contiguous:
768
- input = input.copy()
769
-
770
813
  squeeze_dim = False
771
814
  if input.ndim == 1:
772
815
  input = input[None, :]
773
816
  squeeze_dim = True
774
817
 
775
- if np.issubdtype(input.dtype, np.integer):
776
- input = input.astype(np.promote_types(input.dtype, np.float32))
777
-
778
818
  rsq = r * r
779
- a2 = 2 * r * np.cos(omega)
819
+ a2 = 2 * r * math.cos(omega)
780
820
  a3 = -rsq
781
- cs = np.atleast_1d(1 - 2 * r * np.cos(omega) + rsq)
782
- sos = np.atleast_2d(np.r_[cs, 0, 0, 1, -a2, -a3]).astype(input.dtype)
821
+ cs = 1 - 2 * r * math.cos(omega) + rsq
822
+ sos = np.asarray([cs, 0, 0, 1, -a2, -a3], dtype=input.dtype)
783
823
 
784
824
  # Find the starting (forward) conditions.
785
825
  ic_fwd = symiirorder2_ic_fwd(input, r, omega, precision)
@@ -787,7 +827,7 @@ def symiirorder2(input, r, omega, precision=-1.0):
787
827
  # Apply first the system cs / (1 - a2 * z^-1 - a3 * z^-2)
788
828
  # Compute the initial conditions in the form expected by sosfilt
789
829
  # coef = np.asarray([[a3, a2], [0, a3]], dtype=input.dtype)
790
- coef = np.r_[a3, a2, 0, a3].reshape(2, 2).astype(input.dtype)
830
+ coef = np.asarray([[a3, a2], [0, a3]], dtype=input.dtype)
791
831
  zi = np.matmul(coef, ic_fwd[:, :, None])[:, :, 0]
792
832
 
793
833
  y_fwd, _ = sosfilt(sos, axis_slice(input, 2), zi=zi[None])
@@ -805,4 +845,4 @@ def symiirorder2(input, r, omega, precision=-1.0):
805
845
  if squeeze_dim:
806
846
  out = out[0]
807
847
 
808
- return out
848
+ return xp.asarray(out)
@@ -0,0 +1,73 @@
1
+ import functools
2
+ from scipy._lib._array_api import (
3
+ is_cupy, is_jax, scipy_namespace_for, SCIPY_ARRAY_API
4
+ )
5
+
6
+ from ._signal_api import * # noqa: F403
7
+ from . import _signal_api
8
+ from . import _delegators
9
+ __all__ = _signal_api.__all__
10
+
11
+
12
+ MODULE_NAME = 'signal'
13
+
14
+ # jax.scipy.signal has only partial coverage of scipy.signal, so we keep the list
15
+ # of functions we can delegate to JAX
16
+ # https://jax.readthedocs.io/en/latest/jax.scipy.html
17
+ JAX_SIGNAL_FUNCS = [
18
+ 'fftconvolve', 'convolve', 'convolve2d', 'correlate', 'correlate2d',
19
+ 'csd', 'detrend', 'istft', 'welch'
20
+ ]
21
+
22
+ # some cupyx.scipy.signal functions are incompatible with their scipy counterparts
23
+ CUPY_BLACKLIST = ['lfilter_zi', 'sosfilt_zi', 'get_window', 'envelope', 'remez']
24
+
25
+ # freqz_sos is a sosfreqz rename, and cupy does not have the new name yet (in v13.x)
26
+ CUPY_RENAMES = {'freqz_sos': 'sosfreqz'}
27
+
28
+
29
+ def delegate_xp(delegator, module_name):
30
+ def inner(func):
31
+ @functools.wraps(func)
32
+ def wrapper(*args, **kwds):
33
+ try:
34
+ xp = delegator(*args, **kwds)
35
+ except TypeError:
36
+ # object arrays
37
+ import numpy as np
38
+ xp = np
39
+
40
+ # try delegating to a cupyx/jax namesake
41
+ if is_cupy(xp) and func.__name__ not in CUPY_BLACKLIST:
42
+ func_name = CUPY_RENAMES.get(func.__name__, func.__name__)
43
+
44
+ # https://github.com/cupy/cupy/issues/8336
45
+ import importlib
46
+ cupyx_module = importlib.import_module(f"cupyx.scipy.{module_name}")
47
+ cupyx_func = getattr(cupyx_module, func_name)
48
+ return cupyx_func(*args, **kwds)
49
+ elif is_jax(xp) and func.__name__ in JAX_SIGNAL_FUNCS:
50
+ spx = scipy_namespace_for(xp)
51
+ jax_module = getattr(spx, module_name)
52
+ jax_func = getattr(jax_module, func.__name__)
53
+ return jax_func(*args, **kwds)
54
+ else:
55
+ # the original function
56
+ return func(*args, **kwds)
57
+ return wrapper
58
+ return inner
59
+
60
+
61
+
62
+ # ### decorate ###
63
+ for obj_name in _signal_api.__all__:
64
+ bare_obj = getattr(_signal_api, obj_name)
65
+ delegator = getattr(_delegators, obj_name + "_signature", None)
66
+
67
+ if SCIPY_ARRAY_API and delegator is not None:
68
+ f = delegate_xp(delegator, MODULE_NAME)(bare_obj)
69
+ else:
70
+ f = bare_obj
71
+
72
+ # add the decorated function to the namespace, to be imported in __init__.py
73
+ vars()[obj_name] = f
scipy/signal/_upfirdn.py CHANGED
@@ -33,6 +33,7 @@
33
33
 
34
34
  import numpy as np
35
35
 
36
+ from scipy._lib._array_api import array_namespace
36
37
  from ._upfirdn_apply import _output_len, _apply, mode_enum
37
38
 
38
39
  __all__ = ['upfirdn', '_output_len']
@@ -210,7 +211,9 @@ def upfirdn(h, x, up=1, down=1, axis=-1, mode='constant', cval=0):
210
211
  [ 6., 7.],
211
212
  [ 6., 7.]])
212
213
  """
214
+ xp = array_namespace(h, x)
215
+
213
216
  x = np.asarray(x)
214
217
  ufd = _UpFIRDn(h, x.dtype, up, down)
215
218
  # This is equivalent to (but faster than) using np.apply_along_axis
216
- return ufd.apply_filter(x, axis, mode, cval)
219
+ return xp.asarray(ufd.apply_filter(x, axis, mode, cval))
@@ -55,11 +55,7 @@ def sawtooth(t, width=1):
55
55
  t, w = asarray(t), asarray(width)
56
56
  w = asarray(w + (t - t))
57
57
  t = asarray(t + (w - w))
58
- if t.dtype.char in ['fFdD']:
59
- ytype = t.dtype.char
60
- else:
61
- ytype = 'd'
62
- y = zeros(t.shape, ytype)
58
+ y = zeros(t.shape, dtype="d")
63
59
 
64
60
  # width must be between 0 and 1 inclusive
65
61
  mask1 = (w > 1) | (w < 0)
@@ -137,12 +133,7 @@ def square(t, duty=0.5):
137
133
  t, w = asarray(t), asarray(duty)
138
134
  w = asarray(w + (t - t))
139
135
  t = asarray(t + (w - w))
140
- if t.dtype.char in ['fFdD']:
141
- ytype = t.dtype.char
142
- else:
143
- ytype = 'd'
144
-
145
- y = zeros(t.shape, ytype)
136
+ y = zeros(t.shape, dtype="d")
146
137
 
147
138
  # width must be between 0 and 1 inclusive
148
139
  mask1 = (w > 1) | (w < 0)
scipy/signal/_wavelets.py CHANGED
@@ -1,5 +1,5 @@
1
1
  import numpy as np
2
- from scipy.signal import convolve
2
+ from scipy.signal._signaltools import convolve
3
3
 
4
4
 
5
5
  def _ricker(points, a):
@@ -7,6 +7,7 @@ from scipy._lib.deprecation import _sub_module_deprecation
7
7
  __all__ = [ # noqa: F822
8
8
  'kaiser_beta', 'kaiser_atten', 'kaiserord',
9
9
  'firwin', 'firwin2', 'remez', 'firls', 'minimum_phase',
10
+ 'firwin_2d',
10
11
  ]
11
12
 
12
13
 
scipy/signal/spline.py CHANGED
@@ -2,9 +2,8 @@
2
2
  # versions of SciPy. Use the `scipy.signal` namespace for importing the
3
3
  # functions included below.
4
4
 
5
- import warnings
5
+ from scipy._lib.deprecation import _sub_module_deprecation
6
6
 
7
- from . import _spline
8
7
 
9
8
  __all__ = ['sepfir2d'] # noqa: F822
10
9
 
@@ -14,12 +13,6 @@ def __dir__():
14
13
 
15
14
 
16
15
  def __getattr__(name):
17
- if name not in __all__:
18
- raise AttributeError(
19
- f"scipy.signal.spline is deprecated and has no attribute {name}. "
20
- "Try looking in scipy.signal instead.")
21
-
22
- warnings.warn(f"Please use `{name}` from the `scipy.signal` namespace, "
23
- "the `scipy.signal.spline` namespace is deprecated.",
24
- category=DeprecationWarning, stacklevel=2)
25
- return getattr(_spline, name)
16
+ return _sub_module_deprecation(sub_package="signal", module="spline",
17
+ private_modules=["_spline"], all=__all__,
18
+ attribute=name)