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
@@ -7,10 +7,8 @@ import pytest
7
7
  from scipy.fft._fftlog import fht, ifht, fhtoffset
8
8
  from scipy.special import poch
9
9
 
10
- from scipy.conftest import array_api_compatible
11
- from scipy._lib._array_api import xp_assert_close, xp_assert_less, array_namespace
10
+ from scipy._lib._array_api import xp_assert_close, xp_assert_less
12
11
 
13
- pytestmark = [array_api_compatible, pytest.mark.usefixtures("skip_xp_backends"),]
14
12
  skip_xp_backends = pytest.mark.skip_xp_backends
15
13
 
16
14
 
@@ -25,7 +23,7 @@ def test_fht_agrees_with_fftlog(xp):
25
23
 
26
24
  r = np.logspace(-4, 4, 16)
27
25
 
28
- dln = np.log(r[1]/r[0])
26
+ dln = math.log(r[1]/r[0])
29
27
  mu = 0.3
30
28
  offset = 0.0
31
29
  bias = 0.0
@@ -62,6 +60,10 @@ def test_fht_agrees_with_fftlog(xp):
62
60
  # test 3: positive bias
63
61
  bias = 0.8
64
62
  offset = fhtoffset(dln, mu, bias=bias)
63
+ # offset is a np.float64, which array-api-strict disallows
64
+ # even if it's technically a subclass of float
65
+ offset = float(offset)
66
+
65
67
  ours = fht(a, dln, mu, offset=offset, bias=bias)
