scipy 1.15.2__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 (642) 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 +497 -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_ccallback.cpython-312-darwin.so +0 -0
  15. scipy/_lib/_test_deprecation_call.cpython-312-darwin.so +0 -0
  16. scipy/_lib/_test_deprecation_def.cpython-312-darwin.so +0 -0
  17. scipy/_lib/_testutils.py +6 -2
  18. scipy/_lib/_util.py +222 -125
  19. scipy/_lib/array_api_compat/__init__.py +4 -4
  20. scipy/_lib/array_api_compat/_internal.py +19 -6
  21. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  22. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  23. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  24. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  25. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  26. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  27. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  28. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  29. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  30. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  31. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  32. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  33. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  34. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  35. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  36. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  37. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  38. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  39. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  40. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  41. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  42. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  43. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  44. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  45. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  46. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  47. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  48. scipy/_lib/array_api_extra/__init__.py +26 -3
  49. scipy/_lib/array_api_extra/_delegation.py +171 -0
  50. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  51. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  52. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  53. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  54. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  55. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  58. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  59. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  60. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  61. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  62. scipy/_lib/array_api_extra/testing.py +359 -0
  63. scipy/_lib/decorator.py +2 -2
  64. scipy/_lib/doccer.py +1 -7
  65. scipy/_lib/messagestream.cpython-312-darwin.so +0 -0
  66. scipy/_lib/pyprima/__init__.py +212 -0
  67. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  68. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  69. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  70. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  71. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  72. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  73. scipy/_lib/pyprima/cobyla/update.py +289 -0
  74. scipy/_lib/pyprima/common/__init__.py +0 -0
  75. scipy/_lib/pyprima/common/_bounds.py +34 -0
  76. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  77. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  78. scipy/_lib/pyprima/common/_project.py +173 -0
  79. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  80. scipy/_lib/pyprima/common/consts.py +47 -0
  81. scipy/_lib/pyprima/common/evaluate.py +99 -0
  82. scipy/_lib/pyprima/common/history.py +38 -0
  83. scipy/_lib/pyprima/common/infos.py +30 -0
  84. scipy/_lib/pyprima/common/linalg.py +435 -0
  85. scipy/_lib/pyprima/common/message.py +290 -0
  86. scipy/_lib/pyprima/common/powalg.py +131 -0
  87. scipy/_lib/pyprima/common/preproc.py +277 -0
  88. scipy/_lib/pyprima/common/present.py +5 -0
  89. scipy/_lib/pyprima/common/ratio.py +54 -0
  90. scipy/_lib/pyprima/common/redrho.py +47 -0
  91. scipy/_lib/pyprima/common/selectx.py +296 -0
  92. scipy/_lib/tests/test__util.py +105 -121
  93. scipy/_lib/tests/test_array_api.py +169 -34
  94. scipy/_lib/tests/test_bunch.py +7 -0
  95. scipy/_lib/tests/test_ccallback.py +2 -10
  96. scipy/_lib/tests/test_public_api.py +13 -0
  97. scipy/cluster/_hierarchy.cpython-312-darwin.so +0 -0
  98. scipy/cluster/_optimal_leaf_ordering.cpython-312-darwin.so +0 -0
  99. scipy/cluster/_vq.cpython-312-darwin.so +0 -0
  100. scipy/cluster/hierarchy.py +393 -223
  101. scipy/cluster/tests/test_hierarchy.py +273 -335
  102. scipy/cluster/tests/test_vq.py +45 -61
  103. scipy/cluster/vq.py +39 -35
  104. scipy/conftest.py +282 -151
  105. scipy/constants/_constants.py +4 -1
  106. scipy/constants/tests/test_codata.py +2 -2
  107. scipy/constants/tests/test_constants.py +11 -18
  108. scipy/datasets/_download_all.py +15 -1
  109. scipy/datasets/_fetchers.py +7 -1
  110. scipy/datasets/_utils.py +1 -1
  111. scipy/differentiate/_differentiate.py +25 -25
  112. scipy/differentiate/tests/test_differentiate.py +24 -25
  113. scipy/fft/_basic.py +20 -0
  114. scipy/fft/_helper.py +3 -34
  115. scipy/fft/_pocketfft/helper.py +29 -1
  116. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  117. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  118. scipy/fft/_realtransforms.py +13 -0
  119. scipy/fft/tests/test_basic.py +27 -25
  120. scipy/fft/tests/test_fftlog.py +16 -7
  121. scipy/fft/tests/test_helper.py +18 -34
  122. scipy/fft/tests/test_real_transforms.py +8 -10
  123. scipy/fftpack/convolve.cpython-312-darwin.so +0 -0
  124. scipy/fftpack/tests/test_basic.py +2 -4
  125. scipy/fftpack/tests/test_real_transforms.py +8 -9
  126. scipy/integrate/_bvp.py +9 -3
  127. scipy/integrate/_cubature.py +3 -2
  128. scipy/integrate/_dop.cpython-312-darwin.so +0 -0
  129. scipy/integrate/_ivp/common.py +3 -3
  130. scipy/integrate/_ivp/ivp.py +9 -2
  131. scipy/integrate/_ivp/tests/test_ivp.py +19 -0
  132. scipy/integrate/_lsoda.cpython-312-darwin.so +0 -0
  133. scipy/integrate/_ode.py +9 -2
  134. scipy/integrate/_odepack.cpython-312-darwin.so +0 -0
  135. scipy/integrate/_quad_vec.py +21 -29
  136. scipy/integrate/_quadpack.cpython-312-darwin.so +0 -0
  137. scipy/integrate/_quadpack_py.py +11 -7
  138. scipy/integrate/_quadrature.py +3 -3
  139. scipy/integrate/_rules/_base.py +2 -2
  140. scipy/integrate/_tanhsinh.py +57 -54
  141. scipy/integrate/_test_odeint_banded.cpython-312-darwin.so +0 -0
  142. scipy/integrate/_vode.cpython-312-darwin.so +0 -0
  143. scipy/integrate/tests/test__quad_vec.py +0 -6
  144. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  145. scipy/integrate/tests/test_cubature.py +21 -35
  146. scipy/integrate/tests/test_quadrature.py +6 -8
  147. scipy/integrate/tests/test_tanhsinh.py +61 -43
  148. scipy/interpolate/__init__.py +70 -58
  149. scipy/interpolate/_bary_rational.py +22 -22
  150. scipy/interpolate/_bsplines.py +119 -66
  151. scipy/interpolate/_cubic.py +65 -50
  152. scipy/interpolate/_dfitpack.cpython-312-darwin.so +0 -0
  153. scipy/interpolate/_dierckx.cpython-312-darwin.so +0 -0
  154. scipy/interpolate/_fitpack.cpython-312-darwin.so +0 -0
  155. scipy/interpolate/_fitpack2.py +9 -6
  156. scipy/interpolate/_fitpack_impl.py +32 -26
  157. scipy/interpolate/_fitpack_repro.py +23 -19
  158. scipy/interpolate/_interpnd.cpython-312-darwin.so +0 -0
  159. scipy/interpolate/_interpolate.py +30 -12
  160. scipy/interpolate/_ndbspline.py +13 -18
  161. scipy/interpolate/_ndgriddata.py +5 -8
  162. scipy/interpolate/_polyint.py +95 -31
  163. scipy/interpolate/_ppoly.cpython-312-darwin.so +0 -0
  164. scipy/interpolate/_rbf.py +2 -2
  165. scipy/interpolate/_rbfinterp.py +1 -1
  166. scipy/interpolate/_rbfinterp_pythran.cpython-312-darwin.so +0 -0
  167. scipy/interpolate/_rgi.py +31 -26
  168. scipy/interpolate/_rgi_cython.cpython-312-darwin.so +0 -0
  169. scipy/interpolate/dfitpack.py +0 -20
  170. scipy/interpolate/interpnd.py +1 -2
  171. scipy/interpolate/tests/test_bary_rational.py +2 -2
  172. scipy/interpolate/tests/test_bsplines.py +97 -1
  173. scipy/interpolate/tests/test_fitpack2.py +39 -1
  174. scipy/interpolate/tests/test_interpnd.py +32 -20
  175. scipy/interpolate/tests/test_interpolate.py +48 -4
  176. scipy/interpolate/tests/test_rgi.py +2 -1
  177. scipy/io/_fast_matrix_market/__init__.py +2 -0
  178. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  179. scipy/io/_harwell_boeing/hb.py +7 -11
  180. scipy/io/_idl.py +5 -7
  181. scipy/io/_netcdf.py +15 -5
  182. scipy/io/_test_fortran.cpython-312-darwin.so +0 -0
  183. scipy/io/arff/tests/test_arffread.py +3 -3
  184. scipy/io/matlab/__init__.py +5 -3
  185. scipy/io/matlab/_mio.py +4 -1
  186. scipy/io/matlab/_mio5.py +19 -13
  187. scipy/io/matlab/_mio5_utils.cpython-312-darwin.so +0 -0
  188. scipy/io/matlab/_mio_utils.cpython-312-darwin.so +0 -0
  189. scipy/io/matlab/_miobase.py +4 -1
  190. scipy/io/matlab/_streams.cpython-312-darwin.so +0 -0
  191. scipy/io/matlab/tests/test_mio.py +46 -18
  192. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  193. scipy/io/tests/test_mmio.py +7 -1
  194. scipy/io/tests/test_wavfile.py +41 -0
  195. scipy/io/wavfile.py +57 -10
  196. scipy/linalg/_basic.py +113 -86
  197. scipy/linalg/_cythonized_array_utils.cpython-312-darwin.so +0 -0
  198. scipy/linalg/_decomp.py +22 -9
  199. scipy/linalg/_decomp_cholesky.py +28 -13
  200. scipy/linalg/_decomp_cossin.py +45 -30
  201. scipy/linalg/_decomp_interpolative.cpython-312-darwin.so +0 -0
  202. scipy/linalg/_decomp_ldl.py +4 -1
  203. scipy/linalg/_decomp_lu.py +18 -6
  204. scipy/linalg/_decomp_lu_cython.cpython-312-darwin.so +0 -0
  205. scipy/linalg/_decomp_polar.py +2 -0
  206. scipy/linalg/_decomp_qr.py +6 -2
  207. scipy/linalg/_decomp_qz.py +3 -0
  208. scipy/linalg/_decomp_schur.py +3 -1
  209. scipy/linalg/_decomp_svd.py +13 -2
  210. scipy/linalg/_decomp_update.cpython-312-darwin.so +0 -0
  211. scipy/linalg/_expm_frechet.py +4 -0
  212. scipy/linalg/_fblas.cpython-312-darwin.so +0 -0
  213. scipy/linalg/_flapack.cpython-312-darwin.so +0 -0
  214. scipy/linalg/_linalg_pythran.cpython-312-darwin.so +0 -0
  215. scipy/linalg/_matfuncs.py +187 -4
  216. scipy/linalg/_matfuncs_expm.cpython-312-darwin.so +0 -0
  217. scipy/linalg/_matfuncs_schur_sqrtm.cpython-312-darwin.so +0 -0
  218. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  219. scipy/linalg/_matfuncs_sqrtm_triu.cpython-312-darwin.so +0 -0
  220. scipy/linalg/_procrustes.py +2 -0
  221. scipy/linalg/_sketches.py +17 -6
  222. scipy/linalg/_solve_toeplitz.cpython-312-darwin.so +0 -0
  223. scipy/linalg/_solvers.py +7 -2
  224. scipy/linalg/_special_matrices.py +26 -36
  225. scipy/linalg/blas.py +35 -24
  226. scipy/linalg/cython_blas.cpython-312-darwin.so +0 -0
  227. scipy/linalg/cython_lapack.cpython-312-darwin.so +0 -0
  228. scipy/linalg/lapack.py +22 -2
  229. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  230. scipy/linalg/tests/test_basic.py +31 -16
  231. scipy/linalg/tests/test_batch.py +588 -0
  232. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  233. scipy/linalg/tests/test_decomp.py +40 -3
  234. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  235. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  236. scipy/linalg/tests/test_interpolative.py +17 -0
  237. scipy/linalg/tests/test_lapack.py +115 -7
  238. scipy/linalg/tests/test_matfuncs.py +157 -102
  239. scipy/linalg/tests/test_procrustes.py +0 -7
  240. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  241. scipy/linalg/tests/test_special_matrices.py +1 -5
  242. scipy/ndimage/__init__.py +1 -0
  243. scipy/ndimage/_cytest.cpython-312-darwin.so +0 -0
  244. scipy/ndimage/_delegators.py +8 -2
  245. scipy/ndimage/_filters.py +453 -5
  246. scipy/ndimage/_interpolation.py +36 -6
  247. scipy/ndimage/_measurements.py +4 -2
  248. scipy/ndimage/_morphology.py +5 -0
  249. scipy/ndimage/_nd_image.cpython-312-darwin.so +0 -0
  250. scipy/ndimage/_ndimage_api.py +2 -1
  251. scipy/ndimage/_ni_docstrings.py +5 -1
  252. scipy/ndimage/_ni_label.cpython-312-darwin.so +0 -0
  253. scipy/ndimage/_ni_support.py +1 -5
  254. scipy/ndimage/_rank_filter_1d.cpython-312-darwin.so +0 -0
  255. scipy/ndimage/_support_alternative_backends.py +18 -6
  256. scipy/ndimage/tests/test_filters.py +384 -259
  257. scipy/ndimage/tests/test_fourier.py +7 -9
  258. scipy/ndimage/tests/test_interpolation.py +68 -61
  259. scipy/ndimage/tests/test_measurements.py +18 -35
  260. scipy/ndimage/tests/test_morphology.py +143 -131
  261. scipy/ndimage/tests/test_splines.py +1 -3
  262. scipy/odr/__odrpack.cpython-312-darwin.so +0 -0
  263. scipy/optimize/_basinhopping.py +13 -7
  264. scipy/optimize/_bglu_dense.cpython-312-darwin.so +0 -0
  265. scipy/optimize/_bracket.py +46 -26
  266. scipy/optimize/_chandrupatla.py +9 -10
  267. scipy/optimize/_cobyla_py.py +104 -123
  268. scipy/optimize/_constraints.py +14 -10
  269. scipy/optimize/_differentiable_functions.py +371 -230
  270. scipy/optimize/_differentialevolution.py +4 -3
  271. scipy/optimize/_direct.cpython-312-darwin.so +0 -0
  272. scipy/optimize/_dual_annealing.py +1 -1
  273. scipy/optimize/_elementwise.py +1 -4
  274. scipy/optimize/_group_columns.cpython-312-darwin.so +0 -0
  275. scipy/optimize/_highspy/_highs_wrapper.py +6 -4
  276. scipy/optimize/_lbfgsb.cpython-312-darwin.so +0 -0
  277. scipy/optimize/_lbfgsb_py.py +80 -24
  278. scipy/optimize/_linprog_doc.py +2 -2
  279. scipy/optimize/_linprog_highs.py +11 -11
  280. scipy/optimize/_linprog_ip.py +25 -10
  281. scipy/optimize/_linprog_util.py +18 -19
  282. scipy/optimize/_lsap.cpython-312-darwin.so +0 -0
  283. scipy/optimize/_lsq/common.py +3 -3
  284. scipy/optimize/_lsq/dogbox.py +16 -2
  285. scipy/optimize/_lsq/givens_elimination.cpython-312-darwin.so +0 -0
  286. scipy/optimize/_lsq/least_squares.py +198 -126
  287. scipy/optimize/_lsq/lsq_linear.py +6 -6
  288. scipy/optimize/_lsq/trf.py +35 -8
  289. scipy/optimize/_milp.py +3 -1
  290. scipy/optimize/_minimize.py +105 -36
  291. scipy/optimize/_minpack.cpython-312-darwin.so +0 -0
  292. scipy/optimize/_minpack_py.py +21 -14
  293. scipy/optimize/_moduleTNC.cpython-312-darwin.so +0 -0
  294. scipy/optimize/_nnls.py +20 -21
  295. scipy/optimize/_nonlin.py +34 -3
  296. scipy/optimize/_numdiff.py +288 -110
  297. scipy/optimize/_optimize.py +86 -48
  298. scipy/optimize/_pava_pybind.cpython-312-darwin.so +0 -0
  299. scipy/optimize/_remove_redundancy.py +5 -5
  300. scipy/optimize/_root_scalar.py +1 -1
  301. scipy/optimize/_shgo.py +6 -0
  302. scipy/optimize/_shgo_lib/_complex.py +1 -1
  303. scipy/optimize/_slsqp_py.py +216 -124
  304. scipy/optimize/_slsqplib.cpython-312-darwin.so +0 -0
  305. scipy/optimize/_spectral.py +1 -1
  306. scipy/optimize/_tnc.py +8 -1
  307. scipy/optimize/_trlib/_trlib.cpython-312-darwin.so +0 -0
  308. scipy/optimize/_trustregion.py +20 -6
  309. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  310. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  311. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  312. scipy/optimize/_trustregion_constr/projections.py +12 -8
  313. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  314. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  315. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  316. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  317. scipy/optimize/_trustregion_exact.py +0 -1
  318. scipy/optimize/_zeros.cpython-312-darwin.so +0 -0
  319. scipy/optimize/_zeros_py.py +97 -17
  320. scipy/optimize/cython_optimize/_zeros.cpython-312-darwin.so +0 -0
  321. scipy/optimize/slsqp.py +0 -1
  322. scipy/optimize/tests/test__basinhopping.py +1 -1
  323. scipy/optimize/tests/test__differential_evolution.py +4 -4
  324. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  325. scipy/optimize/tests/test__numdiff.py +66 -22
  326. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  327. scipy/optimize/tests/test__shgo.py +9 -1
  328. scipy/optimize/tests/test_bracket.py +71 -46
  329. scipy/optimize/tests/test_chandrupatla.py +133 -135
  330. scipy/optimize/tests/test_cobyla.py +74 -45
  331. scipy/optimize/tests/test_constraints.py +1 -1
  332. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  333. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  334. scipy/optimize/tests/test_least_squares.py +125 -13
  335. scipy/optimize/tests/test_linear_assignment.py +3 -3
  336. scipy/optimize/tests/test_linprog.py +3 -3
  337. scipy/optimize/tests/test_lsq_linear.py +6 -6
  338. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  339. scipy/optimize/tests/test_minpack.py +4 -4
  340. scipy/optimize/tests/test_nnls.py +43 -3
  341. scipy/optimize/tests/test_nonlin.py +36 -0
  342. scipy/optimize/tests/test_optimize.py +98 -20
  343. scipy/optimize/tests/test_slsqp.py +36 -4
  344. scipy/optimize/tests/test_zeros.py +34 -1
  345. scipy/signal/__init__.py +12 -23
  346. scipy/signal/_delegators.py +568 -0
  347. scipy/signal/_filter_design.py +459 -241
  348. scipy/signal/_fir_filter_design.py +262 -90
  349. scipy/signal/_lti_conversion.py +3 -2
  350. scipy/signal/_ltisys.py +118 -91
  351. scipy/signal/_max_len_seq_inner.cpython-312-darwin.so +0 -0
  352. scipy/signal/_peak_finding_utils.cpython-312-darwin.so +0 -0
  353. scipy/signal/_polyutils.py +172 -0
  354. scipy/signal/_short_time_fft.py +553 -76
  355. scipy/signal/_signal_api.py +30 -0
  356. scipy/signal/_signaltools.py +719 -396
  357. scipy/signal/_sigtools.cpython-312-darwin.so +0 -0
  358. scipy/signal/_sosfilt.cpython-312-darwin.so +0 -0
  359. scipy/signal/_spectral_py.py +230 -50
  360. scipy/signal/_spline.cpython-312-darwin.so +0 -0
  361. scipy/signal/_spline_filters.py +108 -68
  362. scipy/signal/_support_alternative_backends.py +73 -0
  363. scipy/signal/_upfirdn.py +4 -1
  364. scipy/signal/_upfirdn_apply.cpython-312-darwin.so +0 -0
  365. scipy/signal/_waveforms.py +2 -11
  366. scipy/signal/_wavelets.py +1 -1
  367. scipy/signal/fir_filter_design.py +1 -0
  368. scipy/signal/spline.py +4 -11
  369. scipy/signal/tests/_scipy_spectral_test_shim.py +5 -182
  370. scipy/signal/tests/test_bsplines.py +114 -79
  371. scipy/signal/tests/test_cont2discrete.py +9 -2
  372. scipy/signal/tests/test_filter_design.py +721 -481
  373. scipy/signal/tests/test_fir_filter_design.py +332 -140
  374. scipy/signal/tests/test_savitzky_golay.py +4 -3
  375. scipy/signal/tests/test_short_time_fft.py +231 -5
  376. scipy/signal/tests/test_signaltools.py +2150 -1349
  377. scipy/signal/tests/test_spectral.py +50 -6
  378. scipy/signal/tests/test_splines.py +161 -96
  379. scipy/signal/tests/test_upfirdn.py +84 -50
  380. scipy/signal/tests/test_waveforms.py +20 -0
  381. scipy/signal/tests/test_windows.py +607 -466
  382. scipy/signal/windows/_windows.py +287 -148
  383. scipy/sparse/__init__.py +23 -4
  384. scipy/sparse/_base.py +269 -120
  385. scipy/sparse/_bsr.py +7 -4
  386. scipy/sparse/_compressed.py +59 -234
  387. scipy/sparse/_construct.py +90 -38
  388. scipy/sparse/_coo.py +115 -181
  389. scipy/sparse/_csc.py +4 -4
  390. scipy/sparse/_csparsetools.cpython-312-darwin.so +0 -0
  391. scipy/sparse/_csr.py +2 -2
  392. scipy/sparse/_data.py +48 -48
  393. scipy/sparse/_dia.py +105 -21
  394. scipy/sparse/_dok.py +0 -23
  395. scipy/sparse/_index.py +4 -4
  396. scipy/sparse/_matrix.py +23 -0
  397. scipy/sparse/_sparsetools.cpython-312-darwin.so +0 -0
  398. scipy/sparse/_sputils.py +37 -22
  399. scipy/sparse/base.py +0 -9
  400. scipy/sparse/bsr.py +0 -14
  401. scipy/sparse/compressed.py +0 -23
  402. scipy/sparse/construct.py +0 -6
  403. scipy/sparse/coo.py +0 -14
  404. scipy/sparse/csc.py +0 -3
  405. scipy/sparse/csgraph/_flow.cpython-312-darwin.so +0 -0
  406. scipy/sparse/csgraph/_matching.cpython-312-darwin.so +0 -0
  407. scipy/sparse/csgraph/_min_spanning_tree.cpython-312-darwin.so +0 -0
  408. scipy/sparse/csgraph/_reordering.cpython-312-darwin.so +0 -0
  409. scipy/sparse/csgraph/_shortest_path.cpython-312-darwin.so +0 -0
  410. scipy/sparse/csgraph/_tools.cpython-312-darwin.so +0 -0
  411. scipy/sparse/csgraph/_traversal.cpython-312-darwin.so +0 -0
  412. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  413. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  414. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  415. scipy/sparse/csr.py +0 -5
  416. scipy/sparse/data.py +1 -6
  417. scipy/sparse/dia.py +0 -7
  418. scipy/sparse/dok.py +0 -10
  419. scipy/sparse/linalg/_dsolve/_superlu.cpython-312-darwin.so +0 -0
  420. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  421. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  422. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-312-darwin.so +0 -0
  423. scipy/sparse/linalg/_eigen/arpack/arpack.py +28 -20
  424. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  425. scipy/sparse/linalg/_expm_multiply.py +8 -3
  426. scipy/sparse/linalg/_interface.py +29 -26
  427. scipy/sparse/linalg/_isolve/_gcrotmk.py +6 -5
  428. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  429. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  430. scipy/sparse/linalg/_isolve/minres.py +5 -5
  431. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  432. scipy/sparse/linalg/_isolve/utils.py +2 -8
  433. scipy/sparse/linalg/_matfuncs.py +1 -1
  434. scipy/sparse/linalg/_norm.py +1 -1
  435. scipy/sparse/linalg/_propack/_cpropack.cpython-312-darwin.so +0 -0
  436. scipy/sparse/linalg/_propack/_dpropack.cpython-312-darwin.so +0 -0
  437. scipy/sparse/linalg/_propack/_spropack.cpython-312-darwin.so +0 -0
  438. scipy/sparse/linalg/_propack/_zpropack.cpython-312-darwin.so +0 -0
  439. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  440. scipy/sparse/linalg/tests/test_expm_multiply.py +10 -0
  441. scipy/sparse/linalg/tests/test_interface.py +35 -0
  442. scipy/sparse/linalg/tests/test_pydata_sparse.py +18 -0
  443. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  444. scipy/sparse/tests/test_base.py +224 -40
  445. scipy/sparse/tests/test_common1d.py +17 -12
  446. scipy/sparse/tests/test_construct.py +1 -1
  447. scipy/sparse/tests/test_coo.py +272 -4
  448. scipy/sparse/tests/test_sparsetools.py +5 -0
  449. scipy/sparse/tests/test_sputils.py +36 -7
  450. scipy/spatial/_ckdtree.cpython-312-darwin.so +0 -0
  451. scipy/spatial/_distance_pybind.cpython-312-darwin.so +0 -0
  452. scipy/spatial/_distance_wrap.cpython-312-darwin.so +0 -0
  453. scipy/spatial/_hausdorff.cpython-312-darwin.so +0 -0
  454. scipy/spatial/_qhull.cpython-312-darwin.so +0 -0
  455. scipy/spatial/_voronoi.cpython-312-darwin.so +0 -0
  456. scipy/spatial/distance.py +49 -42
  457. scipy/spatial/tests/test_distance.py +15 -1
  458. scipy/spatial/tests/test_kdtree.py +1 -0
  459. scipy/spatial/tests/test_qhull.py +106 -2
  460. scipy/spatial/transform/__init__.py +5 -3
  461. scipy/spatial/transform/_rigid_transform.cpython-312-darwin.so +0 -0
  462. scipy/spatial/transform/_rotation.cpython-312-darwin.so +0 -0
  463. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  464. scipy/spatial/transform/tests/test_rotation.py +1342 -790
  465. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  466. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  467. scipy/special/__init__.py +1 -47
  468. scipy/special/_add_newdocs.py +34 -772
  469. scipy/special/_basic.py +22 -25
  470. scipy/special/_comb.cpython-312-darwin.so +0 -0
  471. scipy/special/_ellip_harm_2.cpython-312-darwin.so +0 -0
  472. scipy/special/_gufuncs.cpython-312-darwin.so +0 -0
  473. scipy/special/_logsumexp.py +83 -69
  474. scipy/special/_orthogonal.pyi +1 -1
  475. scipy/special/_specfun.cpython-312-darwin.so +0 -0
  476. scipy/special/_special_ufuncs.cpython-312-darwin.so +0 -0
  477. scipy/special/_spherical_bessel.py +4 -4
  478. scipy/special/_support_alternative_backends.py +212 -119
  479. scipy/special/_test_internal.cpython-312-darwin.so +0 -0
  480. scipy/special/_testutils.py +4 -4
  481. scipy/special/_ufuncs.cpython-312-darwin.so +0 -0
  482. scipy/special/_ufuncs.pyi +1 -0
  483. scipy/special/_ufuncs.pyx +215 -1400
  484. scipy/special/_ufuncs_cxx.cpython-312-darwin.so +0 -0
  485. scipy/special/_ufuncs_cxx.pxd +2 -15
  486. scipy/special/_ufuncs_cxx.pyx +5 -44
  487. scipy/special/_ufuncs_cxx_defs.h +2 -16
  488. scipy/special/_ufuncs_defs.h +0 -8
  489. scipy/special/cython_special.cpython-312-darwin.so +0 -0
  490. scipy/special/cython_special.pxd +1 -1
  491. scipy/special/tests/_cython_examples/meson.build +10 -1
  492. scipy/special/tests/test_basic.py +153 -20
  493. scipy/special/tests/test_boost_ufuncs.py +3 -0
  494. scipy/special/tests/test_cdflib.py +35 -11
  495. scipy/special/tests/test_gammainc.py +16 -0
  496. scipy/special/tests/test_hyp2f1.py +23 -2
  497. scipy/special/tests/test_log1mexp.py +85 -0
  498. scipy/special/tests/test_logsumexp.py +220 -64
  499. scipy/special/tests/test_mpmath.py +1 -0
  500. scipy/special/tests/test_nan_inputs.py +1 -1
  501. scipy/special/tests/test_orthogonal.py +17 -18
  502. scipy/special/tests/test_sf_error.py +3 -2
  503. scipy/special/tests/test_sph_harm.py +6 -7
  504. scipy/special/tests/test_support_alternative_backends.py +211 -76
  505. scipy/stats/__init__.py +4 -1
  506. scipy/stats/_ansari_swilk_statistics.cpython-312-darwin.so +0 -0
  507. scipy/stats/_axis_nan_policy.py +5 -12
  508. scipy/stats/_biasedurn.cpython-312-darwin.so +0 -0
  509. scipy/stats/_continued_fraction.py +387 -0
  510. scipy/stats/_continuous_distns.py +296 -319
  511. scipy/stats/_correlation.py +1 -1
  512. scipy/stats/_covariance.py +6 -3
  513. scipy/stats/_discrete_distns.py +39 -32
  514. scipy/stats/_distn_infrastructure.py +39 -12
  515. scipy/stats/_distribution_infrastructure.py +920 -238
  516. scipy/stats/_entropy.py +9 -10
  517. scipy/{_lib → stats}/_finite_differences.py +1 -1
  518. scipy/stats/_hypotests.py +83 -50
  519. scipy/stats/_kde.py +53 -49
  520. scipy/stats/_ksstats.py +1 -1
  521. scipy/stats/_levy_stable/__init__.py +7 -15
  522. scipy/stats/_levy_stable/levyst.cpython-312-darwin.so +0 -0
  523. scipy/stats/_morestats.py +118 -73
  524. scipy/stats/_mstats_basic.py +13 -17
  525. scipy/stats/_mstats_extras.py +8 -8
  526. scipy/stats/_multivariate.py +89 -113
  527. scipy/stats/_new_distributions.py +97 -20
  528. scipy/stats/_page_trend_test.py +12 -5
  529. scipy/stats/_probability_distribution.py +265 -43
  530. scipy/stats/_qmc.py +14 -9
  531. scipy/stats/_qmc_cy.cpython-312-darwin.so +0 -0
  532. scipy/stats/_qmvnt.py +16 -95
  533. scipy/stats/_qmvnt_cy.cpython-312-darwin.so +0 -0
  534. scipy/stats/_quantile.py +335 -0
  535. scipy/stats/_rcont/rcont.cpython-312-darwin.so +0 -0
  536. scipy/stats/_resampling.py +5 -30
  537. scipy/stats/_sampling.py +1 -1
  538. scipy/stats/_sobol.cpython-312-darwin.so +0 -0
  539. scipy/stats/_stats.cpython-312-darwin.so +0 -0
  540. scipy/stats/_stats_mstats_common.py +21 -2
  541. scipy/stats/_stats_py.py +551 -477
  542. scipy/stats/_stats_pythran.cpython-312-darwin.so +0 -0
  543. scipy/stats/_unuran/unuran_wrapper.cpython-312-darwin.so +0 -0
  544. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  545. scipy/stats/_variation.py +6 -8
  546. scipy/stats/_wilcoxon.py +13 -7
  547. scipy/stats/tests/common_tests.py +6 -4
  548. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  549. scipy/stats/tests/test_continued_fraction.py +173 -0
  550. scipy/stats/tests/test_continuous.py +379 -60
  551. scipy/stats/tests/test_continuous_basic.py +18 -12
  552. scipy/stats/tests/test_discrete_basic.py +14 -8
  553. scipy/stats/tests/test_discrete_distns.py +16 -16
  554. scipy/stats/tests/test_distributions.py +117 -75
  555. scipy/stats/tests/test_entropy.py +40 -48
  556. scipy/stats/tests/test_fit.py +4 -3
  557. scipy/stats/tests/test_hypotests.py +153 -24
  558. scipy/stats/tests/test_kdeoth.py +109 -41
  559. scipy/stats/tests/test_marray.py +289 -0
  560. scipy/stats/tests/test_morestats.py +81 -49
  561. scipy/stats/tests/test_mstats_basic.py +3 -3
  562. scipy/stats/tests/test_multivariate.py +434 -83
  563. scipy/stats/tests/test_qmc.py +13 -10
  564. scipy/stats/tests/test_quantile.py +199 -0
  565. scipy/stats/tests/test_rank.py +119 -112
  566. scipy/stats/tests/test_resampling.py +47 -56
  567. scipy/stats/tests/test_sampling.py +9 -4
  568. scipy/stats/tests/test_stats.py +799 -939
  569. scipy/stats/tests/test_variation.py +8 -6
  570. scipy/version.py +2 -2
  571. {scipy-1.15.2.dist-info → scipy-1.16.0.dist-info}/LICENSE.txt +4 -4
  572. {scipy-1.15.2.dist-info → scipy-1.16.0.dist-info}/METADATA +12 -12
  573. {scipy-1.15.2.dist-info → scipy-1.16.0.dist-info}/RECORD +574 -581
  574. scipy-1.16.0.dist-info/WHEEL +6 -0
  575. scipy/_lib/array_api_extra/_funcs.py +0 -484
  576. scipy/_lib/array_api_extra/_typing.py +0 -8
  577. scipy/interpolate/_bspl.cpython-312-darwin.so +0 -0
  578. scipy/optimize/_cobyla.cpython-312-darwin.so +0 -0
  579. scipy/optimize/_cython_nnls.cpython-312-darwin.so +0 -0
  580. scipy/optimize/_slsqp.cpython-312-darwin.so +0 -0
  581. scipy/spatial/qhull_src/COPYING.txt +0 -38
  582. scipy/special/libsf_error_state.dylib +0 -0
  583. scipy/special/tests/test_log_softmax.py +0 -109
  584. scipy/special/tests/test_xsf_cuda.py +0 -114
  585. scipy/special/xsf/binom.h +0 -89
  586. scipy/special/xsf/cdflib.h +0 -100
  587. scipy/special/xsf/cephes/airy.h +0 -307
  588. scipy/special/xsf/cephes/besselpoly.h +0 -51
  589. scipy/special/xsf/cephes/beta.h +0 -257
  590. scipy/special/xsf/cephes/cbrt.h +0 -131
  591. scipy/special/xsf/cephes/chbevl.h +0 -85
  592. scipy/special/xsf/cephes/chdtr.h +0 -193
  593. scipy/special/xsf/cephes/const.h +0 -87
  594. scipy/special/xsf/cephes/ellie.h +0 -293
  595. scipy/special/xsf/cephes/ellik.h +0 -251
  596. scipy/special/xsf/cephes/ellpe.h +0 -107
  597. scipy/special/xsf/cephes/ellpk.h +0 -117
  598. scipy/special/xsf/cephes/expn.h +0 -260
  599. scipy/special/xsf/cephes/gamma.h +0 -398
  600. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  601. scipy/special/xsf/cephes/hyperg.h +0 -361
  602. scipy/special/xsf/cephes/i0.h +0 -149
  603. scipy/special/xsf/cephes/i1.h +0 -158
  604. scipy/special/xsf/cephes/igam.h +0 -421
  605. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  606. scipy/special/xsf/cephes/igami.h +0 -313
  607. scipy/special/xsf/cephes/j0.h +0 -225
  608. scipy/special/xsf/cephes/j1.h +0 -198
  609. scipy/special/xsf/cephes/jv.h +0 -715
  610. scipy/special/xsf/cephes/k0.h +0 -164
  611. scipy/special/xsf/cephes/k1.h +0 -163
  612. scipy/special/xsf/cephes/kn.h +0 -243
  613. scipy/special/xsf/cephes/lanczos.h +0 -112
  614. scipy/special/xsf/cephes/ndtr.h +0 -275
  615. scipy/special/xsf/cephes/poch.h +0 -85
  616. scipy/special/xsf/cephes/polevl.h +0 -167
  617. scipy/special/xsf/cephes/psi.h +0 -194
  618. scipy/special/xsf/cephes/rgamma.h +0 -111
  619. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  620. scipy/special/xsf/cephes/shichi.h +0 -248
  621. scipy/special/xsf/cephes/sici.h +0 -224
  622. scipy/special/xsf/cephes/sindg.h +0 -221
  623. scipy/special/xsf/cephes/tandg.h +0 -139
  624. scipy/special/xsf/cephes/trig.h +0 -58
  625. scipy/special/xsf/cephes/unity.h +0 -186
  626. scipy/special/xsf/cephes/zeta.h +0 -172
  627. scipy/special/xsf/config.h +0 -304
  628. scipy/special/xsf/digamma.h +0 -205
  629. scipy/special/xsf/error.h +0 -57
  630. scipy/special/xsf/evalpoly.h +0 -47
  631. scipy/special/xsf/expint.h +0 -266
  632. scipy/special/xsf/hyp2f1.h +0 -694
  633. scipy/special/xsf/iv_ratio.h +0 -173
  634. scipy/special/xsf/lambertw.h +0 -150
  635. scipy/special/xsf/loggamma.h +0 -163
  636. scipy/special/xsf/sici.h +0 -200
  637. scipy/special/xsf/tools.h +0 -427
  638. scipy/special/xsf/trig.h +0 -164
  639. scipy/special/xsf/wright_bessel.h +0 -843
  640. scipy/special/xsf/zlog1.h +0 -35
  641. scipy/stats/_mvn.cpython-312-darwin.so +0 -0
  642. scipy-1.15.2.dist-info/WHEEL +0 -4
