scipy 1.15.3__cp313-cp313t-macosx_14_0_arm64.whl → 1.16.0rc2__cp313-cp313t-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 (627) hide show
  1. scipy/__config__.py +3 -3
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cpython-313t-darwin.so +0 -0
  4. scipy/_lib/_array_api.py +486 -161
  5. scipy/_lib/_array_api_compat_vendor.py +9 -0
  6. scipy/_lib/_bunch.py +4 -0
  7. scipy/_lib/_ccallback_c.cpython-313t-darwin.so +0 -0
  8. scipy/_lib/_docscrape.py +1 -1
  9. scipy/_lib/_elementwise_iterative_method.py +15 -26
  10. scipy/_lib/_sparse.py +41 -0
  11. scipy/_lib/_test_deprecation_call.cpython-313t-darwin.so +0 -0
  12. scipy/_lib/_testutils.py +6 -2
  13. scipy/_lib/_util.py +222 -125
  14. scipy/_lib/array_api_compat/__init__.py +4 -4
  15. scipy/_lib/array_api_compat/_internal.py +19 -6
  16. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  17. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  18. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  19. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  20. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  21. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  22. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  23. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  24. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  25. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  26. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  27. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  28. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  29. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  30. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  31. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  32. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  33. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  34. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  35. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  36. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  37. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  38. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  39. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  40. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  41. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  42. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  43. scipy/_lib/array_api_extra/__init__.py +26 -3
  44. scipy/_lib/array_api_extra/_delegation.py +171 -0
  45. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  46. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  47. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  48. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  49. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  50. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  51. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  52. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  53. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  54. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  57. scipy/_lib/array_api_extra/testing.py +359 -0
  58. scipy/_lib/decorator.py +2 -2
  59. scipy/_lib/doccer.py +1 -7
  60. scipy/_lib/messagestream.cpython-313t-darwin.so +0 -0
  61. scipy/_lib/pyprima/__init__.py +212 -0
  62. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  63. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  64. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  65. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  66. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  67. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  68. scipy/_lib/pyprima/cobyla/update.py +289 -0
  69. scipy/_lib/pyprima/common/__init__.py +0 -0
  70. scipy/_lib/pyprima/common/_bounds.py +34 -0
  71. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  72. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  73. scipy/_lib/pyprima/common/_project.py +173 -0
  74. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  75. scipy/_lib/pyprima/common/consts.py +47 -0
  76. scipy/_lib/pyprima/common/evaluate.py +99 -0
  77. scipy/_lib/pyprima/common/history.py +38 -0
  78. scipy/_lib/pyprima/common/infos.py +30 -0
  79. scipy/_lib/pyprima/common/linalg.py +435 -0
  80. scipy/_lib/pyprima/common/message.py +290 -0
  81. scipy/_lib/pyprima/common/powalg.py +131 -0
  82. scipy/_lib/pyprima/common/preproc.py +277 -0
  83. scipy/_lib/pyprima/common/present.py +5 -0
  84. scipy/_lib/pyprima/common/ratio.py +54 -0
  85. scipy/_lib/pyprima/common/redrho.py +47 -0
  86. scipy/_lib/pyprima/common/selectx.py +296 -0
  87. scipy/_lib/tests/test__util.py +105 -121
  88. scipy/_lib/tests/test_array_api.py +166 -35
  89. scipy/_lib/tests/test_bunch.py +7 -0
  90. scipy/_lib/tests/test_ccallback.py +2 -10
  91. scipy/_lib/tests/test_public_api.py +13 -0
  92. scipy/cluster/_hierarchy.cpython-313t-darwin.so +0 -0
  93. scipy/cluster/_optimal_leaf_ordering.cpython-313t-darwin.so +0 -0
  94. scipy/cluster/_vq.cpython-313t-darwin.so +0 -0
  95. scipy/cluster/hierarchy.py +393 -223
  96. scipy/cluster/tests/test_hierarchy.py +273 -335
  97. scipy/cluster/tests/test_vq.py +45 -61
  98. scipy/cluster/vq.py +39 -35
  99. scipy/conftest.py +263 -157
  100. scipy/constants/_constants.py +4 -1
  101. scipy/constants/tests/test_codata.py +2 -2
  102. scipy/constants/tests/test_constants.py +11 -18
  103. scipy/datasets/_download_all.py +15 -1
  104. scipy/datasets/_fetchers.py +7 -1
  105. scipy/datasets/_utils.py +1 -1
  106. scipy/differentiate/_differentiate.py +25 -25
  107. scipy/differentiate/tests/test_differentiate.py +24 -25
  108. scipy/fft/_basic.py +20 -0
  109. scipy/fft/_helper.py +3 -34
  110. scipy/fft/_pocketfft/helper.py +29 -1
  111. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  112. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  113. scipy/fft/_realtransforms.py +13 -0
  114. scipy/fft/tests/test_basic.py +27 -25
  115. scipy/fft/tests/test_fftlog.py +16 -7
  116. scipy/fft/tests/test_helper.py +18 -34
  117. scipy/fft/tests/test_real_transforms.py +8 -10
  118. scipy/fftpack/convolve.cpython-313t-darwin.so +0 -0
  119. scipy/fftpack/tests/test_basic.py +2 -4
  120. scipy/fftpack/tests/test_real_transforms.py +8 -9
  121. scipy/integrate/_bvp.py +9 -3
  122. scipy/integrate/_cubature.py +3 -2
  123. scipy/integrate/_dop.cpython-313t-darwin.so +0 -0
  124. scipy/integrate/_lsoda.cpython-313t-darwin.so +0 -0
  125. scipy/integrate/_ode.py +9 -2
  126. scipy/integrate/_odepack.cpython-313t-darwin.so +0 -0
  127. scipy/integrate/_quad_vec.py +21 -29
  128. scipy/integrate/_quadpack.cpython-313t-darwin.so +0 -0
  129. scipy/integrate/_quadpack_py.py +11 -7
  130. scipy/integrate/_quadrature.py +3 -3
  131. scipy/integrate/_rules/_base.py +2 -2
  132. scipy/integrate/_tanhsinh.py +48 -47
  133. scipy/integrate/_test_odeint_banded.cpython-313t-darwin.so +0 -0
  134. scipy/integrate/_vode.cpython-313t-darwin.so +0 -0
  135. scipy/integrate/tests/test__quad_vec.py +0 -6
  136. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  137. scipy/integrate/tests/test_cubature.py +21 -35
  138. scipy/integrate/tests/test_quadrature.py +6 -8
  139. scipy/integrate/tests/test_tanhsinh.py +56 -48
  140. scipy/interpolate/__init__.py +70 -58
  141. scipy/interpolate/_bary_rational.py +22 -22
  142. scipy/interpolate/_bsplines.py +119 -66
  143. scipy/interpolate/_cubic.py +65 -50
  144. scipy/interpolate/_dfitpack.cpython-313t-darwin.so +0 -0
  145. scipy/interpolate/_dierckx.cpython-313t-darwin.so +0 -0
  146. scipy/interpolate/_fitpack.cpython-313t-darwin.so +0 -0
  147. scipy/interpolate/_fitpack2.py +9 -6
  148. scipy/interpolate/_fitpack_impl.py +32 -26
  149. scipy/interpolate/_fitpack_repro.py +23 -19
  150. scipy/interpolate/_interpnd.cpython-313t-darwin.so +0 -0
  151. scipy/interpolate/_interpolate.py +30 -12
  152. scipy/interpolate/_ndbspline.py +13 -18
  153. scipy/interpolate/_ndgriddata.py +5 -8
  154. scipy/interpolate/_polyint.py +95 -31
  155. scipy/interpolate/_ppoly.cpython-313t-darwin.so +0 -0
  156. scipy/interpolate/_rbf.py +2 -2
  157. scipy/interpolate/_rbfinterp.py +1 -1
  158. scipy/interpolate/_rbfinterp_pythran.cpython-313t-darwin.so +0 -0
  159. scipy/interpolate/_rgi.py +31 -26
  160. scipy/interpolate/_rgi_cython.cpython-313t-darwin.so +0 -0
  161. scipy/interpolate/dfitpack.py +0 -20
  162. scipy/interpolate/interpnd.py +1 -2
  163. scipy/interpolate/tests/test_bary_rational.py +2 -2
  164. scipy/interpolate/tests/test_bsplines.py +97 -1
  165. scipy/interpolate/tests/test_fitpack2.py +39 -1
  166. scipy/interpolate/tests/test_interpnd.py +32 -20
  167. scipy/interpolate/tests/test_interpolate.py +48 -4
  168. scipy/interpolate/tests/test_rgi.py +2 -1
  169. scipy/io/_fast_matrix_market/__init__.py +2 -0
  170. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  171. scipy/io/_harwell_boeing/hb.py +7 -11
  172. scipy/io/_idl.py +5 -7
  173. scipy/io/_netcdf.py +15 -5
  174. scipy/io/_test_fortran.cpython-313t-darwin.so +0 -0
  175. scipy/io/arff/tests/test_arffread.py +3 -3
  176. scipy/io/matlab/__init__.py +5 -3
  177. scipy/io/matlab/_mio.py +4 -1
  178. scipy/io/matlab/_mio5.py +19 -13
  179. scipy/io/matlab/_mio5_utils.cpython-313t-darwin.so +0 -0
  180. scipy/io/matlab/_mio_utils.cpython-313t-darwin.so +0 -0
  181. scipy/io/matlab/_miobase.py +4 -1
  182. scipy/io/matlab/_streams.cpython-313t-darwin.so +0 -0
  183. scipy/io/matlab/tests/test_mio.py +46 -18
  184. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  185. scipy/io/tests/test_mmio.py +7 -1
  186. scipy/io/tests/test_wavfile.py +41 -0
  187. scipy/io/wavfile.py +57 -10
  188. scipy/linalg/_basic.py +113 -86
  189. scipy/linalg/_cythonized_array_utils.cpython-313t-darwin.so +0 -0
  190. scipy/linalg/_decomp.py +22 -9
  191. scipy/linalg/_decomp_cholesky.py +28 -13
  192. scipy/linalg/_decomp_cossin.py +45 -30
  193. scipy/linalg/_decomp_interpolative.cpython-313t-darwin.so +0 -0
  194. scipy/linalg/_decomp_ldl.py +4 -1
  195. scipy/linalg/_decomp_lu.py +18 -6
  196. scipy/linalg/_decomp_lu_cython.cpython-313t-darwin.so +0 -0
  197. scipy/linalg/_decomp_polar.py +2 -0
  198. scipy/linalg/_decomp_qr.py +6 -2
  199. scipy/linalg/_decomp_qz.py +3 -0
  200. scipy/linalg/_decomp_schur.py +3 -1
  201. scipy/linalg/_decomp_svd.py +13 -2
  202. scipy/linalg/_decomp_update.cpython-313t-darwin.so +0 -0
  203. scipy/linalg/_expm_frechet.py +4 -0
  204. scipy/linalg/_fblas.cpython-313t-darwin.so +0 -0
  205. scipy/linalg/_flapack.cpython-313t-darwin.so +0 -0
  206. scipy/linalg/_linalg_pythran.cpython-313t-darwin.so +0 -0
  207. scipy/linalg/_matfuncs.py +187 -4
  208. scipy/linalg/_matfuncs_expm.cpython-313t-darwin.so +0 -0
  209. scipy/linalg/_matfuncs_schur_sqrtm.cpython-313t-darwin.so +0 -0
  210. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  211. scipy/linalg/_matfuncs_sqrtm_triu.cpython-313t-darwin.so +0 -0
  212. scipy/linalg/_procrustes.py +2 -0
  213. scipy/linalg/_sketches.py +17 -6
  214. scipy/linalg/_solve_toeplitz.cpython-313t-darwin.so +0 -0
  215. scipy/linalg/_solvers.py +7 -2
  216. scipy/linalg/_special_matrices.py +26 -36
  217. scipy/linalg/cython_blas.cpython-313t-darwin.so +0 -0
  218. scipy/linalg/cython_lapack.cpython-313t-darwin.so +0 -0
  219. scipy/linalg/lapack.py +22 -2
  220. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  221. scipy/linalg/tests/test_basic.py +31 -16
  222. scipy/linalg/tests/test_batch.py +588 -0
  223. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  224. scipy/linalg/tests/test_decomp.py +40 -3
  225. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  226. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  227. scipy/linalg/tests/test_lapack.py +115 -7
  228. scipy/linalg/tests/test_matfuncs.py +157 -102
  229. scipy/linalg/tests/test_procrustes.py +0 -7
  230. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  231. scipy/linalg/tests/test_special_matrices.py +1 -5
  232. scipy/ndimage/__init__.py +1 -0
  233. scipy/ndimage/_cytest.cpython-313t-darwin.so +0 -0
  234. scipy/ndimage/_delegators.py +8 -2
  235. scipy/ndimage/_filters.py +453 -5
  236. scipy/ndimage/_interpolation.py +36 -6
  237. scipy/ndimage/_measurements.py +4 -2
  238. scipy/ndimage/_morphology.py +5 -0
  239. scipy/ndimage/_nd_image.cpython-313t-darwin.so +0 -0
  240. scipy/ndimage/_ni_docstrings.py +5 -1
  241. scipy/ndimage/_ni_label.cpython-313t-darwin.so +0 -0
  242. scipy/ndimage/_ni_support.py +1 -5
  243. scipy/ndimage/_rank_filter_1d.cpython-313t-darwin.so +0 -0
  244. scipy/ndimage/_support_alternative_backends.py +18 -6
  245. scipy/ndimage/tests/test_filters.py +370 -259
  246. scipy/ndimage/tests/test_fourier.py +7 -9
  247. scipy/ndimage/tests/test_interpolation.py +68 -61
  248. scipy/ndimage/tests/test_measurements.py +18 -35
  249. scipy/ndimage/tests/test_morphology.py +143 -131
  250. scipy/ndimage/tests/test_splines.py +1 -3
  251. scipy/odr/__odrpack.cpython-313t-darwin.so +0 -0
  252. scipy/optimize/_basinhopping.py +13 -7
  253. scipy/optimize/_bglu_dense.cpython-313t-darwin.so +0 -0
  254. scipy/optimize/_bracket.py +17 -24
  255. scipy/optimize/_chandrupatla.py +9 -10
  256. scipy/optimize/_cobyla_py.py +104 -123
  257. scipy/optimize/_constraints.py +14 -10
  258. scipy/optimize/_differentiable_functions.py +371 -230
  259. scipy/optimize/_differentialevolution.py +4 -3
  260. scipy/optimize/_direct.cpython-313t-darwin.so +0 -0
  261. scipy/optimize/_dual_annealing.py +1 -1
  262. scipy/optimize/_elementwise.py +1 -4
  263. scipy/optimize/_group_columns.cpython-313t-darwin.so +0 -0
  264. scipy/optimize/_lbfgsb.cpython-313t-darwin.so +0 -0
  265. scipy/optimize/_lbfgsb_py.py +57 -16
  266. scipy/optimize/_linprog_doc.py +2 -2
  267. scipy/optimize/_linprog_highs.py +2 -2
  268. scipy/optimize/_linprog_ip.py +25 -10
  269. scipy/optimize/_linprog_util.py +14 -16
  270. scipy/optimize/_lsap.cpython-313t-darwin.so +0 -0
  271. scipy/optimize/_lsq/common.py +3 -3
  272. scipy/optimize/_lsq/dogbox.py +16 -2
  273. scipy/optimize/_lsq/givens_elimination.cpython-313t-darwin.so +0 -0
  274. scipy/optimize/_lsq/least_squares.py +198 -126
  275. scipy/optimize/_lsq/lsq_linear.py +6 -6
  276. scipy/optimize/_lsq/trf.py +35 -8
  277. scipy/optimize/_milp.py +3 -1
  278. scipy/optimize/_minimize.py +105 -36
  279. scipy/optimize/_minpack.cpython-313t-darwin.so +0 -0
  280. scipy/optimize/_minpack_py.py +21 -14
  281. scipy/optimize/_moduleTNC.cpython-313t-darwin.so +0 -0
  282. scipy/optimize/_nnls.py +20 -21
  283. scipy/optimize/_nonlin.py +34 -3
  284. scipy/optimize/_numdiff.py +288 -110
  285. scipy/optimize/_optimize.py +86 -48
  286. scipy/optimize/_pava_pybind.cpython-313t-darwin.so +0 -0
  287. scipy/optimize/_remove_redundancy.py +5 -5
  288. scipy/optimize/_root_scalar.py +1 -1
  289. scipy/optimize/_shgo.py +6 -0
  290. scipy/optimize/_shgo_lib/_complex.py +1 -1
  291. scipy/optimize/_slsqp_py.py +216 -124
  292. scipy/optimize/_slsqplib.cpython-313t-darwin.so +0 -0
  293. scipy/optimize/_spectral.py +1 -1
  294. scipy/optimize/_tnc.py +8 -1
  295. scipy/optimize/_trlib/_trlib.cpython-313t-darwin.so +0 -0
  296. scipy/optimize/_trustregion.py +20 -6
  297. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  298. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  299. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  300. scipy/optimize/_trustregion_constr/projections.py +12 -8
  301. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  302. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  303. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  304. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  305. scipy/optimize/_trustregion_exact.py +0 -1
  306. scipy/optimize/_zeros.cpython-313t-darwin.so +0 -0
  307. scipy/optimize/_zeros_py.py +97 -17
  308. scipy/optimize/cython_optimize/_zeros.cpython-313t-darwin.so +0 -0
  309. scipy/optimize/slsqp.py +0 -1
  310. scipy/optimize/tests/test__basinhopping.py +1 -1
  311. scipy/optimize/tests/test__differential_evolution.py +4 -4
  312. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  313. scipy/optimize/tests/test__numdiff.py +66 -22
  314. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  315. scipy/optimize/tests/test__shgo.py +9 -1
  316. scipy/optimize/tests/test_bracket.py +36 -46
  317. scipy/optimize/tests/test_chandrupatla.py +133 -135
  318. scipy/optimize/tests/test_cobyla.py +74 -45
  319. scipy/optimize/tests/test_constraints.py +1 -1
  320. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  321. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  322. scipy/optimize/tests/test_least_squares.py +125 -13
  323. scipy/optimize/tests/test_linear_assignment.py +3 -3
  324. scipy/optimize/tests/test_linprog.py +3 -3
  325. scipy/optimize/tests/test_lsq_linear.py +6 -6
  326. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  327. scipy/optimize/tests/test_minpack.py +4 -4
  328. scipy/optimize/tests/test_nnls.py +43 -3
  329. scipy/optimize/tests/test_nonlin.py +36 -0
  330. scipy/optimize/tests/test_optimize.py +95 -17
  331. scipy/optimize/tests/test_slsqp.py +36 -4
  332. scipy/optimize/tests/test_zeros.py +34 -1
  333. scipy/signal/__init__.py +12 -23
  334. scipy/signal/_delegators.py +568 -0
  335. scipy/signal/_filter_design.py +459 -241
  336. scipy/signal/_fir_filter_design.py +262 -90
  337. scipy/signal/_lti_conversion.py +3 -2
  338. scipy/signal/_ltisys.py +118 -91
  339. scipy/signal/_max_len_seq_inner.cpython-313t-darwin.so +0 -0
  340. scipy/signal/_peak_finding_utils.cpython-313t-darwin.so +0 -0
  341. scipy/signal/_polyutils.py +172 -0
  342. scipy/signal/_short_time_fft.py +519 -70
  343. scipy/signal/_signal_api.py +30 -0
  344. scipy/signal/_signaltools.py +719 -399
  345. scipy/signal/_sigtools.cpython-313t-darwin.so +0 -0
  346. scipy/signal/_sosfilt.cpython-313t-darwin.so +0 -0
  347. scipy/signal/_spectral_py.py +230 -50
  348. scipy/signal/_spline.cpython-313t-darwin.so +0 -0
  349. scipy/signal/_spline_filters.py +108 -68
  350. scipy/signal/_support_alternative_backends.py +73 -0
  351. scipy/signal/_upfirdn.py +4 -1
  352. scipy/signal/_upfirdn_apply.cpython-313t-darwin.so +0 -0
  353. scipy/signal/_waveforms.py +2 -11
  354. scipy/signal/_wavelets.py +1 -1
  355. scipy/signal/fir_filter_design.py +1 -0
  356. scipy/signal/spline.py +4 -11
  357. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  358. scipy/signal/tests/test_bsplines.py +114 -79
  359. scipy/signal/tests/test_cont2discrete.py +9 -2
  360. scipy/signal/tests/test_filter_design.py +721 -481
  361. scipy/signal/tests/test_fir_filter_design.py +332 -140
  362. scipy/signal/tests/test_savitzky_golay.py +4 -3
  363. scipy/signal/tests/test_short_time_fft.py +221 -3
  364. scipy/signal/tests/test_signaltools.py +2144 -1348
  365. scipy/signal/tests/test_spectral.py +50 -6
  366. scipy/signal/tests/test_splines.py +161 -96
  367. scipy/signal/tests/test_upfirdn.py +84 -50
  368. scipy/signal/tests/test_waveforms.py +20 -0
  369. scipy/signal/tests/test_windows.py +607 -466
  370. scipy/signal/windows/_windows.py +287 -148
  371. scipy/sparse/__init__.py +23 -4
  372. scipy/sparse/_base.py +270 -108
  373. scipy/sparse/_bsr.py +7 -4
  374. scipy/sparse/_compressed.py +59 -231
  375. scipy/sparse/_construct.py +90 -38
  376. scipy/sparse/_coo.py +115 -181
  377. scipy/sparse/_csc.py +4 -4
  378. scipy/sparse/_csparsetools.cpython-313t-darwin.so +0 -0
  379. scipy/sparse/_csr.py +2 -2
  380. scipy/sparse/_data.py +48 -48
  381. scipy/sparse/_dia.py +105 -18
  382. scipy/sparse/_dok.py +0 -23
  383. scipy/sparse/_index.py +4 -4
  384. scipy/sparse/_matrix.py +23 -0
  385. scipy/sparse/_sparsetools.cpython-313t-darwin.so +0 -0
  386. scipy/sparse/_sputils.py +37 -22
  387. scipy/sparse/base.py +0 -9
  388. scipy/sparse/bsr.py +0 -14
  389. scipy/sparse/compressed.py +0 -23
  390. scipy/sparse/construct.py +0 -6
  391. scipy/sparse/coo.py +0 -14
  392. scipy/sparse/csc.py +0 -3
  393. scipy/sparse/csgraph/_flow.cpython-313t-darwin.so +0 -0
  394. scipy/sparse/csgraph/_matching.cpython-313t-darwin.so +0 -0
  395. scipy/sparse/csgraph/_min_spanning_tree.cpython-313t-darwin.so +0 -0
  396. scipy/sparse/csgraph/_reordering.cpython-313t-darwin.so +0 -0
  397. scipy/sparse/csgraph/_shortest_path.cpython-313t-darwin.so +0 -0
  398. scipy/sparse/csgraph/_tools.cpython-313t-darwin.so +0 -0
  399. scipy/sparse/csgraph/_traversal.cpython-313t-darwin.so +0 -0
  400. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  401. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  402. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  403. scipy/sparse/csr.py +0 -5
  404. scipy/sparse/data.py +1 -6
  405. scipy/sparse/dia.py +0 -7
  406. scipy/sparse/dok.py +0 -10
  407. scipy/sparse/linalg/_dsolve/_superlu.cpython-313t-darwin.so +0 -0
  408. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  409. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  410. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313t-darwin.so +0 -0
  411. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  412. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  413. scipy/sparse/linalg/_interface.py +17 -18
  414. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  415. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  416. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  417. scipy/sparse/linalg/_isolve/minres.py +5 -5
  418. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  419. scipy/sparse/linalg/_isolve/utils.py +2 -8
  420. scipy/sparse/linalg/_matfuncs.py +1 -1
  421. scipy/sparse/linalg/_norm.py +1 -1
  422. scipy/sparse/linalg/_propack/_cpropack.cpython-313t-darwin.so +0 -0
  423. scipy/sparse/linalg/_propack/_dpropack.cpython-313t-darwin.so +0 -0
  424. scipy/sparse/linalg/_propack/_spropack.cpython-313t-darwin.so +0 -0
  425. scipy/sparse/linalg/_propack/_zpropack.cpython-313t-darwin.so +0 -0
  426. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  427. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  428. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  429. scipy/sparse/tests/test_base.py +214 -42
  430. scipy/sparse/tests/test_common1d.py +7 -7
  431. scipy/sparse/tests/test_construct.py +1 -1
  432. scipy/sparse/tests/test_coo.py +272 -4
  433. scipy/sparse/tests/test_sparsetools.py +5 -0
  434. scipy/sparse/tests/test_sputils.py +36 -7
  435. scipy/spatial/_ckdtree.cpython-313t-darwin.so +0 -0
  436. scipy/spatial/_distance_pybind.cpython-313t-darwin.so +0 -0
  437. scipy/spatial/_distance_wrap.cpython-313t-darwin.so +0 -0
  438. scipy/spatial/_hausdorff.cpython-313t-darwin.so +0 -0
  439. scipy/spatial/_qhull.cpython-313t-darwin.so +0 -0
  440. scipy/spatial/_voronoi.cpython-313t-darwin.so +0 -0
  441. scipy/spatial/distance.py +49 -42
  442. scipy/spatial/tests/test_distance.py +15 -1
  443. scipy/spatial/tests/test_kdtree.py +1 -0
  444. scipy/spatial/tests/test_qhull.py +7 -2
  445. scipy/spatial/transform/__init__.py +5 -3
  446. scipy/spatial/transform/_rigid_transform.cpython-313t-darwin.so +0 -0
  447. scipy/spatial/transform/_rotation.cpython-313t-darwin.so +0 -0
  448. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  449. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  450. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  451. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  452. scipy/special/__init__.py +1 -47
  453. scipy/special/_add_newdocs.py +34 -772
  454. scipy/special/_basic.py +22 -25
  455. scipy/special/_comb.cpython-313t-darwin.so +0 -0
  456. scipy/special/_ellip_harm_2.cpython-313t-darwin.so +0 -0
  457. scipy/special/_gufuncs.cpython-313t-darwin.so +0 -0
  458. scipy/special/_logsumexp.py +67 -58
  459. scipy/special/_orthogonal.pyi +1 -1
  460. scipy/special/_specfun.cpython-313t-darwin.so +0 -0
  461. scipy/special/_special_ufuncs.cpython-313t-darwin.so +0 -0
  462. scipy/special/_spherical_bessel.py +4 -4
  463. scipy/special/_support_alternative_backends.py +212 -119
  464. scipy/special/_test_internal.cpython-313t-darwin.so +0 -0
  465. scipy/special/_testutils.py +4 -4
  466. scipy/special/_ufuncs.cpython-313t-darwin.so +0 -0
  467. scipy/special/_ufuncs.pyi +1 -0
  468. scipy/special/_ufuncs.pyx +215 -1400
  469. scipy/special/_ufuncs_cxx.cpython-313t-darwin.so +0 -0
  470. scipy/special/_ufuncs_cxx.pxd +2 -15
  471. scipy/special/_ufuncs_cxx.pyx +5 -44
  472. scipy/special/_ufuncs_cxx_defs.h +2 -16
  473. scipy/special/_ufuncs_defs.h +0 -8
  474. scipy/special/cython_special.cpython-313t-darwin.so +0 -0
  475. scipy/special/cython_special.pxd +1 -1
  476. scipy/special/tests/_cython_examples/meson.build +10 -1
  477. scipy/special/tests/test_basic.py +153 -20
  478. scipy/special/tests/test_boost_ufuncs.py +3 -0
  479. scipy/special/tests/test_cdflib.py +35 -11
  480. scipy/special/tests/test_gammainc.py +16 -0
  481. scipy/special/tests/test_hyp2f1.py +2 -2
  482. scipy/special/tests/test_log1mexp.py +85 -0
  483. scipy/special/tests/test_logsumexp.py +206 -64
  484. scipy/special/tests/test_mpmath.py +1 -0
  485. scipy/special/tests/test_nan_inputs.py +1 -1
  486. scipy/special/tests/test_orthogonal.py +17 -18
  487. scipy/special/tests/test_sf_error.py +3 -2
  488. scipy/special/tests/test_sph_harm.py +6 -7
  489. scipy/special/tests/test_support_alternative_backends.py +211 -76
  490. scipy/stats/__init__.py +4 -1
  491. scipy/stats/_ansari_swilk_statistics.cpython-313t-darwin.so +0 -0
  492. scipy/stats/_axis_nan_policy.py +5 -12
  493. scipy/stats/_biasedurn.cpython-313t-darwin.so +0 -0
  494. scipy/stats/_continued_fraction.py +387 -0
  495. scipy/stats/_continuous_distns.py +277 -310
  496. scipy/stats/_correlation.py +1 -1
  497. scipy/stats/_covariance.py +6 -3
  498. scipy/stats/_discrete_distns.py +39 -32
  499. scipy/stats/_distn_infrastructure.py +39 -12
  500. scipy/stats/_distribution_infrastructure.py +900 -238
  501. scipy/stats/_entropy.py +9 -10
  502. scipy/{_lib → stats}/_finite_differences.py +1 -1
  503. scipy/stats/_hypotests.py +83 -50
  504. scipy/stats/_kde.py +53 -49
  505. scipy/stats/_ksstats.py +1 -1
  506. scipy/stats/_levy_stable/__init__.py +7 -15
  507. scipy/stats/_levy_stable/levyst.cpython-313t-darwin.so +0 -0
  508. scipy/stats/_morestats.py +118 -73
  509. scipy/stats/_mstats_basic.py +13 -17
  510. scipy/stats/_mstats_extras.py +8 -8
  511. scipy/stats/_multivariate.py +89 -113
  512. scipy/stats/_new_distributions.py +97 -20
  513. scipy/stats/_page_trend_test.py +12 -5
  514. scipy/stats/_probability_distribution.py +265 -43
  515. scipy/stats/_qmc.py +14 -9
  516. scipy/stats/_qmc_cy.cpython-313t-darwin.so +0 -0
  517. scipy/stats/_qmvnt.py +16 -95
  518. scipy/stats/_qmvnt_cy.cpython-313t-darwin.so +0 -0
  519. scipy/stats/_quantile.py +335 -0
  520. scipy/stats/_rcont/rcont.cpython-313t-darwin.so +0 -0
  521. scipy/stats/_resampling.py +4 -29
  522. scipy/stats/_sampling.py +1 -1
  523. scipy/stats/_sobol.cpython-313t-darwin.so +0 -0
  524. scipy/stats/_stats.cpython-313t-darwin.so +0 -0
  525. scipy/stats/_stats_mstats_common.py +21 -2
  526. scipy/stats/_stats_py.py +550 -476
  527. scipy/stats/_stats_pythran.cpython-313t-darwin.so +0 -0
  528. scipy/stats/_unuran/unuran_wrapper.cpython-313t-darwin.so +0 -0
  529. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  530. scipy/stats/_variation.py +6 -8
  531. scipy/stats/_wilcoxon.py +13 -7
  532. scipy/stats/tests/common_tests.py +6 -4
  533. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  534. scipy/stats/tests/test_continued_fraction.py +173 -0
  535. scipy/stats/tests/test_continuous.py +379 -60
  536. scipy/stats/tests/test_continuous_basic.py +18 -12
  537. scipy/stats/tests/test_discrete_basic.py +14 -8
  538. scipy/stats/tests/test_discrete_distns.py +16 -16
  539. scipy/stats/tests/test_distributions.py +95 -75
  540. scipy/stats/tests/test_entropy.py +40 -48
  541. scipy/stats/tests/test_fit.py +4 -3
  542. scipy/stats/tests/test_hypotests.py +153 -24
  543. scipy/stats/tests/test_kdeoth.py +109 -41
  544. scipy/stats/tests/test_marray.py +289 -0
  545. scipy/stats/tests/test_morestats.py +79 -47
  546. scipy/stats/tests/test_mstats_basic.py +3 -3
  547. scipy/stats/tests/test_multivariate.py +434 -83
  548. scipy/stats/tests/test_qmc.py +13 -10
  549. scipy/stats/tests/test_quantile.py +199 -0
  550. scipy/stats/tests/test_rank.py +119 -112
  551. scipy/stats/tests/test_resampling.py +47 -56
  552. scipy/stats/tests/test_sampling.py +9 -4
  553. scipy/stats/tests/test_stats.py +799 -939
  554. scipy/stats/tests/test_variation.py +8 -6
  555. scipy/version.py +2 -2
  556. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  557. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  558. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +559 -566
  559. scipy-1.16.0rc2.dist-info/WHEEL +6 -0
  560. scipy/_lib/array_api_extra/_funcs.py +0 -484
  561. scipy/_lib/array_api_extra/_typing.py +0 -8
  562. scipy/interpolate/_bspl.cpython-313t-darwin.so +0 -0
  563. scipy/optimize/_cobyla.cpython-313t-darwin.so +0 -0
  564. scipy/optimize/_cython_nnls.cpython-313t-darwin.so +0 -0
  565. scipy/optimize/_slsqp.cpython-313t-darwin.so +0 -0
  566. scipy/spatial/qhull_src/COPYING.txt +0 -38
  567. scipy/special/libsf_error_state.dylib +0 -0
  568. scipy/special/tests/test_log_softmax.py +0 -109
  569. scipy/special/tests/test_xsf_cuda.py +0 -114
  570. scipy/special/xsf/binom.h +0 -89
  571. scipy/special/xsf/cdflib.h +0 -100
  572. scipy/special/xsf/cephes/airy.h +0 -307
  573. scipy/special/xsf/cephes/besselpoly.h +0 -51
  574. scipy/special/xsf/cephes/beta.h +0 -257
  575. scipy/special/xsf/cephes/cbrt.h +0 -131
  576. scipy/special/xsf/cephes/chbevl.h +0 -85
  577. scipy/special/xsf/cephes/chdtr.h +0 -193
  578. scipy/special/xsf/cephes/const.h +0 -87
  579. scipy/special/xsf/cephes/ellie.h +0 -293
  580. scipy/special/xsf/cephes/ellik.h +0 -251
  581. scipy/special/xsf/cephes/ellpe.h +0 -107
  582. scipy/special/xsf/cephes/ellpk.h +0 -117
  583. scipy/special/xsf/cephes/expn.h +0 -260
  584. scipy/special/xsf/cephes/gamma.h +0 -398
  585. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  586. scipy/special/xsf/cephes/hyperg.h +0 -361
  587. scipy/special/xsf/cephes/i0.h +0 -149
  588. scipy/special/xsf/cephes/i1.h +0 -158
  589. scipy/special/xsf/cephes/igam.h +0 -421
  590. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  591. scipy/special/xsf/cephes/igami.h +0 -313
  592. scipy/special/xsf/cephes/j0.h +0 -225
  593. scipy/special/xsf/cephes/j1.h +0 -198
  594. scipy/special/xsf/cephes/jv.h +0 -715
  595. scipy/special/xsf/cephes/k0.h +0 -164
  596. scipy/special/xsf/cephes/k1.h +0 -163
  597. scipy/special/xsf/cephes/kn.h +0 -243
  598. scipy/special/xsf/cephes/lanczos.h +0 -112
  599. scipy/special/xsf/cephes/ndtr.h +0 -275
  600. scipy/special/xsf/cephes/poch.h +0 -85
  601. scipy/special/xsf/cephes/polevl.h +0 -167
  602. scipy/special/xsf/cephes/psi.h +0 -194
  603. scipy/special/xsf/cephes/rgamma.h +0 -111
  604. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  605. scipy/special/xsf/cephes/shichi.h +0 -248
  606. scipy/special/xsf/cephes/sici.h +0 -224
  607. scipy/special/xsf/cephes/sindg.h +0 -221
  608. scipy/special/xsf/cephes/tandg.h +0 -139
  609. scipy/special/xsf/cephes/trig.h +0 -58
  610. scipy/special/xsf/cephes/unity.h +0 -186
  611. scipy/special/xsf/cephes/zeta.h +0 -172
  612. scipy/special/xsf/config.h +0 -304
  613. scipy/special/xsf/digamma.h +0 -205
  614. scipy/special/xsf/error.h +0 -57
  615. scipy/special/xsf/evalpoly.h +0 -47
  616. scipy/special/xsf/expint.h +0 -266
  617. scipy/special/xsf/hyp2f1.h +0 -694
  618. scipy/special/xsf/iv_ratio.h +0 -173
  619. scipy/special/xsf/lambertw.h +0 -150
  620. scipy/special/xsf/loggamma.h +0 -163
  621. scipy/special/xsf/sici.h +0 -200
  622. scipy/special/xsf/tools.h +0 -427
  623. scipy/special/xsf/trig.h +0 -164
  624. scipy/special/xsf/wright_bessel.h +0 -843
  625. scipy/special/xsf/zlog1.h +0 -35
  626. scipy/stats/_mvn.cpython-313t-darwin.so +0 -0
  627. scipy-1.15.3.dist-info/WHEEL +0 -4
