scipy 1.15.3__cp312-cp312-macosx_12_0_arm64.whl → 1.16.0rc2__cp312-cp312-macosx_12_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (629) hide show
  1. scipy/.dylibs/libscipy_openblas.dylib +0 -0
  2. scipy/__config__.py +8 -8
  3. scipy/__init__.py +3 -6
  4. scipy/_cyutility.cpython-312-darwin.so +0 -0
  5. scipy/_lib/_array_api.py +486 -161
  6. scipy/_lib/_array_api_compat_vendor.py +9 -0
  7. scipy/_lib/_bunch.py +4 -0
  8. scipy/_lib/_ccallback_c.cpython-312-darwin.so +0 -0
  9. scipy/_lib/_docscrape.py +1 -1
  10. scipy/_lib/_elementwise_iterative_method.py +15 -26
  11. scipy/_lib/_sparse.py +41 -0
  12. scipy/_lib/_test_deprecation_call.cpython-312-darwin.so +0 -0
  13. scipy/_lib/_test_deprecation_def.cpython-312-darwin.so +0 -0
  14. scipy/_lib/_testutils.py +6 -2
  15. scipy/_lib/_util.py +222 -125
  16. scipy/_lib/array_api_compat/__init__.py +4 -4
  17. scipy/_lib/array_api_compat/_internal.py +19 -6
  18. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  19. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  20. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  21. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  22. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  23. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  24. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  25. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  26. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  27. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  28. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  29. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  30. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  31. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  32. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  33. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  34. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  35. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  36. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  37. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  38. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  39. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  40. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  41. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  42. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  43. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  44. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  45. scipy/_lib/array_api_extra/__init__.py +26 -3
  46. scipy/_lib/array_api_extra/_delegation.py +171 -0
  47. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  48. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  49. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  50. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  51. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  52. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  53. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  54. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  58. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  59. scipy/_lib/array_api_extra/testing.py +359 -0
  60. scipy/_lib/decorator.py +2 -2
  61. scipy/_lib/doccer.py +1 -7
  62. scipy/_lib/messagestream.cpython-312-darwin.so +0 -0
  63. scipy/_lib/pyprima/__init__.py +212 -0
  64. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  65. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  66. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  67. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  68. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  69. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  70. scipy/_lib/pyprima/cobyla/update.py +289 -0
  71. scipy/_lib/pyprima/common/__init__.py +0 -0
  72. scipy/_lib/pyprima/common/_bounds.py +34 -0
  73. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  74. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  75. scipy/_lib/pyprima/common/_project.py +173 -0
  76. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  77. scipy/_lib/pyprima/common/consts.py +47 -0
  78. scipy/_lib/pyprima/common/evaluate.py +99 -0
  79. scipy/_lib/pyprima/common/history.py +38 -0
  80. scipy/_lib/pyprima/common/infos.py +30 -0
  81. scipy/_lib/pyprima/common/linalg.py +435 -0
  82. scipy/_lib/pyprima/common/message.py +290 -0
  83. scipy/_lib/pyprima/common/powalg.py +131 -0
  84. scipy/_lib/pyprima/common/preproc.py +277 -0
  85. scipy/_lib/pyprima/common/present.py +5 -0
  86. scipy/_lib/pyprima/common/ratio.py +54 -0
  87. scipy/_lib/pyprima/common/redrho.py +47 -0
  88. scipy/_lib/pyprima/common/selectx.py +296 -0
  89. scipy/_lib/tests/test__util.py +105 -121
  90. scipy/_lib/tests/test_array_api.py +166 -35
  91. scipy/_lib/tests/test_bunch.py +7 -0
  92. scipy/_lib/tests/test_ccallback.py +2 -10
  93. scipy/_lib/tests/test_public_api.py +13 -0
  94. scipy/cluster/_hierarchy.cpython-312-darwin.so +0 -0
  95. scipy/cluster/_optimal_leaf_ordering.cpython-312-darwin.so +0 -0
  96. scipy/cluster/_vq.cpython-312-darwin.so +0 -0
  97. scipy/cluster/hierarchy.py +393 -223
  98. scipy/cluster/tests/test_hierarchy.py +273 -335
  99. scipy/cluster/tests/test_vq.py +45 -61
  100. scipy/cluster/vq.py +39 -35
  101. scipy/conftest.py +263 -157
  102. scipy/constants/_constants.py +4 -1
  103. scipy/constants/tests/test_codata.py +2 -2
  104. scipy/constants/tests/test_constants.py +11 -18
  105. scipy/datasets/_download_all.py +15 -1
  106. scipy/datasets/_fetchers.py +7 -1
  107. scipy/datasets/_utils.py +1 -1
  108. scipy/differentiate/_differentiate.py +25 -25
  109. scipy/differentiate/tests/test_differentiate.py +24 -25
  110. scipy/fft/_basic.py +20 -0
  111. scipy/fft/_helper.py +3 -34
  112. scipy/fft/_pocketfft/helper.py +29 -1
  113. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  114. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  115. scipy/fft/_realtransforms.py +13 -0
  116. scipy/fft/tests/test_basic.py +27 -25
  117. scipy/fft/tests/test_fftlog.py +16 -7
  118. scipy/fft/tests/test_helper.py +18 -34
  119. scipy/fft/tests/test_real_transforms.py +8 -10
  120. scipy/fftpack/convolve.cpython-312-darwin.so +0 -0
  121. scipy/fftpack/tests/test_basic.py +2 -4
  122. scipy/fftpack/tests/test_real_transforms.py +8 -9
  123. scipy/integrate/_bvp.py +9 -3
  124. scipy/integrate/_cubature.py +3 -2
  125. scipy/integrate/_dop.cpython-312-darwin.so +0 -0
  126. scipy/integrate/_lsoda.cpython-312-darwin.so +0 -0
  127. scipy/integrate/_ode.py +9 -2
  128. scipy/integrate/_odepack.cpython-312-darwin.so +0 -0
  129. scipy/integrate/_quad_vec.py +21 -29
  130. scipy/integrate/_quadpack.cpython-312-darwin.so +0 -0
  131. scipy/integrate/_quadpack_py.py +11 -7
  132. scipy/integrate/_quadrature.py +3 -3
  133. scipy/integrate/_rules/_base.py +2 -2
  134. scipy/integrate/_tanhsinh.py +48 -47
  135. scipy/integrate/_test_odeint_banded.cpython-312-darwin.so +0 -0
  136. scipy/integrate/_vode.cpython-312-darwin.so +0 -0
  137. scipy/integrate/tests/test__quad_vec.py +0 -6
  138. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  139. scipy/integrate/tests/test_cubature.py +21 -35
  140. scipy/integrate/tests/test_quadrature.py +6 -8
  141. scipy/integrate/tests/test_tanhsinh.py +56 -48
  142. scipy/interpolate/__init__.py +70 -58
  143. scipy/interpolate/_bary_rational.py +22 -22
  144. scipy/interpolate/_bsplines.py +119 -66
  145. scipy/interpolate/_cubic.py +65 -50
  146. scipy/interpolate/_dfitpack.cpython-312-darwin.so +0 -0
  147. scipy/interpolate/_dierckx.cpython-312-darwin.so +0 -0
  148. scipy/interpolate/_fitpack.cpython-312-darwin.so +0 -0
  149. scipy/interpolate/_fitpack2.py +9 -6
  150. scipy/interpolate/_fitpack_impl.py +32 -26
  151. scipy/interpolate/_fitpack_repro.py +23 -19
  152. scipy/interpolate/_interpnd.cpython-312-darwin.so +0 -0
  153. scipy/interpolate/_interpolate.py +30 -12
  154. scipy/interpolate/_ndbspline.py +13 -18
  155. scipy/interpolate/_ndgriddata.py +5 -8
  156. scipy/interpolate/_polyint.py +95 -31
  157. scipy/interpolate/_ppoly.cpython-312-darwin.so +0 -0
  158. scipy/interpolate/_rbf.py +2 -2
  159. scipy/interpolate/_rbfinterp.py +1 -1
  160. scipy/interpolate/_rbfinterp_pythran.cpython-312-darwin.so +0 -0
  161. scipy/interpolate/_rgi.py +31 -26
  162. scipy/interpolate/_rgi_cython.cpython-312-darwin.so +0 -0
  163. scipy/interpolate/dfitpack.py +0 -20
  164. scipy/interpolate/interpnd.py +1 -2
  165. scipy/interpolate/tests/test_bary_rational.py +2 -2
  166. scipy/interpolate/tests/test_bsplines.py +97 -1
  167. scipy/interpolate/tests/test_fitpack2.py +39 -1
  168. scipy/interpolate/tests/test_interpnd.py +32 -20
  169. scipy/interpolate/tests/test_interpolate.py +48 -4
  170. scipy/interpolate/tests/test_rgi.py +2 -1
  171. scipy/io/_fast_matrix_market/__init__.py +2 -0
  172. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  173. scipy/io/_harwell_boeing/hb.py +7 -11
  174. scipy/io/_idl.py +5 -7
  175. scipy/io/_netcdf.py +15 -5
  176. scipy/io/_test_fortran.cpython-312-darwin.so +0 -0
  177. scipy/io/arff/tests/test_arffread.py +3 -3
  178. scipy/io/matlab/__init__.py +5 -3
  179. scipy/io/matlab/_mio.py +4 -1
  180. scipy/io/matlab/_mio5.py +19 -13
  181. scipy/io/matlab/_mio5_utils.cpython-312-darwin.so +0 -0
  182. scipy/io/matlab/_mio_utils.cpython-312-darwin.so +0 -0
  183. scipy/io/matlab/_miobase.py +4 -1
  184. scipy/io/matlab/_streams.cpython-312-darwin.so +0 -0
  185. scipy/io/matlab/tests/test_mio.py +46 -18
  186. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  187. scipy/io/tests/test_mmio.py +7 -1
  188. scipy/io/tests/test_wavfile.py +41 -0
  189. scipy/io/wavfile.py +57 -10
  190. scipy/linalg/_basic.py +113 -86
  191. scipy/linalg/_cythonized_array_utils.cpython-312-darwin.so +0 -0
  192. scipy/linalg/_decomp.py +22 -9
  193. scipy/linalg/_decomp_cholesky.py +28 -13
  194. scipy/linalg/_decomp_cossin.py +45 -30
  195. scipy/linalg/_decomp_interpolative.cpython-312-darwin.so +0 -0
  196. scipy/linalg/_decomp_ldl.py +4 -1
  197. scipy/linalg/_decomp_lu.py +18 -6
  198. scipy/linalg/_decomp_lu_cython.cpython-312-darwin.so +0 -0
  199. scipy/linalg/_decomp_polar.py +2 -0
  200. scipy/linalg/_decomp_qr.py +6 -2
  201. scipy/linalg/_decomp_qz.py +3 -0
  202. scipy/linalg/_decomp_schur.py +3 -1
  203. scipy/linalg/_decomp_svd.py +13 -2
  204. scipy/linalg/_decomp_update.cpython-312-darwin.so +0 -0
  205. scipy/linalg/_expm_frechet.py +4 -0
  206. scipy/linalg/_fblas.cpython-312-darwin.so +0 -0
  207. scipy/linalg/_flapack.cpython-312-darwin.so +0 -0
  208. scipy/linalg/_linalg_pythran.cpython-312-darwin.so +0 -0
  209. scipy/linalg/_matfuncs.py +187 -4
  210. scipy/linalg/_matfuncs_expm.cpython-312-darwin.so +0 -0
  211. scipy/linalg/_matfuncs_schur_sqrtm.cpython-312-darwin.so +0 -0
  212. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  213. scipy/linalg/_matfuncs_sqrtm_triu.cpython-312-darwin.so +0 -0
  214. scipy/linalg/_procrustes.py +2 -0
  215. scipy/linalg/_sketches.py +17 -6
  216. scipy/linalg/_solve_toeplitz.cpython-312-darwin.so +0 -0
  217. scipy/linalg/_solvers.py +7 -2
  218. scipy/linalg/_special_matrices.py +26 -36
  219. scipy/linalg/cython_blas.cpython-312-darwin.so +0 -0
  220. scipy/linalg/cython_lapack.cpython-312-darwin.so +0 -0
  221. scipy/linalg/lapack.py +22 -2
  222. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  223. scipy/linalg/tests/test_basic.py +31 -16
  224. scipy/linalg/tests/test_batch.py +588 -0
  225. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  226. scipy/linalg/tests/test_decomp.py +40 -3
  227. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  228. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  229. scipy/linalg/tests/test_lapack.py +115 -7
  230. scipy/linalg/tests/test_matfuncs.py +157 -102
  231. scipy/linalg/tests/test_procrustes.py +0 -7
  232. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  233. scipy/linalg/tests/test_special_matrices.py +1 -5
  234. scipy/ndimage/__init__.py +1 -0
  235. scipy/ndimage/_cytest.cpython-312-darwin.so +0 -0
  236. scipy/ndimage/_delegators.py +8 -2
  237. scipy/ndimage/_filters.py +453 -5
  238. scipy/ndimage/_interpolation.py +36 -6
  239. scipy/ndimage/_measurements.py +4 -2
  240. scipy/ndimage/_morphology.py +5 -0
  241. scipy/ndimage/_nd_image.cpython-312-darwin.so +0 -0
  242. scipy/ndimage/_ni_docstrings.py +5 -1
  243. scipy/ndimage/_ni_label.cpython-312-darwin.so +0 -0
  244. scipy/ndimage/_ni_support.py +1 -5
  245. scipy/ndimage/_rank_filter_1d.cpython-312-darwin.so +0 -0
  246. scipy/ndimage/_support_alternative_backends.py +18 -6
  247. scipy/ndimage/tests/test_filters.py +370 -259
  248. scipy/ndimage/tests/test_fourier.py +7 -9
  249. scipy/ndimage/tests/test_interpolation.py +68 -61
  250. scipy/ndimage/tests/test_measurements.py +18 -35
  251. scipy/ndimage/tests/test_morphology.py +143 -131
  252. scipy/ndimage/tests/test_splines.py +1 -3
  253. scipy/odr/__odrpack.cpython-312-darwin.so +0 -0
  254. scipy/optimize/_basinhopping.py +13 -7
  255. scipy/optimize/_bglu_dense.cpython-312-darwin.so +0 -0
  256. scipy/optimize/_bracket.py +17 -24
  257. scipy/optimize/_chandrupatla.py +9 -10
  258. scipy/optimize/_cobyla_py.py +104 -123
  259. scipy/optimize/_constraints.py +14 -10
  260. scipy/optimize/_differentiable_functions.py +371 -230
  261. scipy/optimize/_differentialevolution.py +4 -3
  262. scipy/optimize/_direct.cpython-312-darwin.so +0 -0
  263. scipy/optimize/_dual_annealing.py +1 -1
  264. scipy/optimize/_elementwise.py +1 -4
  265. scipy/optimize/_group_columns.cpython-312-darwin.so +0 -0
  266. scipy/optimize/_lbfgsb.cpython-312-darwin.so +0 -0
  267. scipy/optimize/_lbfgsb_py.py +57 -16
  268. scipy/optimize/_linprog_doc.py +2 -2
  269. scipy/optimize/_linprog_highs.py +2 -2
  270. scipy/optimize/_linprog_ip.py +25 -10
  271. scipy/optimize/_linprog_util.py +14 -16
  272. scipy/optimize/_lsap.cpython-312-darwin.so +0 -0
  273. scipy/optimize/_lsq/common.py +3 -3
  274. scipy/optimize/_lsq/dogbox.py +16 -2
  275. scipy/optimize/_lsq/givens_elimination.cpython-312-darwin.so +0 -0
  276. scipy/optimize/_lsq/least_squares.py +198 -126
  277. scipy/optimize/_lsq/lsq_linear.py +6 -6
  278. scipy/optimize/_lsq/trf.py +35 -8
  279. scipy/optimize/_milp.py +3 -1
  280. scipy/optimize/_minimize.py +105 -36
  281. scipy/optimize/_minpack.cpython-312-darwin.so +0 -0
  282. scipy/optimize/_minpack_py.py +21 -14
  283. scipy/optimize/_moduleTNC.cpython-312-darwin.so +0 -0
  284. scipy/optimize/_nnls.py +20 -21
  285. scipy/optimize/_nonlin.py +34 -3
  286. scipy/optimize/_numdiff.py +288 -110
  287. scipy/optimize/_optimize.py +86 -48
  288. scipy/optimize/_pava_pybind.cpython-312-darwin.so +0 -0
  289. scipy/optimize/_remove_redundancy.py +5 -5
  290. scipy/optimize/_root_scalar.py +1 -1
  291. scipy/optimize/_shgo.py +6 -0
  292. scipy/optimize/_shgo_lib/_complex.py +1 -1
  293. scipy/optimize/_slsqp_py.py +216 -124
  294. scipy/optimize/_slsqplib.cpython-312-darwin.so +0 -0
  295. scipy/optimize/_spectral.py +1 -1
  296. scipy/optimize/_tnc.py +8 -1
  297. scipy/optimize/_trlib/_trlib.cpython-312-darwin.so +0 -0
  298. scipy/optimize/_trustregion.py +20 -6
  299. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  300. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  301. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  302. scipy/optimize/_trustregion_constr/projections.py +12 -8
  303. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  304. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  305. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  306. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  307. scipy/optimize/_trustregion_exact.py +0 -1
  308. scipy/optimize/_zeros.cpython-312-darwin.so +0 -0
  309. scipy/optimize/_zeros_py.py +97 -17
  310. scipy/optimize/cython_optimize/_zeros.cpython-312-darwin.so +0 -0
  311. scipy/optimize/slsqp.py +0 -1
  312. scipy/optimize/tests/test__basinhopping.py +1 -1
  313. scipy/optimize/tests/test__differential_evolution.py +4 -4
  314. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  315. scipy/optimize/tests/test__numdiff.py +66 -22
  316. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  317. scipy/optimize/tests/test__shgo.py +9 -1
  318. scipy/optimize/tests/test_bracket.py +36 -46
  319. scipy/optimize/tests/test_chandrupatla.py +133 -135
  320. scipy/optimize/tests/test_cobyla.py +74 -45
  321. scipy/optimize/tests/test_constraints.py +1 -1
  322. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  323. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  324. scipy/optimize/tests/test_least_squares.py +125 -13
  325. scipy/optimize/tests/test_linear_assignment.py +3 -3
  326. scipy/optimize/tests/test_linprog.py +3 -3
  327. scipy/optimize/tests/test_lsq_linear.py +6 -6
  328. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  329. scipy/optimize/tests/test_minpack.py +4 -4
  330. scipy/optimize/tests/test_nnls.py +43 -3
  331. scipy/optimize/tests/test_nonlin.py +36 -0
  332. scipy/optimize/tests/test_optimize.py +95 -17
  333. scipy/optimize/tests/test_slsqp.py +36 -4
  334. scipy/optimize/tests/test_zeros.py +34 -1
  335. scipy/signal/__init__.py +12 -23
  336. scipy/signal/_delegators.py +568 -0
  337. scipy/signal/_filter_design.py +459 -241
  338. scipy/signal/_fir_filter_design.py +262 -90
  339. scipy/signal/_lti_conversion.py +3 -2
  340. scipy/signal/_ltisys.py +118 -91
  341. scipy/signal/_max_len_seq_inner.cpython-312-darwin.so +0 -0
  342. scipy/signal/_peak_finding_utils.cpython-312-darwin.so +0 -0
  343. scipy/signal/_polyutils.py +172 -0
  344. scipy/signal/_short_time_fft.py +519 -70
  345. scipy/signal/_signal_api.py +30 -0
  346. scipy/signal/_signaltools.py +719 -399
  347. scipy/signal/_sigtools.cpython-312-darwin.so +0 -0
  348. scipy/signal/_sosfilt.cpython-312-darwin.so +0 -0
  349. scipy/signal/_spectral_py.py +230 -50
  350. scipy/signal/_spline.cpython-312-darwin.so +0 -0
  351. scipy/signal/_spline_filters.py +108 -68
  352. scipy/signal/_support_alternative_backends.py +73 -0
  353. scipy/signal/_upfirdn.py +4 -1
  354. scipy/signal/_upfirdn_apply.cpython-312-darwin.so +0 -0
  355. scipy/signal/_waveforms.py +2 -11
  356. scipy/signal/_wavelets.py +1 -1
  357. scipy/signal/fir_filter_design.py +1 -0
  358. scipy/signal/spline.py +4 -11
  359. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  360. scipy/signal/tests/test_bsplines.py +114 -79
  361. scipy/signal/tests/test_cont2discrete.py +9 -2
  362. scipy/signal/tests/test_filter_design.py +721 -481
  363. scipy/signal/tests/test_fir_filter_design.py +332 -140
  364. scipy/signal/tests/test_savitzky_golay.py +4 -3
  365. scipy/signal/tests/test_short_time_fft.py +221 -3
  366. scipy/signal/tests/test_signaltools.py +2144 -1348
  367. scipy/signal/tests/test_spectral.py +50 -6
  368. scipy/signal/tests/test_splines.py +161 -96
  369. scipy/signal/tests/test_upfirdn.py +84 -50
  370. scipy/signal/tests/test_waveforms.py +20 -0
  371. scipy/signal/tests/test_windows.py +607 -466
  372. scipy/signal/windows/_windows.py +287 -148
  373. scipy/sparse/__init__.py +23 -4
  374. scipy/sparse/_base.py +270 -108
  375. scipy/sparse/_bsr.py +7 -4
  376. scipy/sparse/_compressed.py +59 -231
  377. scipy/sparse/_construct.py +90 -38
  378. scipy/sparse/_coo.py +115 -181
  379. scipy/sparse/_csc.py +4 -4
  380. scipy/sparse/_csparsetools.cpython-312-darwin.so +0 -0
  381. scipy/sparse/_csr.py +2 -2
  382. scipy/sparse/_data.py +48 -48
  383. scipy/sparse/_dia.py +105 -18
  384. scipy/sparse/_dok.py +0 -23
  385. scipy/sparse/_index.py +4 -4
  386. scipy/sparse/_matrix.py +23 -0
  387. scipy/sparse/_sparsetools.cpython-312-darwin.so +0 -0
  388. scipy/sparse/_sputils.py +37 -22
  389. scipy/sparse/base.py +0 -9
  390. scipy/sparse/bsr.py +0 -14
  391. scipy/sparse/compressed.py +0 -23
  392. scipy/sparse/construct.py +0 -6
  393. scipy/sparse/coo.py +0 -14
  394. scipy/sparse/csc.py +0 -3
  395. scipy/sparse/csgraph/_flow.cpython-312-darwin.so +0 -0
  396. scipy/sparse/csgraph/_matching.cpython-312-darwin.so +0 -0
  397. scipy/sparse/csgraph/_min_spanning_tree.cpython-312-darwin.so +0 -0
  398. scipy/sparse/csgraph/_reordering.cpython-312-darwin.so +0 -0
  399. scipy/sparse/csgraph/_shortest_path.cpython-312-darwin.so +0 -0
  400. scipy/sparse/csgraph/_tools.cpython-312-darwin.so +0 -0
  401. scipy/sparse/csgraph/_traversal.cpython-312-darwin.so +0 -0
  402. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  403. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  404. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  405. scipy/sparse/csr.py +0 -5
  406. scipy/sparse/data.py +1 -6
  407. scipy/sparse/dia.py +0 -7
  408. scipy/sparse/dok.py +0 -10
  409. scipy/sparse/linalg/_dsolve/_superlu.cpython-312-darwin.so +0 -0
  410. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  411. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  412. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-312-darwin.so +0 -0
  413. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  414. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  415. scipy/sparse/linalg/_interface.py +17 -18
  416. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  417. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  418. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  419. scipy/sparse/linalg/_isolve/minres.py +5 -5
  420. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  421. scipy/sparse/linalg/_isolve/utils.py +2 -8
  422. scipy/sparse/linalg/_matfuncs.py +1 -1
  423. scipy/sparse/linalg/_norm.py +1 -1
  424. scipy/sparse/linalg/_propack/_cpropack.cpython-312-darwin.so +0 -0
  425. scipy/sparse/linalg/_propack/_dpropack.cpython-312-darwin.so +0 -0
  426. scipy/sparse/linalg/_propack/_spropack.cpython-312-darwin.so +0 -0
  427. scipy/sparse/linalg/_propack/_zpropack.cpython-312-darwin.so +0 -0
  428. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  429. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  430. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  431. scipy/sparse/tests/test_base.py +214 -42
  432. scipy/sparse/tests/test_common1d.py +7 -7
  433. scipy/sparse/tests/test_construct.py +1 -1
  434. scipy/sparse/tests/test_coo.py +272 -4
  435. scipy/sparse/tests/test_sparsetools.py +5 -0
  436. scipy/sparse/tests/test_sputils.py +36 -7
  437. scipy/spatial/_ckdtree.cpython-312-darwin.so +0 -0
  438. scipy/spatial/_distance_pybind.cpython-312-darwin.so +0 -0
  439. scipy/spatial/_distance_wrap.cpython-312-darwin.so +0 -0
  440. scipy/spatial/_hausdorff.cpython-312-darwin.so +0 -0
  441. scipy/spatial/_qhull.cpython-312-darwin.so +0 -0
  442. scipy/spatial/_voronoi.cpython-312-darwin.so +0 -0
  443. scipy/spatial/distance.py +49 -42
  444. scipy/spatial/tests/test_distance.py +15 -1
  445. scipy/spatial/tests/test_kdtree.py +1 -0
  446. scipy/spatial/tests/test_qhull.py +7 -2
  447. scipy/spatial/transform/__init__.py +5 -3
  448. scipy/spatial/transform/_rigid_transform.cpython-312-darwin.so +0 -0
  449. scipy/spatial/transform/_rotation.cpython-312-darwin.so +0 -0
  450. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  451. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  452. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  453. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  454. scipy/special/__init__.py +1 -47
  455. scipy/special/_add_newdocs.py +34 -772
  456. scipy/special/_basic.py +22 -25
  457. scipy/special/_comb.cpython-312-darwin.so +0 -0
  458. scipy/special/_ellip_harm_2.cpython-312-darwin.so +0 -0
  459. scipy/special/_gufuncs.cpython-312-darwin.so +0 -0
  460. scipy/special/_logsumexp.py +67 -58
  461. scipy/special/_orthogonal.pyi +1 -1
  462. scipy/special/_specfun.cpython-312-darwin.so +0 -0
  463. scipy/special/_special_ufuncs.cpython-312-darwin.so +0 -0
  464. scipy/special/_spherical_bessel.py +4 -4
  465. scipy/special/_support_alternative_backends.py +212 -119
  466. scipy/special/_test_internal.cpython-312-darwin.so +0 -0
  467. scipy/special/_testutils.py +4 -4
  468. scipy/special/_ufuncs.cpython-312-darwin.so +0 -0
  469. scipy/special/_ufuncs.pyi +1 -0
  470. scipy/special/_ufuncs.pyx +215 -1400
  471. scipy/special/_ufuncs_cxx.cpython-312-darwin.so +0 -0
  472. scipy/special/_ufuncs_cxx.pxd +2 -15
  473. scipy/special/_ufuncs_cxx.pyx +5 -44
  474. scipy/special/_ufuncs_cxx_defs.h +2 -16
  475. scipy/special/_ufuncs_defs.h +0 -8
  476. scipy/special/cython_special.cpython-312-darwin.so +0 -0
  477. scipy/special/cython_special.pxd +1 -1
  478. scipy/special/tests/_cython_examples/meson.build +10 -1
  479. scipy/special/tests/test_basic.py +153 -20
  480. scipy/special/tests/test_boost_ufuncs.py +3 -0
  481. scipy/special/tests/test_cdflib.py +35 -11
  482. scipy/special/tests/test_gammainc.py +16 -0
  483. scipy/special/tests/test_hyp2f1.py +2 -2
  484. scipy/special/tests/test_log1mexp.py +85 -0
  485. scipy/special/tests/test_logsumexp.py +206 -64
  486. scipy/special/tests/test_mpmath.py +1 -0
  487. scipy/special/tests/test_nan_inputs.py +1 -1
  488. scipy/special/tests/test_orthogonal.py +17 -18
  489. scipy/special/tests/test_sf_error.py +3 -2
  490. scipy/special/tests/test_sph_harm.py +6 -7
  491. scipy/special/tests/test_support_alternative_backends.py +211 -76
  492. scipy/stats/__init__.py +4 -1
  493. scipy/stats/_ansari_swilk_statistics.cpython-312-darwin.so +0 -0
  494. scipy/stats/_axis_nan_policy.py +5 -12
  495. scipy/stats/_biasedurn.cpython-312-darwin.so +0 -0
  496. scipy/stats/_continued_fraction.py +387 -0
  497. scipy/stats/_continuous_distns.py +277 -310
  498. scipy/stats/_correlation.py +1 -1
  499. scipy/stats/_covariance.py +6 -3
  500. scipy/stats/_discrete_distns.py +39 -32
  501. scipy/stats/_distn_infrastructure.py +39 -12
  502. scipy/stats/_distribution_infrastructure.py +900 -238
  503. scipy/stats/_entropy.py +9 -10
  504. scipy/{_lib → stats}/_finite_differences.py +1 -1
  505. scipy/stats/_hypotests.py +83 -50
  506. scipy/stats/_kde.py +53 -49
  507. scipy/stats/_ksstats.py +1 -1
  508. scipy/stats/_levy_stable/__init__.py +7 -15
  509. scipy/stats/_levy_stable/levyst.cpython-312-darwin.so +0 -0
  510. scipy/stats/_morestats.py +118 -73
  511. scipy/stats/_mstats_basic.py +13 -17
  512. scipy/stats/_mstats_extras.py +8 -8
  513. scipy/stats/_multivariate.py +89 -113
  514. scipy/stats/_new_distributions.py +97 -20
  515. scipy/stats/_page_trend_test.py +12 -5
  516. scipy/stats/_probability_distribution.py +265 -43
  517. scipy/stats/_qmc.py +14 -9
  518. scipy/stats/_qmc_cy.cpython-312-darwin.so +0 -0
  519. scipy/stats/_qmvnt.py +16 -95
  520. scipy/stats/_qmvnt_cy.cpython-312-darwin.so +0 -0
  521. scipy/stats/_quantile.py +335 -0
  522. scipy/stats/_rcont/rcont.cpython-312-darwin.so +0 -0
  523. scipy/stats/_resampling.py +4 -29
  524. scipy/stats/_sampling.py +1 -1
  525. scipy/stats/_sobol.cpython-312-darwin.so +0 -0
  526. scipy/stats/_stats.cpython-312-darwin.so +0 -0
  527. scipy/stats/_stats_mstats_common.py +21 -2
  528. scipy/stats/_stats_py.py +550 -476
  529. scipy/stats/_stats_pythran.cpython-312-darwin.so +0 -0
  530. scipy/stats/_unuran/unuran_wrapper.cpython-312-darwin.so +0 -0
  531. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  532. scipy/stats/_variation.py +6 -8
  533. scipy/stats/_wilcoxon.py +13 -7
  534. scipy/stats/tests/common_tests.py +6 -4
  535. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  536. scipy/stats/tests/test_continued_fraction.py +173 -0
  537. scipy/stats/tests/test_continuous.py +379 -60
  538. scipy/stats/tests/test_continuous_basic.py +18 -12
  539. scipy/stats/tests/test_discrete_basic.py +14 -8
  540. scipy/stats/tests/test_discrete_distns.py +16 -16
  541. scipy/stats/tests/test_distributions.py +95 -75
  542. scipy/stats/tests/test_entropy.py +40 -48
  543. scipy/stats/tests/test_fit.py +4 -3
  544. scipy/stats/tests/test_hypotests.py +153 -24
  545. scipy/stats/tests/test_kdeoth.py +109 -41
  546. scipy/stats/tests/test_marray.py +289 -0
  547. scipy/stats/tests/test_morestats.py +79 -47
  548. scipy/stats/tests/test_mstats_basic.py +3 -3
  549. scipy/stats/tests/test_multivariate.py +434 -83
  550. scipy/stats/tests/test_qmc.py +13 -10
  551. scipy/stats/tests/test_quantile.py +199 -0
  552. scipy/stats/tests/test_rank.py +119 -112
  553. scipy/stats/tests/test_resampling.py +47 -56
  554. scipy/stats/tests/test_sampling.py +9 -4
  555. scipy/stats/tests/test_stats.py +799 -939
  556. scipy/stats/tests/test_variation.py +8 -6
  557. scipy/version.py +2 -2
  558. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  559. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  560. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +561 -568
  561. scipy-1.16.0rc2.dist-info/WHEEL +6 -0
  562. scipy/_lib/array_api_extra/_funcs.py +0 -484
  563. scipy/_lib/array_api_extra/_typing.py +0 -8
  564. scipy/interpolate/_bspl.cpython-312-darwin.so +0 -0
  565. scipy/optimize/_cobyla.cpython-312-darwin.so +0 -0
  566. scipy/optimize/_cython_nnls.cpython-312-darwin.so +0 -0
  567. scipy/optimize/_slsqp.cpython-312-darwin.so +0 -0
  568. scipy/spatial/qhull_src/COPYING.txt +0 -38
  569. scipy/special/libsf_error_state.dylib +0 -0
  570. scipy/special/tests/test_log_softmax.py +0 -109
  571. scipy/special/tests/test_xsf_cuda.py +0 -114
  572. scipy/special/xsf/binom.h +0 -89
  573. scipy/special/xsf/cdflib.h +0 -100
  574. scipy/special/xsf/cephes/airy.h +0 -307
  575. scipy/special/xsf/cephes/besselpoly.h +0 -51
  576. scipy/special/xsf/cephes/beta.h +0 -257
  577. scipy/special/xsf/cephes/cbrt.h +0 -131
  578. scipy/special/xsf/cephes/chbevl.h +0 -85
  579. scipy/special/xsf/cephes/chdtr.h +0 -193
  580. scipy/special/xsf/cephes/const.h +0 -87
  581. scipy/special/xsf/cephes/ellie.h +0 -293
  582. scipy/special/xsf/cephes/ellik.h +0 -251
  583. scipy/special/xsf/cephes/ellpe.h +0 -107
  584. scipy/special/xsf/cephes/ellpk.h +0 -117
  585. scipy/special/xsf/cephes/expn.h +0 -260
  586. scipy/special/xsf/cephes/gamma.h +0 -398
  587. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  588. scipy/special/xsf/cephes/hyperg.h +0 -361
  589. scipy/special/xsf/cephes/i0.h +0 -149
  590. scipy/special/xsf/cephes/i1.h +0 -158
  591. scipy/special/xsf/cephes/igam.h +0 -421
  592. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  593. scipy/special/xsf/cephes/igami.h +0 -313
  594. scipy/special/xsf/cephes/j0.h +0 -225
  595. scipy/special/xsf/cephes/j1.h +0 -198
  596. scipy/special/xsf/cephes/jv.h +0 -715
  597. scipy/special/xsf/cephes/k0.h +0 -164
  598. scipy/special/xsf/cephes/k1.h +0 -163
  599. scipy/special/xsf/cephes/kn.h +0 -243
  600. scipy/special/xsf/cephes/lanczos.h +0 -112
  601. scipy/special/xsf/cephes/ndtr.h +0 -275
  602. scipy/special/xsf/cephes/poch.h +0 -85
  603. scipy/special/xsf/cephes/polevl.h +0 -167
  604. scipy/special/xsf/cephes/psi.h +0 -194
  605. scipy/special/xsf/cephes/rgamma.h +0 -111
  606. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  607. scipy/special/xsf/cephes/shichi.h +0 -248
  608. scipy/special/xsf/cephes/sici.h +0 -224
  609. scipy/special/xsf/cephes/sindg.h +0 -221
  610. scipy/special/xsf/cephes/tandg.h +0 -139
  611. scipy/special/xsf/cephes/trig.h +0 -58
  612. scipy/special/xsf/cephes/unity.h +0 -186
  613. scipy/special/xsf/cephes/zeta.h +0 -172
  614. scipy/special/xsf/config.h +0 -304
  615. scipy/special/xsf/digamma.h +0 -205
  616. scipy/special/xsf/error.h +0 -57
  617. scipy/special/xsf/evalpoly.h +0 -47
  618. scipy/special/xsf/expint.h +0 -266
  619. scipy/special/xsf/hyp2f1.h +0 -694
  620. scipy/special/xsf/iv_ratio.h +0 -173
  621. scipy/special/xsf/lambertw.h +0 -150
  622. scipy/special/xsf/loggamma.h +0 -163
  623. scipy/special/xsf/sici.h +0 -200
  624. scipy/special/xsf/tools.h +0 -427
  625. scipy/special/xsf/trig.h +0 -164
  626. scipy/special/xsf/wright_bessel.h +0 -843
  627. scipy/special/xsf/zlog1.h +0 -35
  628. scipy/stats/_mvn.cpython-312-darwin.so +0 -0
  629. scipy-1.15.3.dist-info/WHEEL +0 -4
@@ -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:
Binary file
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)