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