@@ -0,0 +1,9 @@
1
+ # DO NOT RENAME THIS FILE
2
+ # This is a hook for array_api_extra/src/array_api_extra/_lib/_compat.py
3
+ # to override functions of array_api_compat.
4
+
5
+ from .array_api_compat import * # noqa: F403
6
+ from ._array_api import array_namespace as scipy_array_namespace
7
+
8
+ # overrides array_api_compat.array_namespace inside array-api-extra
9
+ array_namespace = scipy_array_namespace # type: ignore[assignment]
scipy/_lib/_bunch.py CHANGED
@@ -194,6 +194,10 @@ def __setattr__(self, key, val):
194
194
  '_asdict': _asdict,
195
195
  '_extra_fields': extra_field_names,
196
196
  '__getnewargs_ex__': __getnewargs_ex__,
197
+ # _field_defaults and _replace are added to get Polars to detect
198
+ # a bunch object as a namedtuple. See gh-22450
199
+ '_field_defaults': {},
200
+ '_replace': None,
197
201
  }
198
202
  for index, name in enumerate(field_names):
199
203
 
scipy/_lib/_docscrape.py CHANGED
@@ -703,7 +703,7 @@ class ClassDoc(NumpyDocString):
703
703
  and not self._should_skip_member(name, self._cls)