66
68
  theirs = [-7.3436673558316850E+00, +0.1710271207817100E+00,
67
69
  +0.1065374386206564E+00, -0.5121739602708132E-01,
@@ -77,6 +79,8 @@ def test_fht_agrees_with_fftlog(xp):
77
79
  # test 4: negative bias
78
80
  bias = -0.8
79
81
  offset = fhtoffset(dln, mu, bias=bias)
82
+ offset = float(offset)
83
+
80
84
  ours = fht(a, dln, mu, offset=offset, bias=bias)
81
85
  theirs = [+0.8985777068568745E-05, +0.4074898209936099E-04,
82
86
  +0.2123969254700955E-03, +0.1009558244834628E-02,
@@ -103,6 +107,9 @@ def test_fht_identity(n, bias, offset, optimal, xp):
103
107
 
104
108
  if optimal:
105
109
  offset = fhtoffset(dln, mu, initial=offset, bias=bias)
110
+ # offset is a np.float64, which array-api-strict disallows
111
+ # even if it's technically a subclass of float
112
+ offset = float(offset)
106
113
 
107
114
  A = fht(a, dln, mu, offset=offset, bias=bias)
108
115
  a_ = ifht(A, dln, mu, offset=offset, bias=bias)
@@ -163,9 +170,12 @@ def test_fht_exact(n, xp):
163
170
  r = np.logspace(-2, 2, n)
164
171
  a = xp.asarray(r**gamma)
165
172
 
166
- dln = np.log(r[1]/r[0])
173
+ dln = math.log(r[1]/r[0])
167
174
 
168
175
  offset = fhtoffset(dln, mu, initial=0.0, bias=gamma)
176
+ # offset is a np.float64, which array-api-strict disallows
177
+ # even if it's technically a subclass of float
178
+ offset = float(offset)
169
179
 
170
180
  A = fht(a, dln, mu, offset=offset, bias=gamma)
171
181
 
@@ -188,13 +198,12 @@ def test_array_like(xp, op):
188
198
  @pytest.mark.parametrize('n', [128, 129])
189
199
  def test_gh_21661(xp, n):
190
200
  one = xp.asarray(1.0)
191
- xp_test = array_namespace(one)
192
201
  mu = 0.0
193
202
  r = np.logspace(-7, 1, n)
194
203
  dln = math.log(r[1] / r[0])
195
204
  offset = fhtoffset(dln, initial=-6 * np.log(10), mu=mu)
196
205
  r = xp.asarray(r, dtype=one.dtype)
197
- k = math.exp(offset) / xp_test.flip(r, axis=-1)
206
+ k = math.exp(offset) / xp.flip(r, axis=-1)
198
207
 
199
208
  def f(x, mu):
200
209
  return x**(mu + 1)*xp.exp(-x**2/2)
@@ -10,13 +10,9 @@ from pytest import raises as assert_raises
10
10
  import pytest
11
11
  import numpy as np
12
12
  import sys
13
- from scipy.conftest import array_api_compatible
14
- from scipy._lib._array_api import (
15
- xp_assert_close, get_xp_devices, xp_device, array_namespace
16
- )
13
+ from scipy._lib._array_api import xp_assert_close, xp_device
17
14
  from scipy import fft
18
15
 
19
- pytestmark = [array_api_compatible, pytest.mark.usefixtures("skip_xp_backends")]
20
16
  skip_xp_backends = pytest.mark.skip_xp_backends
21
17
 
22
18
  _5_smooth_numbers = [
@@ -26,7 +22,8 @@ _5_smooth_numbers = [
26
22
  2**3 * 3**3 * 5**2,
27
23
  ]
28
24
 
29
- def test_next_fast_len():
25
+ @skip_xp_backends(np_only=True)
26
+ def test_next_fast_len(xp):
30
27
  for n in _5_smooth_numbers:
31
28
  assert_equal(next_fast_len(n), n)
32
29
 
@@ -56,7 +53,7 @@ def _assert_n_smooth(x, n):
56
53
  @skip_xp_backends(np_only=True)
57
54
  class TestNextFastLen:
58
55
 
59
- def test_next_fast_len(self):
56
+ def test_next_fast_len(self, xp):
60
57
  np.random.seed(1234)
61
58
 
62
59
  def nums():
@@ -71,14 +68,14 @@ class TestNextFastLen:
71
68
  m = next_fast_len(n, True)
72
69
  _assert_n_smooth(m, 5)
73
70
 
74
- def test_np_integers(self):
71
+ def test_np_integers(self, xp):
75
72
  ITYPES = [np.int16, np.int32, np.int64, np.uint16, np.uint32, np.uint64]
76
73
  for ityp in ITYPES:
77
74
  x = ityp(12345)
78
75
  testN = next_fast_len(x)
79
76
  assert_equal(testN, next_fast_len(int(x)))
80
77
 
81
- def testnext_fast_len_small(self):
78
+ def testnext_fast_len_small(self, xp):
82
79
  hams = {
83
80
  1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 8, 8: 8, 14: 15, 15: 15,
84
81
  16: 16, 17: 18, 1021: 1024, 1536: 1536, 51200000: 51200000
@@ -89,7 +86,7 @@ class TestNextFastLen:
89
86
  @pytest.mark.xfail(sys.maxsize < 2**32,
90
87
  reason="Hamming Numbers too large for 32-bit",
91
88
  raises=ValueError, strict=True)
92
- def testnext_fast_len_big(self):
89
+ def testnext_fast_len_big(self, xp):
93
90
  hams = {
94
91
  510183360: 510183360, 510183360 + 1: 512000000,
95
92
  511000000: 512000000,
@@ -123,14 +120,14 @@ class TestNextFastLen:
123
120
  for x, y in hams.items():
124
121
  assert_equal(next_fast_len(x, True), y)
125
122
 
126
- def test_keyword_args(self):
123
+ def test_keyword_args(self, xp):
127
124
  assert next_fast_len(11, real=True) == 12
128
125
  assert next_fast_len(target=7, real=False) == 7
129
126
 
130
127
  @skip_xp_backends(np_only=True)
131
128
  class TestPrevFastLen:
132
129
 
133
- def test_prev_fast_len(self):
130
+ def test_prev_fast_len(self, xp):
134
131
  np.random.seed(1234)
135
132
 
136
133
  def nums():
@@ -145,7 +142,7 @@ class TestPrevFastLen:
145
142
  m = prev_fast_len(n, True)
146
143
  _assert_n_smooth(m, 5)
147
144
 
148
- def test_np_integers(self):
145
+ def test_np_integers(self, xp):
149
146
  ITYPES = [np.int16, np.int32, np.int64, np.uint16, np.uint32,
150
147
  np.uint64]
151
148
  for ityp in ITYPES:
@@ -156,7 +153,7 @@ class TestPrevFastLen:
156
153
  testN = prev_fast_len(x, real=True)
157
154
  assert_equal(testN, prev_fast_len(int(x), real=True))
158
155
 
159
- def testprev_fast_len_small(self):
156
+ def testprev_fast_len_small(self, xp):
160
157
  hams = {
161
158
  1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 6, 8: 8, 14: 12, 15: 15,
162
159
  16: 16, 17: 16, 1021: 1000, 1536: 1536, 51200000: 51200000
@@ -176,7 +173,7 @@ class TestPrevFastLen:
176
173
  @pytest.mark.xfail(sys.maxsize < 2**32,
177
174
  reason="Hamming Numbers too large for 32-bit",
178
175
  raises=ValueError, strict=True)
179
- def testprev_fast_len_big(self):
176
+ def testprev_fast_len_big(self, xp):
180
177
  hams = {
181
178
  # 2**6 * 3**13 * 5**1
182
179
  510183360: 510183360,
@@ -238,7 +235,7 @@ class TestPrevFastLen:
238
235
  for x, y in hams.items():
239
236
  assert_equal(prev_fast_len(x, True), y)
240
237
 
241
- def test_keyword_args(self):
238
+ def test_keyword_args(self, xp):
242
239
  assert prev_fast_len(11, real=True) == 10
243
240
  assert prev_fast_len(target=7, real=False) == 7
244
241
 
@@ -508,12 +505,7 @@ class TestFFTShift:
508
505
  xp_assert_close(fft.ifftshift(shift_dim_both), freqs)
509
506
 
510
507
 
511
- @skip_xp_backends("cupy",
512
- reason="CuPy has not implemented the `device` param")
513
- @skip_xp_backends("jax.numpy",
514
- reason="JAX has not implemented the `device` param")
515
508
  class TestFFTFreq:
516
-
517
509
  def test_definition(self, xp):
518
510
  x = xp.asarray([0, 1, 2, 3, 4, -4, -3, -2, -1], dtype=xp.float64)
519
511
  x2 = xp.asarray([0, 1, 2, 3, 4, -5, -4, -3, -2, -1], dtype=xp.float64)
@@ -532,19 +524,13 @@ class TestFFTFreq:
532
524
  y = 10 * xp.pi * fft.fftfreq(10, xp.pi, xp=xp)
533
525
  xp_assert_close(y, x2, check_dtype=False)
534
526
 
535
- def test_device(self, xp):
536
- xp_test = array_namespace(xp.empty(0))
537
- devices = get_xp_devices(xp)
527
+ def test_device(self, xp, devices):
538
528
  for d in devices:
539
529
  y = fft.fftfreq(9, xp=xp, device=d)
540
- x = xp_test.empty(0, device=d)
530
+ x = xp.empty(0, device=d)
541
531
  assert xp_device(y) == xp_device(x)
542
532
 
543
533
 
544
- @skip_xp_backends("cupy",
545
- reason="CuPy has not implemented the `device` param")
546
- @skip_xp_backends("jax.numpy",
547
- reason="JAX has not implemented the `device` param")
548
534
  class TestRFFTFreq:
549
535
 
550
536
  def test_definition(self, xp):
@@ -552,7 +538,7 @@ class TestRFFTFreq:
552
538
  x2 = xp.asarray([0, 1, 2, 3, 4, 5], dtype=xp.float64)
553
539
 
554
540
  # default dtype varies across backends
555
-
541
+
556
542
  y = 9 * fft.rfftfreq(9, xp=xp)
557
543
  xp_assert_close(y, x, check_dtype=False, check_namespace=True)
558
544
 
@@ -565,10 +551,8 @@ class TestRFFTFreq:
565
551
  y = 10 * xp.pi * fft.rfftfreq(10, xp.pi, xp=xp)
566
552
  xp_assert_close(y, x2, check_dtype=False)
567
553
 
568
- def test_device(self, xp):
569
- xp_test = array_namespace(xp.empty(0))
570
- devices = get_xp_devices(xp)
554
+ def test_device(self, xp, devices):
571
555
  for d in devices:
572
556
  y = fft.rfftfreq(9, xp=xp, device=d)
573
- x = xp_test.empty(0, device=d)
557
+ x = xp.empty(0, device=d)
574
558
  assert xp_device(y) == xp_device(x)
@@ -6,10 +6,8 @@ import math
6
6
  from scipy.fft import dct, idct, dctn, idctn, dst, idst, dstn, idstn
7
7
  import scipy.fft as fft
8
8
  from scipy import fftpack
9
- from scipy.conftest import array_api_compatible
10
9
  from scipy._lib._array_api import xp_copy, xp_assert_close
11
10
 
12
- pytestmark = [array_api_compatible, pytest.mark.usefixtures("skip_xp_backends")]
13
11
  skip_xp_backends = pytest.mark.skip_xp_backends
14
12
 
15
13
  SQRT_2 = math.sqrt(2)
@@ -52,7 +50,7 @@ def test_identity_1d(forward, backward, type, n, axis, norm, orthogonalize, xp):
52
50
  @pytest.mark.parametrize("norm", [None, 'backward', 'ortho', 'forward'])
53
51
  @pytest.mark.parametrize("overwrite_x", [True, False])
54
52
  def test_identity_1d_overwrite(forward, backward, type, dtype, axis, norm,
55
- overwrite_x):
53
+ overwrite_x, xp):
56
54
  # Test the identity f^-1(f(x)) == x
57
55
  x = np.random.rand(7, 8).astype(dtype)
58
56
  x_orig = x.copy()
@@ -130,7 +128,7 @@ def test_identity_nd(forward, backward, type, shape, axes, norm,
130
128
  @pytest.mark.parametrize("norm", [None, 'backward', 'ortho', 'forward'])
131
129
  @pytest.mark.parametrize("overwrite_x", [False, True])
132
130
  def test_identity_nd_overwrite(forward, backward, type, shape, axes, dtype,
133
- norm, overwrite_x):
131
+ norm, overwrite_x, xp):
134
132
  # Test the identity f^-1(f(x)) == x
135
133
 
136
134
  x = np.random.random(shape).astype(dtype)
@@ -193,8 +191,8 @@ def test_orthogonalize_noop(func, type, norm, xp):
193
191
 
194
192
 
195
193
  @skip_xp_backends('jax.numpy',
196
- reason='jax arrays do not support item assignment',
197
- cpu_only=True)
194
+ reason='jax arrays do not support item assignment')
195
+ @skip_xp_backends(cpu_only=True)
198
196
  @pytest.mark.parametrize("norm", ["backward", "ortho", "forward"])
199
197
  def test_orthogonalize_dct1(norm, xp):
200
198
  x = xp.asarray(np.random.rand(100))
@@ -212,8 +210,8 @@ def test_orthogonalize_dct1(norm, xp):
212
210
 
213
211
 
214
212
  @skip_xp_backends('jax.numpy',
215
- reason='jax arrays do not support item assignment',
216
- cpu_only=True)
213
+ reason='jax arrays do not support item assignment')
214
+ @skip_xp_backends(cpu_only=True)
217
215
  @pytest.mark.parametrize("norm", ["backward", "ortho", "forward"])
218
216
  @pytest.mark.parametrize("func", [dct, dst])
219
217
  def test_orthogonalize_dcst2(func, norm, xp):
@@ -226,8 +224,8 @@ def test_orthogonalize_dcst2(func, norm, xp):
226
224
 
227
225
 
228
226
  @skip_xp_backends('jax.numpy',
229
- reason='jax arrays do not support item assignment',
230
- cpu_only=True)
227
+ reason='jax arrays do not support item assignment')
228
+ @skip_xp_backends(cpu_only=True)
231
229
  @pytest.mark.parametrize("norm", ["backward", "ortho", "forward"])
232
230
  @pytest.mark.parametrize("func", [dct, dst])
233
231
  def test_orthogonalize_dcst3(func, norm, xp):
@@ -350,10 +350,8 @@ class _TestIRFFTBase:
350
350
  y2 = rfft(irfft(x))
351
351
  assert_equal(y1.dtype, self.rdt)
352
352
  assert_equal(y2.dtype, self.rdt)
353
- assert_array_almost_equal(y1, x, decimal=self.ndec,
354
- err_msg="size=%d" % size)
355
- assert_array_almost_equal(y2, x, decimal=self.ndec,
356
- err_msg="size=%d" % size)
353
+ assert_array_almost_equal(y1, x, decimal=self.ndec, err_msg=f"size={size}")
354
+ assert_array_almost_equal(y2, x, decimal=self.ndec, err_msg=f"size={size}")
357
355
 
358
356
  def test_size_accuracy(self):
359
357
  # Sanity check for the accuracy for prime and non-prime sized inputs
@@ -11,8 +11,8 @@ from scipy.fftpack._realtransforms import (
11
11
 
12
12
  # Matlab reference data
13
13
  MDATA = np.load(join(dirname(__file__), 'test.npz'))
14
- X = [MDATA['x%d' % i] for i in range(8)]
15
- Y = [MDATA['y%d' % i] for i in range(8)]
14
+ X = [MDATA[f'x{i}'] for i in range(8)]
15
+ Y = [MDATA[f'y{i}'] for i in range(8)]
16
16
 
17
17
  # FFTW reference data: the data are organized as follows:
18
18
  # * SIZES is an array containing all available sizes
@@ -33,7 +33,7 @@ def fftw_dct_ref(type, size, dt):
33
33
  data = FFTWDATA_SINGLE
34
34
  else:
35
35
  raise ValueError()
36
- y = (data['dct_%d_%d' % (type, size)]).astype(dt)
36
+ y = (data[f'dct_{type}_{size}']).astype(dt)
37
37
  return x, y, dt
38
38
 
39
39
 
@@ -46,7 +46,7 @@ def fftw_dst_ref(type, size, dt):
46
46
  data = FFTWDATA_SINGLE
47
47
  else:
48
48
  raise ValueError()
49
- y = (data['dst_%d_%d' % (type, size)]).astype(dt)
49
+ y = (data[f'dst_{type}_{size}']).astype(dt)
50
50
  return x, y, dt
51
51
 
52
52
 
@@ -208,7 +208,7 @@ class _TestDCTBase:
208
208
  # difference is due to fftw using a better algorithm w.r.t error
209
209
  # propagation compared to the ones from fftpack.
210
210
  assert_array_almost_equal(y / np.max(y), yr / np.max(y), decimal=self.dec,
211
- err_msg="Size %d failed" % i)
211
+ err_msg=f"Size {i} failed")
212
212
 
213
213
  def test_axis(self):
214
214
  nt = 2
@@ -381,8 +381,7 @@ class _TestIDCTBase:
381
381
  # difference is due to fftw using a better algorithm w.r.t error
382
382
  # propagation compared to the ones from fftpack.
383
383
  assert_array_almost_equal(x / np.max(x), xr / np.max(x), decimal=self.dec,
384
- err_msg="Size %d failed" % i)
385
-
384
+ err_msg=f"Size {i} failed")
386
385
 
387
386
  class TestIDCTIDouble(_TestIDCTBase):
388
387
  def setup_method(self):
@@ -487,7 +486,7 @@ class _TestDSTBase:
487
486
  # difference is due to fftw using a better algorithm w.r.t error
488
487
  # propagation compared to the ones from fftpack.
489
488
  assert_array_almost_equal(y / np.max(y), yr / np.max(y), decimal=self.dec,
490
- err_msg="Size %d failed" % i)
489
+ err_msg=f"Size {i} failed")
491
490
 
492
491
 
493
492
  class _TestDSTIBase(_TestDSTBase):
@@ -621,7 +620,7 @@ class _TestIDSTBase:
621
620
  # difference is due to fftw using a better algorithm w.r.t error
622
621
  # propagation compared to the ones from fftpack.
623
622
  assert_array_almost_equal(x / np.max(x), xr / np.max(x), decimal=self.dec,
624
- err_msg="Size %d failed" % i)
623
+ err_msg=f"Size {i} failed")
625
624
 