@@ -11,10 +11,8 @@ from scipy._lib._array_api import (
11
11
  np_compat,
12
12
  is_array_api_strict,
13
13
  )
14
- from scipy.conftest import array_api_compatible
15
-
16
14
  from scipy.integrate import cubature
17
-
15
+ from scipy.integrate._cubature import _InfiniteLimitsTransform
18
16
  from scipy.integrate._rules import (
19
17
  Rule, FixedRule,
20
18
  NestedFixedRule,
@@ -22,10 +20,8 @@ from scipy.integrate._rules import (
22
20
  GenzMalikCubature,
23
21
  )
24
22
 
25
- from scipy.integrate._cubature import _InfiniteLimitsTransform
26
-
27
- pytestmark = [pytest.mark.usefixtures("skip_xp_backends"),]
28
23
  skip_xp_backends = pytest.mark.skip_xp_backends
24
+ boolean_index_skip_reason = 'JAX/Dask arrays do not support boolean assignment.'
29
25
 
30
26
  # The integrands ``genz_malik_1980_*`` come from the paper:
31
27
  # A.C. Genz, A.A. Malik, Remarks on algorithm 006: An adaptive algorithm for
@@ -120,13 +116,10 @@ def genz_malik_1980_f_2_exact(a, b, alphas, betas, xp):
120
116
  a = xp.reshape(a, (*([1]*(len(alphas.shape) - 1)), ndim))
121
117
  b = xp.reshape(b, (*([1]*(len(alphas.shape) - 1)), ndim))
122
118
 
123
- # `xp` is the unwrapped namespace, so `.atan` won't work for `xp = np` and np<2.
124
- xp_test = array_namespace(a)
125
-
126
119
  return (
127
120
  (-1)**ndim * 1/xp.prod(alphas, axis=-1)
128
121
  * xp.prod(
129
- xp_test.atan((a - betas)/alphas) - xp_test.atan((b - betas)/alphas),
122
+ xp.atan((a - betas)/alphas) - xp.atan((b - betas)/alphas),
130
123
  axis=-1,
131
124
  )
132
125
  )
@@ -229,7 +222,9 @@ def _eval_indefinite_integral(F, a, b, xp):
229
222
 
230
223
  out = 0
231
224
  for ind in itertools.product(range(2), repeat=ndim):
232
- selected_points = xp.asarray([points[i, j] for i, j in zip(ind, range(ndim))])
225
+ selected_points = xp.asarray(
226
+ [float(points[i, j]) for i, j in zip(ind, range(ndim))]
227
+ )
233
228
  out += pow(-1, sum(ind) + ndim) * F(selected_points)
234
229
 
235
230
  return out
@@ -377,7 +372,6 @@ def f_with_problematic_points(x_arr, points, xp):
377
372
  return xp.ones(x_arr.shape[0])
378
373
 
379
374
 
380
- @array_api_compatible
381
375
  class TestCubature:
382
376
  """
383
377
  Tests related to the interface of `cubature`.
@@ -534,12 +528,13 @@ class TestCubature:
534
528
  "gk21",
535
529
  "genz-malik",
536
530
  ])
537
- @array_api_compatible
538
531
  class TestCubatureProblems:
539
532
  """
540
533
  Tests that `cubature` gives the correct answer.
541
534
  """
542
535
 
536
+ @skip_xp_backends("dask.array",
537
+ reason="Dask hangs/takes a long time for some test cases")
543
538
  @pytest.mark.parametrize("problem", [
544
539
  # -- f1 --
545
540
  (
@@ -786,6 +781,8 @@ class TestCubatureProblems:
786
781
  err_msg=f"estimate_error={res.error}, subdivisions={res.subdivisions}",
787
782
  )
788
783
 
784
+ @skip_xp_backends("dask.array",
785
+ reason="Dask hangs/takes a long time for some test cases")
789
786
  @pytest.mark.parametrize("problem", [
790
787
  (
791
788
  # Function to integrate, like `f(x, *args)`
@@ -973,10 +970,8 @@ class TestCubatureProblems:
973
970
  f"true_error={xp.abs(res.estimate - exact)}")
974
971
  assert res.status == "converged", err_msg
975
972
 
976
- @skip_xp_backends(
977
- "jax.numpy",
978
- reasons=["transforms make use of indexing assignment"],
979
- )
973
+ @pytest.mark.skip_xp_backends('jax.numpy', reason=boolean_index_skip_reason)
974
+ @pytest.mark.skip_xp_backends('dask.array', reason=boolean_index_skip_reason)
980
975
  @pytest.mark.parametrize("problem", [
981
976
  (
982
977
  # Function to integrate
@@ -1123,10 +1118,8 @@ class TestCubatureProblems:
1123
1118
  check_0d=False,
1124
1119
  )
1125
1120
 
1126
- @skip_xp_backends(
1127
- "jax.numpy",
1128
- reasons=["transforms make use of indexing assignment"],
1129
- )
1121
+ @pytest.mark.skip_xp_backends('jax.numpy', reason=boolean_index_skip_reason)
1122
+ @pytest.mark.skip_xp_backends('dask.array', reason=boolean_index_skip_reason)
1130
1123
  @pytest.mark.parametrize("problem", [
1131
1124
  (
1132
1125
  # Function to integrate
@@ -1197,7 +1190,6 @@ class TestCubatureProblems:
1197
1190
  )
1198
1191
 
1199
1192
 
1200
- @array_api_compatible
1201
1193
  class TestRules:
1202
1194
  """
1203
1195
  Tests related to the general Rule interface (currently private).
@@ -1238,7 +1230,6 @@ class TestRules:
1238
1230
  base_class.estimate(basic_1d_integrand, a, b, args=(xp,))
1239
1231
 
1240
1232
 
1241
- @array_api_compatible
1242
1233
  class TestRulesQuadrature:
1243
1234
  """
1244
1235
  Tests underlying quadrature rules (ndim == 1).
@@ -1311,7 +1302,6 @@ class TestRulesQuadrature:
1311
1302
  quadrature(1, xp=xp)
1312
1303
 
1313
1304
 
1314
- @array_api_compatible
1315
1305
  class TestRulesCubature:
1316
1306
  """
1317
1307
  Tests underlying cubature rules (ndim >= 2).
@@ -1333,11 +1323,8 @@ class TestRulesCubature:
1333
1323
  GenzMalikCubature(1, xp=xp)
1334
1324
 
1335
1325
 
1336
- @array_api_compatible
1337
- @skip_xp_backends(
1338
- "jax.numpy",
1339
- reasons=["transforms make use of indexing assignment"],
1340
- )
1326
+ @pytest.mark.skip_xp_backends('jax.numpy', reason=boolean_index_skip_reason)
1327
+ @pytest.mark.skip_xp_backends('dask.array', reason=boolean_index_skip_reason)
1341
1328
  class TestTransformations:
1342
1329
  @pytest.mark.parametrize(("a", "b", "points"), [
1343
1330
  (
@@ -1355,19 +1342,18 @@ class TestTransformations:
1355
1342
  transformation.
1356
1343
  """
1357
1344
 
1358
- xp_compat = array_namespace(xp.empty(0))
1359
1345
  points = [xp.asarray(p, dtype=xp.float64) for p in points]
1360
1346
 
1361
1347
  f_transformed = _InfiniteLimitsTransform(
1362
1348
  # Bind `points` and `xp` argument in f
1363
- lambda x: f_with_problematic_points(x, points, xp_compat),
1364
- xp.asarray(a, dtype=xp_compat.float64),
1365
- xp.asarray(b, dtype=xp_compat.float64),
1366
- xp=xp_compat,
1349
+ lambda x: f_with_problematic_points(x, points, xp),
1350
+ xp.asarray(a, dtype=xp.float64),
1351
+ xp.asarray(b, dtype=xp.float64),
1352
+ xp=xp,
1367
1353
  )
1368
1354
 
1369
1355
  for point in points:
1370
- transformed_point = f_transformed.inv(xp_compat.reshape(point, (1, -1)))
1356
+ transformed_point = f_transformed.inv(xp.reshape(point, (1, -1)))
1371
1357
 
1372
1358
  with pytest.raises(Exception, match="called with a problematic point"):
1373
1359
  f_transformed(transformed_point)
@@ -13,7 +13,7 @@ from scipy.integrate import (romb, newton_cotes,
13
13
  from scipy.integrate._quadrature import _cumulative_simpson_unequal_intervals
14
14
 
15
15
  from scipy import stats, special, integrate
16
- from scipy.conftest import array_api_compatible, skip_xp_invalid_arg
16
+ from scipy.conftest import skip_xp_invalid_arg
17
17
  from scipy._lib._array_api_no_0d import xp_assert_close
18
18
 
19
19
  skip_xp_backends = pytest.mark.skip_xp_backends
@@ -269,7 +269,6 @@ class TestCumulative_trapezoid:
269
269
  cumulative_trapezoid(y=[])
270
270
 
271
271
 
272
- @array_api_compatible
273
272
  class TestTrapezoid:
274
273
  def test_simple(self, xp):
275
274
  x = xp.arange(-10, 10, .1)
@@ -278,8 +277,7 @@ class TestTrapezoid:
278
277
  xp_assert_close(r, xp.asarray(1.0))
279
278
 
280
279
  @skip_xp_backends('jax.numpy',
281
- reasons=["JAX arrays do not support item assignment"])
282
- @pytest.mark.usefixtures("skip_xp_backends")
280
+ reason="JAX arrays do not support item assignment")
283
281
  def test_ndim(self, xp):
284
282
  x = xp.linspace(0, 1, 3)
285
283
  y = xp.linspace(0, 2, 8)
@@ -318,8 +316,7 @@ class TestTrapezoid:
318
316
  xp_assert_close(r, qz)
319
317
 
320
318
  @skip_xp_backends('jax.numpy',
321
- reasons=["JAX arrays do not support item assignment"])
322
- @pytest.mark.usefixtures("skip_xp_backends")
319
+ reason="JAX arrays do not support item assignment")
323
320
  def test_gh21908(self, xp):
324
321
  # extended testing for n-dim arrays
325
322
  x = xp.reshape(xp.linspace(0, 29, 30), (3, 10))
@@ -362,8 +359,7 @@ class TestTrapezoid:
362
359
  assert_allclose(trapezoid(y, xm), r)
363
360
 
364
361
  @skip_xp_backends(np_only=True,
365
- reasons=['array-likes only supported for NumPy backend'])
366
- @pytest.mark.usefixtures("skip_xp_backends")
362
+ reason='array-likes only supported for NumPy backend')
367
363
  def test_array_like(self, xp):
368
364
  x = list(range(5))
369
365
  y = [t * t for t in x]
@@ -635,6 +631,7 @@ class TestCumulativeSimpson:
635
631
  # `simpson` uses the trapezoidal rule
636
632
  return theoretical_difference
637
633
 
634
+ @pytest.mark.fail_slow(10)
638
635
  @pytest.mark.thread_unsafe
639
636
  @pytest.mark.slow
640
637
  @given(
@@ -666,6 +663,7 @@ class TestCumulativeSimpson:
666
663
  res[..., 1:], ref[..., 1:] + theoretical_difference[..., 1:], atol=1e-16
667
664
  )
668
665
 
666
+ @pytest.mark.fail_slow(10)
669
667
  @pytest.mark.thread_unsafe
670
668
  @pytest.mark.slow
671
669
  @given(
@@ -6,7 +6,6 @@ import math
6
6
  import numpy as np
7
7
  from numpy.testing import assert_allclose
8
8
 
9
- from scipy.conftest import array_api_compatible
10
9
  import scipy._lib._elementwise_iterative_method as eim
11
10
  from scipy._lib._array_api_no_0d import xp_assert_close, xp_assert_equal
12
11
  from scipy._lib._array_api import array_namespace, xp_size, xp_ravel, xp_copy, is_numpy
@@ -20,6 +19,7 @@ def norm_pdf(x, xp=None):
20
19
  xp = array_namespace(x) if xp is None else xp
21
20
  return 1/(2*xp.pi)**0.5 * xp.exp(-x**2/2)
22
21
 
22
+
23
23
  def norm_logpdf(x, xp=None):
24
24
  xp = array_namespace(x) if xp is None else xp
25
25
  return -0.5*math.log(2*xp.pi) - x**2/2
@@ -43,11 +43,12 @@ def _vectorize(xp):
43
43
  return decorator
44
44
 
45
45
 
46
- @array_api_compatible
47
- @pytest.mark.usefixtures("skip_xp_backends")
48
46
  @pytest.mark.skip_xp_backends(
49
47
  'array_api_strict', reason='Currently uses fancy indexing assignment.'
50
48
  )
49
+ @pytest.mark.skip_xp_backends(
50
+ 'dask.array', reason='boolean indexing assignment'
51
+ )
51
52
  @pytest.mark.skip_xp_backends(
52
53
  'jax.numpy', reason='JAX arrays do not support item assignment.'
53
54
  )
@@ -233,11 +234,11 @@ class TestTanhSinh:
233
234
  logres = _tanhsinh(norm_logpdf, *limits, log=True)
234
235
  xp_assert_close(xp.exp(logres.integral), ref, check_dtype=False)
235
236
  # Transformation should not make the result complex unnecessarily
236
- xp_test = array_namespace(*limits) # we need xp.isdtype
237
- assert (xp_test.isdtype(logres.integral.dtype, "real floating") if ref > 0
238
- else xp_test.isdtype(logres.integral.dtype, "complex floating"))
237
+ assert (xp.isdtype(logres.integral.dtype, "real floating") if ref > 0
238
+ else xp.isdtype(logres.integral.dtype, "complex floating"))
239
239
 
240
- xp_assert_close(xp.exp(logres.error), res.error, atol=1e-16, check_dtype=False)
240
+ atol = 2 * xp.finfo(res.error.dtype).eps
241
+ xp_assert_close(xp.exp(logres.error), res.error, atol=atol, check_dtype=False)
241
242
 
242
243
  # 15 skipped intentionally; it's very difficult numerically
243
244
  @pytest.mark.skip_xp_backends(np_only=True,
@@ -248,7 +249,7 @@ class TestTanhSinh:
248
249
  rtol = 2e-8
249
250
  res = _tanhsinh(f, 0, f.b, rtol=rtol)
250
251
  assert_allclose(res.integral, f.ref, rtol=rtol)
251
- if f_number not in {14}: # mildly underestimates error here
252
+ if f_number not in {7, 12, 14}: # mildly underestimates error here
252
253
  true_error = abs(self.error(res.integral, f.ref)/res.integral)
253
254
  assert true_error < res.error
254
255
 
@@ -299,18 +300,17 @@ class TestTanhSinh:
299
300
  res = _tanhsinh(f, a, b, args=(p,))
300
301
  refs = _tanhsinh_single(a, b, p)
301
302
 
302
- xp_test = array_namespace(a) # need xp.stack, isdtype
303
303
  attrs = ['integral', 'error', 'success', 'status', 'nfev', 'maxlevel']
304
304
  for attr in attrs:
305
- ref_attr = xp_test.stack([getattr(ref, attr) for ref in refs])
305
+ ref_attr = xp.stack([getattr(ref, attr) for ref in refs])
306
306
  res_attr = xp_ravel(getattr(res, attr))
307
307
  xp_assert_close(res_attr, ref_attr, rtol=1e-15)
308
308
  assert getattr(res, attr).shape == shape
309
309
 
310
- assert xp_test.isdtype(res.success.dtype, 'bool')
311
- assert xp_test.isdtype(res.status.dtype, 'integral')
312
- assert xp_test.isdtype(res.nfev.dtype, 'integral')
313
- assert xp_test.isdtype(res.maxlevel.dtype, 'integral')
310
+ assert xp.isdtype(res.success.dtype, 'bool')
311
+ assert xp.isdtype(res.status.dtype, 'integral')
312
+ assert xp.isdtype(res.nfev.dtype, 'integral')
313
+ assert xp.isdtype(res.maxlevel.dtype, 'integral')
314
314
  assert xp.max(res.nfev) == f.feval
315
315
  # maxlevel = 2 -> 3 function calls (2 initialization, 1 work)
316
316
  assert xp.max(res.maxlevel) >= 2
@@ -383,12 +383,10 @@ class TestTanhSinh:
383
383
  def test_options_and_result_attributes(self, xp):
384
384
  # demonstrate that options are behaving as advertised and status
385
385
  # messages are as intended
386
- xp_test = array_namespace(xp.asarray(1.)) # need xp.atan
387
-
388
386
  def f(x):
389
387
  f.calls += 1
390
388
  f.feval += xp_size(xp.asarray(x))
391
- return x**2 * xp_test.atan(x)
389
+ return x**2 * xp.atan(x)
392
390
 
393
391
  f.ref = xp.asarray((math.pi - 2 + 2 * math.log(2)) / 12, dtype=xp.float64)
394
392
 
@@ -560,21 +558,18 @@ class TestTanhSinh:
560
558
  # integrand is evaluated or the integral/error estimates, only the
561
559
  # number of function calls
562
560
 
563
- # need `xp.concat`, `xp.atan`, and `xp.sort`
564
- xp_test = array_namespace(xp.asarray(1.))
565
-
566
561
  def f(x):
567
562
  f.calls += 1
568
563
  f.feval += xp_size(xp.asarray(x))
569
- f.x = xp_test.concat((f.x, xp_ravel(x)))
570
- return x**2 * xp_test.atan(x)
564
+ f.x = xp.concat((f.x, xp_ravel(x)))
565
+ return x**2 * xp.atan(x)
571
566
 
572
567
  f.feval, f.calls, f.x = 0, 0, xp.asarray([])
573
568
 
574
569
  a = xp.asarray(0, dtype=xp.float64)
575
570
  b = xp.asarray(1, dtype=xp.float64)
576
571
  ref = _tanhsinh(f, a, b, minlevel=0, maxlevel=maxlevel)
577
- ref_x = xp_test.sort(f.x)
572
+ ref_x = xp.sort(f.x)
578
573
 
579
574
  for minlevel in range(0, maxlevel + 1):
580
575
  f.feval, f.calls, f.x = 0, 0, xp.asarray([])
@@ -587,7 +582,7 @@ class TestTanhSinh:
587
582
  assert res.nfev == f.feval == f.x.shape[0]
588
583
  assert f.calls == maxlevel - minlevel + 1 + 1 # 1 validation call
589
584
  assert res.status == ref.status
590
- xp_assert_equal(ref_x, xp_test.sort(f.x))
585
+ xp_assert_equal(ref_x, xp.sort(f.x))
591
586
 
592
587
  def test_improper_integrals(self, xp):
593
588
  # Test handling of infinite limits of integration (mixed with finite limits)
@@ -679,10 +674,9 @@ class TestTanhSinh:
679
674
  def test_special_cases(self, xp):
680
675
  # Test edge cases and other special cases
681
676
  a, b = xp.asarray(0), xp.asarray(1)
682
- xp_test = array_namespace(a, b) # need `xp.isdtype`
683
677
 
684
678
  def f(x):
685
- assert xp_test.isdtype(x.dtype, "real floating")
679
+ assert xp.isdtype(x.dtype, "real floating")
686
680
  return x
687
681
 
688
682
  res = _tanhsinh(f, a, b)
@@ -753,11 +747,30 @@ class TestTanhSinh:
753
747
  x[-1] = 1000
754
748
  _tanhsinh(np.sin, 1, x)
755
749
 
750
+ def test_gh_22681_finite_error(self, xp):
751
+ # gh-22681 noted a case in which the error was NaN on some platforms;
752
+ # check that this does in fact fail in CI.
753
+ c1 = complex(12, -10)
754
+ c2 = complex(12, 39)
755
+ def f(t):
756
+ return xp.sin(c1 * (1 - t) + c2 * t)
757
+ a, b = xp.asarray(0., dtype=xp.float64), xp.asarray(1., dtype=xp.float64)
758
+ ref = _tanhsinh(f, a, b, atol=0, rtol=0, maxlevel=10)
759
+ assert xp.isfinite(ref.error)
760
+ # Previously, tanhsinh would not detect convergence
761
+ res = _tanhsinh(f, a, b, rtol=1e-14)
762
+ assert res.success
763
+ assert res.maxlevel < 5
764
+ xp_assert_close(res.integral, ref.integral, rtol=1e-15)
765
+
756
766
 
757
- @array_api_compatible
758
- @pytest.mark.usefixtures("skip_xp_backends")
767
+ @pytest.mark.skip_xp_backends('torch', reason='data-apis/array-api-compat#271')
759
768
  @pytest.mark.skip_xp_backends('array_api_strict', reason='No fancy indexing.')
760
769
  @pytest.mark.skip_xp_backends('jax.numpy', reason='No mutation.')
770
+ @pytest.mark.skip_xp_backends(
771
+ 'dask.array',
772
+ reason='Data-dependent shapes in boolean index assignment'
773
+ )
761
774
  class TestNSum:
762
775
  rng = np.random.default_rng(5895448232066142650)
763
776
  p = rng.uniform(1, 10, size=10).tolist()
@@ -812,13 +825,21 @@ class TestNSum:
812
825
  with pytest.raises(ValueError, match=message):
813
826
  nsum(f, a, b, tolerances=dict(rtol=pytest))
814
827
 
815
- with np.errstate(all='ignore'):
828
+ with (np.errstate(all='ignore')):
816
829
  res = nsum(f, xp.asarray([np.nan, np.inf]), xp.asarray(1.))
817
- assert xp.all((res.status == -1) & xp.isnan(res.sum)
818
- & xp.isnan(res.error) & ~res.success & res.nfev == 1)
830
+ assert (res.status[0] == -1) and not res.success[0]
831
+ assert xp.isnan(res.sum[0]) and xp.isnan(res.error[0])
832
+ assert (res.status[1] == 0) and res.success[1]
833
+ assert res.sum[1] == res.error[1]
834
+ assert xp.all(res.nfev[0] == 1)
835
+
819
836
  res = nsum(f, xp.asarray(10.), xp.asarray([np.nan, 1]))
820
- assert xp.all((res.status == -1) & xp.isnan(res.sum)
821
- & xp.isnan(res.error) & ~res.success & res.nfev == 1)
837
+ assert (res.status[0] == -1) and not res.success[0]
838
+ assert xp.isnan(res.sum[0]) and xp.isnan(res.error[0])
839
+ assert (res.status[1] == 0) and res.success[1]
840
+ assert res.sum[1] == res.error[1]
841
+ assert xp.all(res.nfev[0] == 1)
842
+
822
843
  res = nsum(f, xp.asarray(1.), xp.asarray(10.),
823
844
  step=xp.asarray([xp.nan, -xp.inf, xp.inf, -1, 0]))
824
845
  assert xp.all((res.status == -1) & xp.isnan(res.sum)
@@ -852,8 +873,7 @@ class TestNSum:
852
873
  res = nsum(f, a, b, args=args)
853
874
  xp_assert_close(res.sum, ref)
854
875
  xp_assert_equal(res.status, xp.zeros(ref.shape, dtype=xp.int32))
855
- xp_test = array_namespace(a) # CuPy doesn't have `bool`
856
- xp_assert_equal(res.success, xp.ones(ref.shape, dtype=xp_test.bool))
876
+ xp_assert_equal(res.success, xp.ones(ref.shape, dtype=xp.bool))
857
877
 
858
878
  with np.errstate(divide='ignore'):
859
879
  logres = nsum(lambda *args: xp.log(f(*args)),
@@ -891,8 +911,7 @@ class TestNSum:
891
911
  ref_err = (high - low)/2 # error (assuming perfect quadrature)
892
912
 
893
913
  # correct reference values where number of terms < maxterms
894
- xp_test = array_namespace(a) # torch needs broadcast_arrays
895
- a, b, step = xp_test.broadcast_arrays(a, b, step)
914
+ a, b, step = xp.broadcast_arrays(a, b, step)
896
915
  for i in np.ndindex(a.shape):
897
916
  ai, bi, stepi = float(a[i]), float(b[i]), float(step[i])
898
917
  if (bi - ai)/stepi + 1 <= maxterms:
@@ -949,10 +968,9 @@ class TestNSum:
949
968
  xp_assert_close(xp_ravel(res_attr), xp.asarray(ref_attr), rtol=1e-15)
950
969
  assert res_attr.shape == shape
951
970
 
952
- xp_test = array_namespace(xp.asarray(1.))
953
- assert xp_test.isdtype(res.success.dtype, 'bool')
954
- assert xp_test.isdtype(res.status.dtype, 'integral')
955
- assert xp_test.isdtype(res.nfev.dtype, 'integral')
971
+ assert xp.isdtype(res.success.dtype, 'bool')
972
+ assert xp.isdtype(res.status.dtype, 'integral')
973
+ assert xp.isdtype(res.nfev.dtype, 'integral')
956
974
  if is_numpy(xp): # other libraries might have different number
957
975
  assert int(xp.max(res.nfev)) == f.feval
958
976
 
@@ -1074,8 +1092,8 @@ class TestNSum:
1074
1092
  return 1 / x
1075
1093
 
1076
1094
  res = nsum(f, xp.asarray(0), xp.asarray(10), maxterms=0)
1077
- assert xp.isnan(res.sum)
1078
- assert xp.isnan(res.error)
1095
+ assert xp.isinf(res.sum)
1096
+ assert xp.isinf(res.error)
1079
1097
  assert res.status == -2
1080
1098
 
1081
1099
  res = nsum(f, xp.asarray(0), xp.asarray(10), maxterms=1)