704
704
  and (
705
705
  func is None
706
- or isinstance(func, (property, cached_property))
706
+ or isinstance(func, property | cached_property)
707
707
  or inspect.isdatadescriptor(func)
708
708
  )
709
709
  and self._is_show_member(name)
@@ -15,7 +15,8 @@
15
15
  import math
16
16
  import numpy as np
17
17
  from ._util import _RichResult, _call_callback_maybe_halt
18
- from ._array_api import array_namespace, xp_size
18
+ from ._array_api import array_namespace, xp_size, xp_result_type
19
+ import scipy._lib.array_api_extra as xpx
19
20
 
20
21
  _ESIGNERR = -1
21
22
  _ECONVERR = -2
@@ -82,9 +83,8 @@ def _initialize(func, xs, args, complex_ok=False, preserve_shape=None, xp=None):
82
83
  # and cause failure.
83
84
  # There might be benefit to combining the `xs` into a single array and
84
85
  # calling `func` once on the combined array. For now, keep them separate.
86
+ xat = xp_result_type(*xs, force_floating=True, xp=xp)
85
87
  xas = xp.broadcast_arrays(*xs, *args) # broadcast and rename
86
- xat = xp.result_type(*[xa.dtype for xa in xas])
87
- xat = xp.asarray(1.).dtype if xp.isdtype(xat, "integral") else xat
88
88
  xs, args = xas[:nx], xas[nx:]