626
625
 
627
626
  class TestIDSTIDouble(_TestIDSTBase):
scipy/integrate/_bvp.py CHANGED
@@ -402,7 +402,9 @@ def solve_newton(n, m, h, col_fun, bc, jac, y, p, B, bvp_tol, bc_tol):
402
402
  References
403
403
  ----------
404
404
  .. [1] U. Ascher, R. Mattheij and R. Russell "Numerical Solution of
405
- Boundary Value Problems for Ordinary Differential Equations"
405
+ Boundary Value Problems for Ordinary Differential Equations",
406
+ Philidelphia, PA: Society for Industrial and Applied Mathematics,
407
+ 1995.
406
408
  """
407
409
  # We know that the solution residuals at the middle points of the mesh
408
410
  # are connected with collocation residuals r_middle = 1.5 * col_res / h.
@@ -872,9 +874,13 @@ def solve_bvp(fun, bc, x, y, p=None, S=None, fun_jac=None, bc_jac=None,
872
874
  Control and the Maltab PSE", ACM Trans. Math. Softw., Vol. 27,
873
875
  Number 3, pp. 299-316, 2001.
874
876
  .. [2] L.F. Shampine, P. H. Muir and H. Xu, "A User-Friendly Fortran BVP
875
- Solver".
877
+ Solver", J. Numer. Anal., Ind. Appl. Math. (JNAIAM), Vol. 1,
878
+ Number 2, pp. 201-217, 2006.
876
879
  .. [3] U. Ascher, R. Mattheij and R. Russell "Numerical Solution of
877
- Boundary Value Problems for Ordinary Differential Equations".
880
+ Boundary Value Problems for Ordinary Differential Equations",
881
+ Philidelphia, PA: Society for Industrial and Applied Mathematics,
882
+ 1995.
883
+ :doi:`10.1137/1.9781611971231`
878
884
  .. [4] `Cauchy-Riemann equations
879
885
  <https://en.wikipedia.org/wiki/Cauchy-Riemann_equations>`_ on
880
886
  Wikipedia.
@@ -10,7 +10,7 @@ from scipy._lib._array_api import (
10
10
  array_namespace,
11
11
  xp_size,
12
12
  xp_copy,
13
- xp_broadcast_promote
13
+ xp_promote
14
14
  )
15
15
  from scipy._lib._util import MapWrapper
16
16
 
@@ -323,7 +323,8 @@ def cubature(f, a, b, *, rule="gk21", rtol=1e-8, atol=0, max_subdivisions=10000,
323
323
 
324
324
  # Convert a and b to arrays and convert each point in points to an array, promoting
325
325
  # each to a common floating dtype.
326
- a, b, *points = xp_broadcast_promote(a, b, *points, force_floating=True)
326
+ a, b, *points = xp_promote(a, b, *points, broadcast=True, force_floating=True,
327
+ xp=xp)
327
328
  result_dtype = a.dtype
328
329
 
329
330
  if xp_size(a) == 0 or xp_size(b) == 0:
scipy/integrate/_ode.py CHANGED
@@ -826,7 +826,7 @@ class IntegratorBase:
826
826
  # XXX: __str__ method for getting visual state of the integrator
827
827
 
828
828
 
829
- def _vode_banded_jac_wrapper(jacfunc, ml, jac_params):
829
+ def _banded_jac_wrapper(jacfunc, ml, jac_params):
830
830
  """
831
831
  Wrap a banded Jacobian function with a function that pads
832
832
  the Jacobian with `ml` rows of zeros.
@@ -1007,7 +1007,7 @@ class vode(IntegratorBase):
1007
1007
  # Banded Jacobian. Wrap the user-provided function with one
1008
1008
  # that pads the Jacobian array with the extra `self.ml` rows
1009
1009
  # required by the f2py-generated wrapper.
1010
- jac = _vode_banded_jac_wrapper(jac, self.ml, jac_params)
1010
+ jac = _banded_jac_wrapper(jac, self.ml, jac_params)
1011
1011
 
1012
1012
  args = ((f, jac, y0, t0, t1) + tuple(self.call_args) +
1013
1013
  (f_params, jac_params))
@@ -1351,6 +1351,13 @@ class lsoda(IntegratorBase):
1351
1351
  else:
1352
1352
  self.initialized = True
1353
1353
  self.acquire_new_handle()
1354
+
1355
+ if jac is not None and self.ml is not None and self.ml > 0:
1356
+ # Banded Jacobian. Wrap the user-provided function with one
1357
+ # that pads the Jacobian array with the extra `self.ml` rows
1358
+ # required by the f2py-generated wrapper.
1359
+ jac = _banded_jac_wrapper(jac, self.ml, jac_params)
1360
+
1354
1361
  args = [f, y0, t0, t1] + self.call_args[:-1] + \