89
89
  xs = [xp.asarray(x, dtype=xat) for x in xs] # use copy=False when implemented
90
90
  fs = [xp.asarray(func(x, *args)) for x in xs]
@@ -264,7 +264,7 @@ def _loop(work, callback, shape, maxiter, func, args, dtype, pre_func_eval,
264
264
 
265
265
  post_termination_check(work)
266
266
 
267
- work.status[:] = _ECALLBACK if cb_terminate else _ECONVERR
267
+ work.status = xpx.at(work.status)[:].set(_ECALLBACK if cb_terminate else _ECONVERR)
268
268
  return _prepare_result(work, res, res_work_pairs, active, shape,
269
269
  customize_result, preserve_shape, xp)
270
270
 
@@ -290,14 +290,10 @@ def _check_termination(work, res, res_work_pairs, active, check_termination,
290
290
  if not preserve_shape:
291
291
  # compress the arrays to avoid unnecessary computation
292
292
  for key, val in work.items():
293
- # Need to find a better way than these try/excepts
294
- # Somehow need to keep compressible numerical args separate
295
- if key == 'args':
293
+ # `continued_fraction` hacks `n`; improve if this becomes a problem
294
+ if key in {'args', 'n'}:
296
295
  continue
297
- try:
298
- work[key] = val[proceed]
299
- except (IndexError, TypeError, KeyError): # not a compressible array
300
- work[key] = val
296
+ work[key] = val[proceed] if getattr(val, 'ndim', 0) > 0 else val
301
297
  work.args = [arg[proceed] for arg in work.args]
302
298
 
303
299
  return active
@@ -314,28 +310,21 @@ def _update_active(work, res, res_work_pairs, active, mask, preserve_shape, xp):
314
310
  if mask is not None:
315
311
  if preserve_shape:
316
312
  active_mask = xp.zeros_like(mask)
317
- active_mask[active] = 1
313
+ active_mask = xpx.at(active_mask)[active].set(True)
318
314
  active_mask = active_mask & mask
319
315
  for key, val in update_dict.items():
320
- try:
321
- res[key][active_mask] = val[active_mask]
322
- except (IndexError, TypeError, KeyError):
323
- res[key][active_mask] = val
316
+ val = val[active_mask] if getattr(val, 'ndim', 0) > 0 else val
317
+ res[key] = xpx.at(res[key])[active_mask].set(val)
324
318
  else:
325
319
  active_mask = active[mask]
326
320
  for key, val in update_dict.items():
327
- try:
328
- res[key][active_mask] = val[mask]
329
- except (IndexError, TypeError, KeyError):
330
- res[key][active_mask] = val
321
+ val = val[mask] if getattr(val, 'ndim', 0) > 0 else val
322
+ res[key] = xpx.at(res[key])[active_mask].set(val)
331
323
  else:
332
324
  for key, val in update_dict.items():
333
- if preserve_shape:
334
- try:
335
- val = val[active]
336
- except (IndexError, TypeError, KeyError):
337
- pass
338
- res[key][active] = val
325
+ if preserve_shape and getattr(val, 'ndim', 0) > 0:
326
+ val = val[active]
327
+ res[key] = xpx.at(res[key])[active].set(val)
339
328
 
340
329
 
341
330
  def _prepare_result(work, res, res_work_pairs, active, shape, customize_result,
scipy/_lib/_sparse.py ADDED
@@ -0,0 +1,41 @@
1
+ from abc import ABC
2
+
3
+ __all__ = ["SparseABC", "issparse"]
4
+
5
+
6
+ class SparseABC(ABC):
7
+ pass
8
+
9
+
10
+ def issparse(x):
11
+ """Is `x` of a sparse array or sparse matrix type?
12
+
13
+ Parameters
14
+ ----------
15
+ x
16
+ object to check for being a sparse array or sparse matrix
17
+
18
+ Returns
19
+ -------
20
+ bool
21
+ True if `x` is a sparse array or a sparse matrix, False otherwise
22
+
23
+ Notes
24
+ -----
25
+ Use `isinstance(x, sp.sparse.sparray)` to check between an array or matrix.
26
+ Use `a.format` to check the sparse format, e.g. `a.format == 'csr'`.
27
+
28
+ Examples
29
+ --------
30
+ >>> import numpy as np
31
+ >>> from scipy.sparse import csr_array, csr_matrix, issparse
32
+ >>> issparse(csr_matrix([[5]]))
33
+ True
34
+ >>> issparse(csr_array([[5]]))
35
+ True
36
+ >>> issparse(np.array([[5]]))
37
+ False
38
+ >>> issparse(5)
39
+ False
40
+ """
41
+ return isinstance(x, SparseABC)
scipy/_lib/_testutils.py CHANGED
@@ -95,8 +95,12 @@ class PytestTester:
95
95
 
96
96
  pytest_args = ['--showlocals', '--tb=short']
97
97
 
98
- if extra_argv:
99
- pytest_args += list(extra_argv)
98
+ if extra_argv is None:
99
+ extra_argv = []
100
+ pytest_args += extra_argv
101
+ if any(arg == "-m" or arg == "--markers" for arg in extra_argv):
102
+ # Likely conflict with default --mode=fast
103
+ raise ValueError("Must specify -m before --")
100
104
 
101
105
  if verbose and int(verbose) > 1:
102
106
  pytest_args += ["-" + "v"*(int(verbose)-1)]
scipy/_lib/_util.py CHANGED
@@ -7,27 +7,18 @@ import numbers
7
7
  from collections import namedtuple
8
8
  import inspect
9
9
  import math
10
- from typing import TypeAlias, TypeVar
10
+ from types import ModuleType
11
+ from typing import Literal, TypeAlias, TypeVar
11
12
 
12
13
  import numpy as np
13
- from scipy._lib._array_api import array_namespace, is_numpy, xp_size
14
+ from scipy._lib._array_api import (Array, array_namespace, is_lazy_array,
15
+ is_numpy, is_marray, xp_result_device,
16
+ xp_size, xp_result_type)
14
17
  from scipy._lib._docscrape import FunctionDoc, Parameter
18
+ from scipy._lib._sparse import issparse
15
19
 
20
+ from numpy.exceptions import AxisError
16
21
 
17
- AxisError: type[Exception]
18
- ComplexWarning: type[Warning]
19
- VisibleDeprecationWarning: type[Warning]
20
-
21
- if np.lib.NumpyVersion(np.__version__) >= '1.25.0':
22
- from numpy.exceptions import (
23
- AxisError, ComplexWarning, VisibleDeprecationWarning,
24
- DTypePromotionError
25
- )
26
- else:
27
- from numpy import ( # type: ignore[attr-defined, no-redef]
28
- AxisError, ComplexWarning, VisibleDeprecationWarning # noqa: F401
29
- )
30
- DTypePromotionError = TypeError # type: ignore
31
22
 
32
23
  np_long: type
33
24
  np_ulong: type
@@ -81,85 +72,6 @@ except ImportError:
81
72
  pass
82
73
 
83
74
 
84
- def _lazywhere(cond, arrays, f, fillvalue=None, f2=None):
85
- """Return elements chosen from two possibilities depending on a condition
86
-
87
- Equivalent to ``f(*arrays) if cond else fillvalue`` performed elementwise.
88
-
89
- Parameters
90
- ----------
91
- cond : array
92
- The condition (expressed as a boolean array).
93
- arrays : tuple of array
94
- Arguments to `f` (and `f2`). Must be broadcastable with `cond`.
95
- f : callable
96
- Where `cond` is True, output will be ``f(arr1[cond], arr2[cond], ...)``
97
- fillvalue : object
98
- If provided, value with which to fill output array where `cond` is
99
- not True.
100
- f2 : callable
101
- If provided, output will be ``f2(arr1[cond], arr2[cond], ...)`` where
102
- `cond` is not True.
103
-
104
- Returns
105
- -------
106
- out : array
107
- An array with elements from the output of `f` where `cond` is True
108
- and `fillvalue` (or elements from the output of `f2`) elsewhere. The
109
- returned array has data type determined by Type Promotion Rules
110
- with the output of `f` and `fillvalue` (or the output of `f2`).
111
-
112
- Notes
113
- -----
114
- ``xp.where(cond, x, fillvalue)`` requires explicitly forming `x` even where
115
- `cond` is False. This function evaluates ``f(arr1[cond], arr2[cond], ...)``
116
- onle where `cond` ``is True.
117
-
118
- Examples
119
- --------
120
- >>> import numpy as np
121
- >>> a, b = np.array([1, 2, 3, 4]), np.array([5, 6, 7, 8])
122
- >>> def f(a, b):
123
- ... return a*b
124
- >>> _lazywhere(a > 2, (a, b), f, np.nan)
125
- array([ nan, nan, 21., 32.])
126
-
127
- """
128
- xp = array_namespace(cond, *arrays)
129
-
130
- if (f2 is fillvalue is None) or (f2 is not None and fillvalue is not None):
131
- raise ValueError("Exactly one of `fillvalue` or `f2` must be given.")
132
-
133
- args = xp.broadcast_arrays(cond, *arrays)
134
- bool_dtype = xp.asarray([True]).dtype # numpy 1.xx doesn't have `bool`
135
- cond, arrays = xp.astype(args[0], bool_dtype, copy=False), args[1:]
136
-
137
- temp1 = xp.asarray(f(*(arr[cond] for arr in arrays)))
138
-
139
- if f2 is None:
140
- # If `fillvalue` is a Python scalar and we convert to `xp.asarray`, it gets the
141
- # default `int` or `float` type of `xp`, so `result_type` could be wrong.
142
- # `result_type` should/will handle mixed array/Python scalars;
143
- # remove this special logic when it does.
144
- if type(fillvalue) in {bool, int, float, complex}:
145
- with np.errstate(invalid='ignore'):
146
- dtype = (temp1 * fillvalue).dtype
147
- else:
148
- dtype = xp.result_type(temp1.dtype, fillvalue)
149
- out = xp.full(cond.shape, dtype=dtype,
150
- fill_value=xp.asarray(fillvalue, dtype=dtype))
151
- else:
152
- ncond = ~cond
153
- temp2 = xp.asarray(f2(*(arr[ncond] for arr in arrays)))
154
- dtype = xp.result_type(temp1, temp2)
155
- out = xp.empty(cond.shape, dtype=dtype)
156
- out[ncond] = temp2
157
-
158
- out[cond] = temp1
159
-
160
- return out
161
-
162
-
163
75
  def _lazyselect(condlist, choicelist, arrays, default=0):
164
76
  """
165
77
  Mimic `np.select(condlist, choicelist)`.
@@ -524,8 +436,7 @@ def _asarray_validated(a, check_finite=True,
524
436
 
525
437
  """
526
438
  if not sparse_ok:
527
- import scipy.sparse
528
- if scipy.sparse.issparse(a):
439
+ if issparse(a):
529
440
  msg = ('Sparse arrays/matrices are not supported by this function. '
530
441
  'Perhaps one of the `scipy.sparse.linalg` functions '
531
442
  'would work instead.')
@@ -657,6 +568,32 @@ class _FunctionWrapper:
657
568
  return self.f(x, *self.args)
658
569
 
659
570
 
571
+ class _ScalarFunctionWrapper:
572
+ """
573
+ Object to wrap scalar user function, allowing picklability
574
+ """
575
+ def __init__(self, f, args=None):
576
+ self.f = f
577
+ self.args = [] if args is None else args
578
+ self.nfev = 0
579
+
580
+ def __call__(self, x):
581
+ # Send a copy because the user may overwrite it.
582
+ # The user of this class might want `x` to remain unchanged.
583
+ fx = self.f(np.copy(x), *self.args)
584
+ self.nfev += 1
585
+
586
+ # Make sure the function returns a true scalar
587
+ if not np.isscalar(fx):
588
+ try:
589
+ fx = np.asarray(fx).item()
590
+ except (TypeError, ValueError) as e:
591
+ raise ValueError(
592
+ "The user-provided objective function "
593
+ "must return a scalar value."
594
+ ) from e
595
+ return fx
596
+
660
597
  class MapWrapper:
661
598
  """
662
599
  Parallelisation wrapper for working with map-like callables, such as
@@ -731,6 +668,29 @@ class MapWrapper:
731
668
  " form f(func, iterable)") from e
732
669
 
733
670
 
671
+ def _workers_wrapper(func):
672
+ """
673
+ Wrapper to deal with setup-cleanup of workers outside a user function via a
674
+ ContextManager. It saves having to do the setup/tear down with within that
675
+ function, which can be messy.
676
+ """
677
+ @functools.wraps(func)
678
+ def inner(*args, **kwds):
679
+ kwargs = kwds.copy()
680
+ if 'workers' not in kwargs:
681
+ _workers = map
682
+ elif 'workers' in kwargs and kwargs['workers'] is None:
683
+ _workers = map
684
+ else:
685
+ _workers = kwargs['workers']
686
+
687
+ with MapWrapper(_workers) as mf:
688
+ kwargs['workers'] = mf
689
+ return func(*args, **kwargs)
690
+
691
+ return inner
692
+
693
+
734
694
  def rng_integers(gen, low, high=None, size=None, dtype='int64',
735
695
  endpoint=False):
736
696
  """
@@ -923,25 +883,30 @@ def _nan_allsame(a, axis, keepdims=False):
923
883
  return ((a0 == a) | np.isnan(a)).all(axis=axis, keepdims=keepdims)
924
884
 
925
885
 
926
- def _contains_nan(a, nan_policy='propagate', policies=None, *,
927
- xp_omit_okay=False, xp=None):
886
+ def _contains_nan(
887
+ a: Array,
888
+ nan_policy: Literal["propagate", "raise", "omit"] = "propagate",
889
+ *,
890
+ xp_omit_okay: bool = False,
891
+ xp: ModuleType | None = None,
892
+ ) -> Array | bool:
928
893
  # Regarding `xp_omit_okay`: Temporarily, while `_axis_nan_policy` does not
929
894
  # handle non-NumPy arrays, most functions that call `_contains_nan` want
930
895
  # it to raise an error if `nan_policy='omit'` and `xp` is not `np`.
931
896
  # Some functions support `nan_policy='omit'` natively, so setting this to
932
897
  # `True` prevents the error from being raised.
933
- if xp is None:
934
- xp = array_namespace(a)
935
- not_numpy = not is_numpy(xp)
936
-
937
- if policies is None:
938
- policies = {'propagate', 'raise', 'omit'}
898
+ policies = {"propagate", "raise", "omit"}
939
899
  if nan_policy not in policies:
940
- raise ValueError(f"nan_policy must be one of {set(policies)}.")
900
+ msg = f"nan_policy must be one of {policies}."
901
+ raise ValueError(msg)
941
902
 
942
903
  if xp_size(a) == 0:
943
- contains_nan = False
944
- elif xp.isdtype(a.dtype, "real floating"):
904
+ return False
905
+
906
+ if xp is None:
907
+ xp = array_namespace(a)
908
+
909
+ if xp.isdtype(a.dtype, "real floating"):
945
910
  # Faster and less memory-intensive than xp.any(xp.isnan(a)), and unlike other
946
911
  # reductions, `max`/`min` won't return NaN unless there is a NaN in the data.
947
912
  contains_nan = xp.isnan(xp.max(a))
@@ -958,16 +923,27 @@ def _contains_nan(a, nan_policy='propagate', policies=None, *,
958
923
  break
959
924
  else:
960
925
  # Only `object` and `inexact` arrays can have NaNs
961
- contains_nan = False
962
-
963
- if contains_nan and nan_policy == 'raise':
964
- raise ValueError("The input contains nan values")
926
+ return False
965
927
 
966
- if not xp_omit_okay and not_numpy and contains_nan and nan_policy=='omit':
967
- message = "`nan_policy='omit' is incompatible with non-NumPy arrays."
968
- raise ValueError(message)
928
+ # The implicit call to bool(contains_nan) must happen after testing
929
+ # nan_policy to prevent lazy and device-bound xps from raising in the
930
+ # default policy='propagate' case.
931
+ if nan_policy == 'raise':
932
+ if is_lazy_array(a):
933
+ msg = "nan_policy='raise' is not supported for lazy arrays."
934
+ raise TypeError(msg)
935
+ if contains_nan:
936
+ msg = "The input contains nan values"
937
+ raise ValueError(msg)
938
+ elif nan_policy == 'omit' and not xp_omit_okay and not is_numpy(xp):
939
+ if is_lazy_array(a):
940
+ msg = "nan_policy='omit' is not supported for lazy arrays."
941
+ raise TypeError(msg)
942
+ if contains_nan:
943
+ msg = "nan_policy='omit' is incompatible with non-NumPy arrays."
944
+ raise ValueError(msg)
969
945
 
970
- return contains_nan, nan_policy
946
+ return contains_nan
971
947
 
972
948
 
973
949
  def _rename_parameter(old_name, new_name, dep_version=None):
@@ -1034,17 +1010,16 @@ def _rng_spawn(rng, n_children):
1034
1010
  return child_rngs
1035
1011
 
1036
1012
 
1037
- def _get_nan(*data, xp=None):
1013
+ def _get_nan(*data, shape=(), xp=None):
1038
1014
  xp = array_namespace(*data) if xp is None else xp
1039
1015
  # Get NaN of appropriate dtype for data
1040
- data = [xp.asarray(item) for item in data]
1041
- try:
1042
- min_float = getattr(xp, 'float16', xp.float32)
1043
- dtype = xp.result_type(*data, min_float) # must be at least a float
1044
- except DTypePromotionError:
1045
- # fallback to float64
1046
- dtype = xp.float64
1047
- return xp.asarray(xp.nan, dtype=dtype)[()]
1016
+ dtype = xp_result_type(*data, force_floating=True, xp=xp)
1017
+ device = xp_result_device(*data)
1018
+ res = xp.full(shape, xp.nan, dtype=dtype, device=device)
1019
+ if not shape:
1020
+ res = res[()]
1021
+ # whenever mdhaber/marray#89 is resolved, could just return `res`
1022
+ return res.data if is_marray(xp) else res
1048
1023
 
1049
1024
 
1050
1025
  def normalize_axis_index(axis, ndim):
@@ -1177,3 +1152,125 @@ def _dict_formatter(d, n=0, mplus=1, sorter=None):
1177
1152
  formatter={'float_kind': _float_formatter_10}):
1178
1153
  s = str(d)
1179
1154
  return s
1155
+
1156
+
1157
+ _batch_note = """
1158
+ The documentation is written assuming array arguments are of specified
1159
+ "core" shapes. However, array argument(s) of this function may have additional
1160
+ "batch" dimensions prepended to the core shape. In this case, the array is treated
1161
+ as a batch of lower-dimensional slices; see :ref:`linalg_batch` for details.
1162
+ """
1163
+
1164
+
1165
+ def _apply_over_batch(*argdefs):
1166
+ """
1167
+ Factory for decorator that applies a function over batched arguments.
1168
+
1169
+ Array arguments may have any number of core dimensions (typically 0,
1170
+ 1, or 2) and any broadcastable batch shapes. There may be any
1171
+ number of array outputs of any number of dimensions. Assumptions
1172
+ right now - which are satisfied by all functions of interest in `linalg` -
1173
+ are that all array inputs are consecutive keyword or positional arguments,
1174
+ and that the wrapped function returns either a single array or a tuple of
1175
+ arrays. It's only as general as it needs to be right now - it can be extended.
1176
+
1177
+ Parameters
1178
+ ----------
1179
+ *argdefs : tuple of (str, int)
1180
+ Definitions of array arguments: the keyword name of the argument, and
1181
+ the number of core dimensions.
1182
+
1183
+ Example:
1184
+ --------
1185
+ `linalg.eig` accepts two matrices as the first two arguments `a` and `b`, where
1186
+ `b` is optional, and returns one array or a tuple of arrays, depending on the
1187
+ values of other positional or keyword arguments. To generate a wrapper that applies
1188
+ the function over batches of `a` and optionally `b` :
1189
+
1190
+ >>> _apply_over_batch(('a', 2), ('b', 2))
1191
+ """
1192
+ names, ndims = list(zip(*argdefs))
1193
+ n_arrays = len(names)
1194
+
1195
+ def decorator(f):
1196
+ @functools.wraps(f)
1197
+ def wrapper(*args, **kwargs):
1198
+ args = list(args)
1199
+
1200
+ # Ensure all arrays in `arrays`, other arguments in `other_args`/`kwargs`
1201
+ arrays, other_args = args[:n_arrays], args[n_arrays:]
1202
+ for i, name in enumerate(names):
1203
+ if name in kwargs:
1204
+ if i + 1 <= len(args):
1205
+ raise ValueError(f'{f.__name__}() got multiple values '
1206
+ f'for argument `{name}`.')
1207
+ else:
1208
+ arrays.append(kwargs.pop(name))
1209
+
1210
+ # Determine core and batch shapes
1211
+ batch_shapes = []
1212
+ core_shapes = []
1213
+ for i, (array, ndim) in enumerate(zip(arrays, ndims)):
1214
+ array = None if array is None else np.asarray(array)
1215
+ shape = () if array is None else array.shape
1216
+
1217
+ if ndim == "1|2": # special case for `solve`, etc.
1218
+ ndim = 2 if array.ndim >= 2 else 1
1219
+
1220
+ arrays[i] = array
1221
+ batch_shapes.append(shape[:-ndim] if ndim > 0 else shape)
1222
+ core_shapes.append(shape[-ndim:] if ndim > 0 else ())
1223
+
1224
+ # Early exit if call is not batched
1225
+ if not any(batch_shapes):
1226
+ return f(*arrays, *other_args, **kwargs)
1227
+
1228
+ # Determine broadcasted batch shape
1229
+ batch_shape = np.broadcast_shapes(*batch_shapes) # Gives OK error message
1230
+
1231
+ # Broadcast arrays to appropriate shape
1232
+ for i, (array, core_shape) in enumerate(zip(arrays, core_shapes)):
1233
+ if array is None:
1234
+ continue
1235
+ arrays[i] = np.broadcast_to(array, batch_shape + core_shape)
1236
+
1237
+ # Main loop
1238
+ results = []
1239
+ for index in np.ndindex(batch_shape):
1240
+ result = f(*(array[index] for array in arrays), *other_args, **kwargs)
1241
+ # Assume `result` is either a tuple or single array. This is easily
1242
+ # generalized by allowing the contributor to pass an `unpack_result`
1243
+ # callable to the decorator factory.
1244
+ result = (result,) if not isinstance(result, tuple) else result
1245
+ results.append(result)
1246
+ results = list(zip(*results))
1247
+
1248
+ # Reshape results
1249
+ for i, result in enumerate(results):
1250
+ result = np.stack(result)
1251
+ core_shape = result.shape[1:]
1252
+ results[i] = np.reshape(result, batch_shape + core_shape)
1253
+
1254
+ # Assume `result` should be a single array if there is only one element or
1255
+ # a `tuple` otherwise. This is easily generalized by allowing the
1256
+ # contributor to pass an `pack_result` callable to the decorator factory.
1257
+ return results[0] if len(results) == 1 else results
1258
+
1259
+ doc = FunctionDoc(wrapper)
1260
+ doc['Extended Summary'].append(_batch_note.rstrip())
1261
+ wrapper.__doc__ = str(doc).split("\n", 1)[1] # remove signature
1262
+
1263
+ return wrapper
1264
+ return decorator
1265
+
1266
+
1267
+ def np_vecdot(x1, x2, /, *, axis=-1):
1268
+ # `np.vecdot` has advantages (e.g. see gh-22462), so let's use it when
1269
+ # available. As functions are translated to Array API, `np_vecdot` can be
1270
+ # replaced with `xp.vecdot`.
1271
+ if np.__version__ > "2.0":
1272
+ return np.vecdot(x1, x2, axis=axis)
1273
+ else:
1274
+ # of course there are other fancy ways of doing this (e.g. `einsum`)
1275
+ # but let's keep it simple since it's temporary
1276
+ return np.sum(x1 * x2, axis=axis)
@@ -1,9 +1,9 @@
1
1
  """
2
2
  NumPy Array API compatibility library
3
3
 
4
- This is a small wrapper around NumPy and CuPy that is compatible with the
5
- Array API standard https://data-apis.org/array-api/latest/. See also NEP 47
6
- https://numpy.org/neps/nep-0047-array-api-standard.html.
4
+ This is a small wrapper around NumPy, CuPy, JAX, sparse and others that are
5
+ compatible with the Array API standard https://data-apis.org/array-api/latest/.
6
+ See also NEP 47 https://numpy.org/neps/nep-0047-array-api-standard.html.
7
7
 
8
8
  Unlike array_api_strict, this is not a strict minimal implementation of the
9
9
  Array API, but rather just an extension of the main NumPy namespace with
@@ -17,6 +17,6 @@ to ensure they are not using functionality outside of the standard, but prefer
17
17
  this implementation for the default when working with NumPy arrays.
18
18
 
19
19
  """
20
- __version__ = '1.9.1'
20
+ __version__ = '1.12.0'
21
21
 
22
22
  from .common import * # noqa: F401, F403
@@ -2,10 +2,16 @@
2
2
  Internal helpers
3
3
  """
4
4
 
5
+ from collections.abc import Callable
5
6
  from functools import wraps
6
7
  from inspect import signature
8
+ from types import ModuleType
9
+ from typing import TypeVar
7
10
 
8
- def get_xp(xp):
11
+ _T = TypeVar("_T")
12
+
13
+
14
+ def get_xp(xp: ModuleType) -> Callable[[Callable[..., _T]], Callable[..., _T]]:
9
15
  """
10
16
  Decorator to automatically replace xp with the corresponding array module.
11
17
 
@@ -22,14 +28,14 @@ def get_xp(xp):
22
28
 
23
29
  """
24
30
 
25
- def inner(f):
31
+ def inner(f: Callable[..., _T], /) -> Callable[..., _T]:
26
32
  @wraps(f)
27
- def wrapped_f(*args, **kwargs):
33
+ def wrapped_f(*args: object, **kwargs: object) -> object:
28
34
  return f(*args, xp=xp, **kwargs)
29
35
 
30
36
  sig = signature(f)
31
37
  new_sig = sig.replace(
32
- parameters=[sig.parameters[i] for i in sig.parameters if i != "xp"]
38
+ parameters=[par for i, par in sig.parameters.items() if i != "xp"]
33
39
  )
34
40
 
35
41
  if wrapped_f.__doc__ is None:
@@ -40,7 +46,14 @@ See the corresponding documentation in NumPy/CuPy and/or the array API
40
46
  specification for more details.
41
47
 
42
48
  """
43
- wrapped_f.__signature__ = new_sig
44
- return wrapped_f
49
+ wrapped_f.__signature__ = new_sig # pyright: ignore[reportAttributeAccessIssue]
50
+ return wrapped_f # pyright: ignore[reportReturnType]
45
51
 
46
52
  return inner
53
+
54
+
55
+ __all__ = ["get_xp"]
56
+
57
+
58
+ def __dir__() -> list[str]:
59
+ return __all__
@@ -1 +1 @@
1
- from ._helpers import * # noqa: F403
1
+ from ._helpers import * # noqa: F403