1355
1362
  [jac, self.call_args[-1], f_params, 0, jac_params]
1356
1363
 
@@ -3,7 +3,6 @@ import copy
3
3
  import heapq
4
4
  import collections
5
5
  import functools
6
- import warnings
7
6
 
8
7
  import numpy as np
9
8
 
@@ -144,9 +143,9 @@ def quad_vec(f, a, b, epsabs=1e-200, epsrel=1e-8, norm='2', cache_size=100e6,
144
143
  Options: 'gk21' (Gauss-Kronrod 21-point rule),
145
144
  'gk15' (Gauss-Kronrod 15-point rule),
146
145
  'trapezoid' (composite trapezoid rule).
147
- Default: 'gk21' for finite intervals and 'gk15' for (semi-)infinite
146
+ Default: 'gk21' for finite intervals and 'gk15' for (semi-)infinite.
148
147
  full_output : bool, optional
149
- Return an additional ``info`` dictionary.
148
+ Return an additional ``info`` object.
150
149
  args : tuple, optional
151
150
  Extra arguments to pass to function, if any.
152
151
 
@@ -158,25 +157,25 @@ def quad_vec(f, a, b, epsabs=1e-200, epsrel=1e-8, norm='2', cache_size=100e6,
158
157
  Estimate for the result
159
158
  err : float
160
159
  Error estimate for the result in the given norm
161
- info : dict
160
+ info : object
162
161
  Returned only when ``full_output=True``.
163
- Info dictionary. Is an object with the attributes:
164
-
165
- success : bool
166
- Whether integration reached target precision.
167
- status : int
168
- Indicator for convergence, success (0),
169
- failure (1), and failure due to rounding error (2).
170
- neval : int
171
- Number of function evaluations.
172
- intervals : ndarray, shape (num_intervals, 2)
173
- Start and end points of subdivision intervals.
174
- integrals : ndarray, shape (num_intervals, ...)
175
- Integral for each interval.
176
- Note that at most ``cache_size`` values are recorded,
177
- and the array may contains *nan* for missing items.
178
- errors : ndarray, shape (num_intervals,)
179
- Estimated integration error for each interval.
162
+ Result object with the attributes:
163
+
164
+ success : bool
165
+ Whether integration reached target precision.
166
+ status : int
167
+ Indicator for convergence, success (0),
168
+ failure (1), and failure due to rounding error (2).
169
+ neval : int
170
+ Number of function evaluations.
171
+ intervals : ndarray, shape (num_intervals, 2)
172
+ Start and end points of subdivision intervals.
173
+ integrals : ndarray, shape (num_intervals, ...)
174
+ Integral for each interval.
175
+ Note that at most ``cache_size`` values are recorded,
176
+ and the array may contains *nan* for missing items.
177
+ errors : ndarray, shape (num_intervals,)
178
+ Estimated integration error for each interval.
180
179
 
181
180
  Notes
182
181
  -----
@@ -310,17 +309,10 @@ def quad_vec(f, a, b, epsabs=1e-200, epsrel=1e-8, norm='2', cache_size=100e6,
310
309
  _quadrature = {None: _quadrature_gk21,
311
310
  'gk21': _quadrature_gk21,
312
311
  'gk15': _quadrature_gk15,
313
- 'trapz': _quadrature_trapezoid, # alias for backcompat
314
312
  'trapezoid': _quadrature_trapezoid}[quadrature]
315
313
  except KeyError as e:
316
314
  raise ValueError(f"unknown quadrature {quadrature!r}") from e
317
315
 
318
- if quadrature == "trapz":
319
- msg = ("`quadrature='trapz'` is deprecated in favour of "
320
- "`quadrature='trapezoid' and will raise an error from SciPy 1.16.0 "
321
- "onwards.")
322
- warnings.warn(msg, DeprecationWarning, stacklevel=2)
323
-
324
316
  # Initial interval set
325
317
  if points is None:
326
318
  initial_intervals = [(a, b)]
@@ -347,7 +339,7 @@ def quad_vec(f, a, b, epsabs=1e-200, epsrel=1e-8, norm='2', cache_size=100e6,
347
339
  neval += _quadrature.num_eval
348
340
 
349
341
  if global_integral is None:
350
- if isinstance(ig, (float, complex)):
342
+ if isinstance(ig, float | complex):
351
343
  # Specialize for scalars
352
344
  if norm_func in (_max_norm, np.linalg.norm):
353
345
  norm_func = abs
@@ -211,9 +211,9 @@ def quad(func, a, b, args=(), full_output=0, epsabs=1.49e-8, epsrel=1.49e-8,
211
211
  For the 'cos' and 'sin' weighting, additional inputs and outputs are
212
212
  available.
213
213
 
214
- For finite integration limits, the integration is performed using a
215
- Clenshaw-Curtis method which uses Chebyshev moments. For repeated
216
- calculations, these moments are saved in the output dictionary:
214
+ For weighted integrals with finite integration limits, the integration
215
+ is performed using a Clenshaw-Curtis method, which uses Chebyshev moments.
216
+ For repeated calculations, these moments are saved in the output dictionary:
217
217
 
218
218
  'momcom'
219
219
  The maximum level of Chebyshev moments that have been computed,
@@ -284,7 +284,8 @@ def quad(func, a, b, args=(), full_output=0, epsabs=1.49e-8, epsrel=1.49e-8,
284
284
  is an integrator based on globally adaptive interval
285
285
  subdivision in connection with extrapolation, which will
286
286
  eliminate the effects of integrand singularities of
287
- several types.
287
+ several types. The integration is performed using a 21-point Gauss-Kronrod
288
+ quadrature within each subinterval.
288
289
  qagie
289
290
  handles integration over infinite intervals. The infinite range is
290
291
  mapped onto a finite interval and subsequently the same strategy as
@@ -745,7 +746,8 @@ def dblquad(func, a, b, gfun, hfun, args=(), epsabs=1.49e-8, epsrel=1.49e-8):
745
746
  is an integrator based on globally adaptive interval
746
747
  subdivision in connection with extrapolation, which will
747
748
  eliminate the effects of integrand singularities of
748
- several types.
749
+ several types. The integration is is performed using a 21-point Gauss-Kronrod
750
+ quadrature within each subinterval.
749
751
  qagie
750
752
  handles integration over infinite intervals. The infinite range is
751
753
  mapped onto a finite interval and subsequently the same strategy as
@@ -877,7 +879,8 @@ def tplquad(func, a, b, gfun, hfun, qfun, rfun, args=(), epsabs=1.49e-8,
877
879
  is an integrator based on globally adaptive interval
878
880
  subdivision in connection with extrapolation, which will
879
881
  eliminate the effects of integrand singularities of
880
- several types.
882
+ several types. The integration is is performed using a 21-point Gauss-Kronrod
883
+ quadrature within each subinterval.
881
884
  qagie
882
885
  handles integration over infinite intervals. The infinite range is
883
886
  mapped onto a finite interval and subsequently the same strategy as
@@ -1066,7 +1069,8 @@ def nquad(func, ranges, args=None, opts=None, full_output=False):
1066
1069
  is an integrator based on globally adaptive interval
1067
1070
  subdivision in connection with extrapolation, which will
1068
1071
  eliminate the effects of integrand singularities of
1069
- several types.
1072
+ several types. The integration is is performed using a 21-point Gauss-Kronrod
1073
+ quadrature within each subinterval.
1070
1074
  qagie
1071
1075
  handles integration over infinite intervals. The infinite range is
1072
1076
  mapped onto a finite interval and subsequently the same strategy as
@@ -8,7 +8,7 @@ from collections.abc import Callable
8
8
  from scipy.special import roots_legendre
9
9
  from scipy.special import gammaln, logsumexp
10
10
  from scipy._lib._util import _rng_spawn
11
- from scipy._lib._array_api import _asarray, array_namespace, xp_broadcast_promote
11
+ from scipy._lib._array_api import _asarray, array_namespace, xp_result_type
12
12
 
13
13
 
14
14
  __all__ = ['fixed_quad', 'romb',
@@ -124,7 +124,7 @@ def trapezoid(y, x=None, dx=1.0, axis=-1):
124
124
  # Cannot just use the broadcasted arrays that are returned
125
125
  # because trapezoid does not follow normal broadcasting rules
126
126
  # cf. https://github.com/scipy/scipy/pull/21524#issuecomment-2354105942
127
- result_dtype = xp_broadcast_promote(y, force_floating=True, xp=xp)[0].dtype
127
+ result_dtype = xp_result_type(y, force_floating=True, xp=xp)
128
128
  nd = y.ndim
129
129
  slice1 = [slice(None)]*nd
130
130
  slice2 = [slice(None)]*nd
@@ -894,7 +894,7 @@ def romb(y, dx=1.0, axis=-1, show=False):
894
894
  width = show[1]
895
895
  except (TypeError, IndexError):
896
896
  width = 8
897
- formstr = "%%%d.%df" % (width, precis)
897
+ formstr = f"%{width}.{precis}f"
898
898
 
899
899
  title = "Richardson Extrapolation Table for Romberg Integration"
900
900
  print(title, "=" * len(title), sep="\n", end="\n")
@@ -463,8 +463,8 @@ def _split_subregion(a, b, xp, split_at=None):
463
463
  if split_at is None:
464
464
  split_at = (a + b) / 2
465
465
 
466
- left = [xp.asarray([a[i], split_at[i]]) for i in range(a.shape[0])]
467
- right = [xp.asarray([split_at[i], b[i]]) for i in range(b.shape[0])]
466
+ left = [xp.stack((a[i], split_at[i])) for i in range(a.shape[0])]
467
+ right = [xp.stack((split_at[i], b[i])) for i in range(b.shape[0])]
468
468
 
469
469
  a_sub = _cartesian_product(left)
470
470
  b_sub = _cartesian_product(right)