scipy 1.15.3__cp312-cp312-macosx_14_0_arm64.whl → 1.16.0rc2__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 (628) hide show
  1. scipy/__config__.py +4 -4
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cpython-312-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-312-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-312-darwin.so +0 -0
  12. scipy/_lib/_test_deprecation_def.cpython-312-darwin.so +0 -0
  13. scipy/_lib/_testutils.py +6 -2
  14. scipy/_lib/_util.py +222 -125
  15. scipy/_lib/array_api_compat/__init__.py +4 -4
  16. scipy/_lib/array_api_compat/_internal.py +19 -6
  17. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  18. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  19. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  20. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  21. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  22. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  23. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  24. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  25. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  26. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  27. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  28. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  29. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  30. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  31. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  32. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  33. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  34. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  35. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  36. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  37. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  38. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  39. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  40. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  41. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  42. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  43. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  44. scipy/_lib/array_api_extra/__init__.py +26 -3
  45. scipy/_lib/array_api_extra/_delegation.py +171 -0
  46. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  47. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  48. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  49. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  50. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  51. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  52. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  53. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  54. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  58. scipy/_lib/array_api_extra/testing.py +359 -0
  59. scipy/_lib/decorator.py +2 -2
  60. scipy/_lib/doccer.py +1 -7
  61. scipy/_lib/messagestream.cpython-312-darwin.so +0 -0
  62. scipy/_lib/pyprima/__init__.py +212 -0
  63. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  64. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  65. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  66. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  67. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  68. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  69. scipy/_lib/pyprima/cobyla/update.py +289 -0
  70. scipy/_lib/pyprima/common/__init__.py +0 -0
  71. scipy/_lib/pyprima/common/_bounds.py +34 -0
  72. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  73. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  74. scipy/_lib/pyprima/common/_project.py +173 -0
  75. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  76. scipy/_lib/pyprima/common/consts.py +47 -0
  77. scipy/_lib/pyprima/common/evaluate.py +99 -0
  78. scipy/_lib/pyprima/common/history.py +38 -0
  79. scipy/_lib/pyprima/common/infos.py +30 -0
  80. scipy/_lib/pyprima/common/linalg.py +435 -0
  81. scipy/_lib/pyprima/common/message.py +290 -0
  82. scipy/_lib/pyprima/common/powalg.py +131 -0
  83. scipy/_lib/pyprima/common/preproc.py +277 -0
  84. scipy/_lib/pyprima/common/present.py +5 -0
  85. scipy/_lib/pyprima/common/ratio.py +54 -0
  86. scipy/_lib/pyprima/common/redrho.py +47 -0
  87. scipy/_lib/pyprima/common/selectx.py +296 -0
  88. scipy/_lib/tests/test__util.py +105 -121
  89. scipy/_lib/tests/test_array_api.py +166 -35
  90. scipy/_lib/tests/test_bunch.py +7 -0
  91. scipy/_lib/tests/test_ccallback.py +2 -10
  92. scipy/_lib/tests/test_public_api.py +13 -0
  93. scipy/cluster/_hierarchy.cpython-312-darwin.so +0 -0
  94. scipy/cluster/_optimal_leaf_ordering.cpython-312-darwin.so +0 -0
  95. scipy/cluster/_vq.cpython-312-darwin.so +0 -0
  96. scipy/cluster/hierarchy.py +393 -223
  97. scipy/cluster/tests/test_hierarchy.py +273 -335
  98. scipy/cluster/tests/test_vq.py +45 -61
  99. scipy/cluster/vq.py +39 -35
  100. scipy/conftest.py +263 -157
  101. scipy/constants/_constants.py +4 -1
  102. scipy/constants/tests/test_codata.py +2 -2
  103. scipy/constants/tests/test_constants.py +11 -18
  104. scipy/datasets/_download_all.py +15 -1
  105. scipy/datasets/_fetchers.py +7 -1
  106. scipy/datasets/_utils.py +1 -1
  107. scipy/differentiate/_differentiate.py +25 -25
  108. scipy/differentiate/tests/test_differentiate.py +24 -25
  109. scipy/fft/_basic.py +20 -0
  110. scipy/fft/_helper.py +3 -34
  111. scipy/fft/_pocketfft/helper.py +29 -1
  112. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  113. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  114. scipy/fft/_realtransforms.py +13 -0
  115. scipy/fft/tests/test_basic.py +27 -25
  116. scipy/fft/tests/test_fftlog.py +16 -7
  117. scipy/fft/tests/test_helper.py +18 -34
  118. scipy/fft/tests/test_real_transforms.py +8 -10
  119. scipy/fftpack/convolve.cpython-312-darwin.so +0 -0
  120. scipy/fftpack/tests/test_basic.py +2 -4
  121. scipy/fftpack/tests/test_real_transforms.py +8 -9
  122. scipy/integrate/_bvp.py +9 -3
  123. scipy/integrate/_cubature.py +3 -2
  124. scipy/integrate/_dop.cpython-312-darwin.so +0 -0
  125. scipy/integrate/_lsoda.cpython-312-darwin.so +0 -0
  126. scipy/integrate/_ode.py +9 -2
  127. scipy/integrate/_odepack.cpython-312-darwin.so +0 -0
  128. scipy/integrate/_quad_vec.py +21 -29
  129. scipy/integrate/_quadpack.cpython-312-darwin.so +0 -0
  130. scipy/integrate/_quadpack_py.py +11 -7
  131. scipy/integrate/_quadrature.py +3 -3
  132. scipy/integrate/_rules/_base.py +2 -2
  133. scipy/integrate/_tanhsinh.py +48 -47
  134. scipy/integrate/_test_odeint_banded.cpython-312-darwin.so +0 -0
  135. scipy/integrate/_vode.cpython-312-darwin.so +0 -0
  136. scipy/integrate/tests/test__quad_vec.py +0 -6
  137. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  138. scipy/integrate/tests/test_cubature.py +21 -35
  139. scipy/integrate/tests/test_quadrature.py +6 -8
  140. scipy/integrate/tests/test_tanhsinh.py +56 -48
  141. scipy/interpolate/__init__.py +70 -58
  142. scipy/interpolate/_bary_rational.py +22 -22
  143. scipy/interpolate/_bsplines.py +119 -66
  144. scipy/interpolate/_cubic.py +65 -50
  145. scipy/interpolate/_dfitpack.cpython-312-darwin.so +0 -0
  146. scipy/interpolate/_dierckx.cpython-312-darwin.so +0 -0
  147. scipy/interpolate/_fitpack.cpython-312-darwin.so +0 -0
  148. scipy/interpolate/_fitpack2.py +9 -6
  149. scipy/interpolate/_fitpack_impl.py +32 -26
  150. scipy/interpolate/_fitpack_repro.py +23 -19
  151. scipy/interpolate/_interpnd.cpython-312-darwin.so +0 -0
  152. scipy/interpolate/_interpolate.py +30 -12
  153. scipy/interpolate/_ndbspline.py +13 -18
  154. scipy/interpolate/_ndgriddata.py +5 -8
  155. scipy/interpolate/_polyint.py +95 -31
  156. scipy/interpolate/_ppoly.cpython-312-darwin.so +0 -0
  157. scipy/interpolate/_rbf.py +2 -2
  158. scipy/interpolate/_rbfinterp.py +1 -1
  159. scipy/interpolate/_rbfinterp_pythran.cpython-312-darwin.so +0 -0
  160. scipy/interpolate/_rgi.py +31 -26
  161. scipy/interpolate/_rgi_cython.cpython-312-darwin.so +0 -0
  162. scipy/interpolate/dfitpack.py +0 -20
  163. scipy/interpolate/interpnd.py +1 -2
  164. scipy/interpolate/tests/test_bary_rational.py +2 -2
  165. scipy/interpolate/tests/test_bsplines.py +97 -1
  166. scipy/interpolate/tests/test_fitpack2.py +39 -1
  167. scipy/interpolate/tests/test_interpnd.py +32 -20
  168. scipy/interpolate/tests/test_interpolate.py +48 -4
  169. scipy/interpolate/tests/test_rgi.py +2 -1
  170. scipy/io/_fast_matrix_market/__init__.py +2 -0
  171. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  172. scipy/io/_harwell_boeing/hb.py +7 -11
  173. scipy/io/_idl.py +5 -7
  174. scipy/io/_netcdf.py +15 -5
  175. scipy/io/_test_fortran.cpython-312-darwin.so +0 -0
  176. scipy/io/arff/tests/test_arffread.py +3 -3
  177. scipy/io/matlab/__init__.py +5 -3
  178. scipy/io/matlab/_mio.py +4 -1
  179. scipy/io/matlab/_mio5.py +19 -13
  180. scipy/io/matlab/_mio5_utils.cpython-312-darwin.so +0 -0
  181. scipy/io/matlab/_mio_utils.cpython-312-darwin.so +0 -0
  182. scipy/io/matlab/_miobase.py +4 -1
  183. scipy/io/matlab/_streams.cpython-312-darwin.so +0 -0
  184. scipy/io/matlab/tests/test_mio.py +46 -18
  185. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  186. scipy/io/tests/test_mmio.py +7 -1
  187. scipy/io/tests/test_wavfile.py +41 -0
  188. scipy/io/wavfile.py +57 -10
  189. scipy/linalg/_basic.py +113 -86
  190. scipy/linalg/_cythonized_array_utils.cpython-312-darwin.so +0 -0
  191. scipy/linalg/_decomp.py +22 -9
  192. scipy/linalg/_decomp_cholesky.py +28 -13
  193. scipy/linalg/_decomp_cossin.py +45 -30
  194. scipy/linalg/_decomp_interpolative.cpython-312-darwin.so +0 -0
  195. scipy/linalg/_decomp_ldl.py +4 -1
  196. scipy/linalg/_decomp_lu.py +18 -6
  197. scipy/linalg/_decomp_lu_cython.cpython-312-darwin.so +0 -0
  198. scipy/linalg/_decomp_polar.py +2 -0
  199. scipy/linalg/_decomp_qr.py +6 -2
  200. scipy/linalg/_decomp_qz.py +3 -0
  201. scipy/linalg/_decomp_schur.py +3 -1
  202. scipy/linalg/_decomp_svd.py +13 -2
  203. scipy/linalg/_decomp_update.cpython-312-darwin.so +0 -0
  204. scipy/linalg/_expm_frechet.py +4 -0
  205. scipy/linalg/_fblas.cpython-312-darwin.so +0 -0
  206. scipy/linalg/_flapack.cpython-312-darwin.so +0 -0
  207. scipy/linalg/_linalg_pythran.cpython-312-darwin.so +0 -0
  208. scipy/linalg/_matfuncs.py +187 -4
  209. scipy/linalg/_matfuncs_expm.cpython-312-darwin.so +0 -0
  210. scipy/linalg/_matfuncs_schur_sqrtm.cpython-312-darwin.so +0 -0
  211. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  212. scipy/linalg/_matfuncs_sqrtm_triu.cpython-312-darwin.so +0 -0
  213. scipy/linalg/_procrustes.py +2 -0
  214. scipy/linalg/_sketches.py +17 -6
  215. scipy/linalg/_solve_toeplitz.cpython-312-darwin.so +0 -0
  216. scipy/linalg/_solvers.py +7 -2
  217. scipy/linalg/_special_matrices.py +26 -36
  218. scipy/linalg/cython_blas.cpython-312-darwin.so +0 -0
  219. scipy/linalg/cython_lapack.cpython-312-darwin.so +0 -0
  220. scipy/linalg/lapack.py +22 -2
  221. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  222. scipy/linalg/tests/test_basic.py +31 -16
  223. scipy/linalg/tests/test_batch.py +588 -0
  224. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  225. scipy/linalg/tests/test_decomp.py +40 -3
  226. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  227. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  228. scipy/linalg/tests/test_lapack.py +115 -7
  229. scipy/linalg/tests/test_matfuncs.py +157 -102
  230. scipy/linalg/tests/test_procrustes.py +0 -7
  231. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  232. scipy/linalg/tests/test_special_matrices.py +1 -5
  233. scipy/ndimage/__init__.py +1 -0
  234. scipy/ndimage/_cytest.cpython-312-darwin.so +0 -0
  235. scipy/ndimage/_delegators.py +8 -2
  236. scipy/ndimage/_filters.py +453 -5
  237. scipy/ndimage/_interpolation.py +36 -6
  238. scipy/ndimage/_measurements.py +4 -2
  239. scipy/ndimage/_morphology.py +5 -0
  240. scipy/ndimage/_nd_image.cpython-312-darwin.so +0 -0
  241. scipy/ndimage/_ni_docstrings.py +5 -1
  242. scipy/ndimage/_ni_label.cpython-312-darwin.so +0 -0
  243. scipy/ndimage/_ni_support.py +1 -5
  244. scipy/ndimage/_rank_filter_1d.cpython-312-darwin.so +0 -0
  245. scipy/ndimage/_support_alternative_backends.py +18 -6
  246. scipy/ndimage/tests/test_filters.py +370 -259
  247. scipy/ndimage/tests/test_fourier.py +7 -9
  248. scipy/ndimage/tests/test_interpolation.py +68 -61
  249. scipy/ndimage/tests/test_measurements.py +18 -35
  250. scipy/ndimage/tests/test_morphology.py +143 -131
  251. scipy/ndimage/tests/test_splines.py +1 -3
  252. scipy/odr/__odrpack.cpython-312-darwin.so +0 -0
  253. scipy/optimize/_basinhopping.py +13 -7
  254. scipy/optimize/_bglu_dense.cpython-312-darwin.so +0 -0
  255. scipy/optimize/_bracket.py +17 -24
  256. scipy/optimize/_chandrupatla.py +9 -10
  257. scipy/optimize/_cobyla_py.py +104 -123
  258. scipy/optimize/_constraints.py +14 -10
  259. scipy/optimize/_differentiable_functions.py +371 -230
  260. scipy/optimize/_differentialevolution.py +4 -3
  261. scipy/optimize/_direct.cpython-312-darwin.so +0 -0
  262. scipy/optimize/_dual_annealing.py +1 -1
  263. scipy/optimize/_elementwise.py +1 -4
  264. scipy/optimize/_group_columns.cpython-312-darwin.so +0 -0
  265. scipy/optimize/_lbfgsb.cpython-312-darwin.so +0 -0
  266. scipy/optimize/_lbfgsb_py.py +57 -16
  267. scipy/optimize/_linprog_doc.py +2 -2
  268. scipy/optimize/_linprog_highs.py +2 -2
  269. scipy/optimize/_linprog_ip.py +25 -10
  270. scipy/optimize/_linprog_util.py +14 -16
  271. scipy/optimize/_lsap.cpython-312-darwin.so +0 -0
  272. scipy/optimize/_lsq/common.py +3 -3
  273. scipy/optimize/_lsq/dogbox.py +16 -2
  274. scipy/optimize/_lsq/givens_elimination.cpython-312-darwin.so +0 -0
  275. scipy/optimize/_lsq/least_squares.py +198 -126
  276. scipy/optimize/_lsq/lsq_linear.py +6 -6
  277. scipy/optimize/_lsq/trf.py +35 -8
  278. scipy/optimize/_milp.py +3 -1
  279. scipy/optimize/_minimize.py +105 -36
  280. scipy/optimize/_minpack.cpython-312-darwin.so +0 -0
  281. scipy/optimize/_minpack_py.py +21 -14
  282. scipy/optimize/_moduleTNC.cpython-312-darwin.so +0 -0
  283. scipy/optimize/_nnls.py +20 -21
  284. scipy/optimize/_nonlin.py +34 -3
  285. scipy/optimize/_numdiff.py +288 -110
  286. scipy/optimize/_optimize.py +86 -48
  287. scipy/optimize/_pava_pybind.cpython-312-darwin.so +0 -0
  288. scipy/optimize/_remove_redundancy.py +5 -5
  289. scipy/optimize/_root_scalar.py +1 -1
  290. scipy/optimize/_shgo.py +6 -0
  291. scipy/optimize/_shgo_lib/_complex.py +1 -1
  292. scipy/optimize/_slsqp_py.py +216 -124
  293. scipy/optimize/_slsqplib.cpython-312-darwin.so +0 -0
  294. scipy/optimize/_spectral.py +1 -1
  295. scipy/optimize/_tnc.py +8 -1
  296. scipy/optimize/_trlib/_trlib.cpython-312-darwin.so +0 -0
  297. scipy/optimize/_trustregion.py +20 -6
  298. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  299. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  300. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  301. scipy/optimize/_trustregion_constr/projections.py +12 -8
  302. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  303. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  304. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  305. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  306. scipy/optimize/_trustregion_exact.py +0 -1
  307. scipy/optimize/_zeros.cpython-312-darwin.so +0 -0
  308. scipy/optimize/_zeros_py.py +97 -17
  309. scipy/optimize/cython_optimize/_zeros.cpython-312-darwin.so +0 -0
  310. scipy/optimize/slsqp.py +0 -1
  311. scipy/optimize/tests/test__basinhopping.py +1 -1
  312. scipy/optimize/tests/test__differential_evolution.py +4 -4
  313. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  314. scipy/optimize/tests/test__numdiff.py +66 -22
  315. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  316. scipy/optimize/tests/test__shgo.py +9 -1
  317. scipy/optimize/tests/test_bracket.py +36 -46
  318. scipy/optimize/tests/test_chandrupatla.py +133 -135
  319. scipy/optimize/tests/test_cobyla.py +74 -45
  320. scipy/optimize/tests/test_constraints.py +1 -1
  321. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  322. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  323. scipy/optimize/tests/test_least_squares.py +125 -13
  324. scipy/optimize/tests/test_linear_assignment.py +3 -3
  325. scipy/optimize/tests/test_linprog.py +3 -3
  326. scipy/optimize/tests/test_lsq_linear.py +6 -6
  327. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  328. scipy/optimize/tests/test_minpack.py +4 -4
  329. scipy/optimize/tests/test_nnls.py +43 -3
  330. scipy/optimize/tests/test_nonlin.py +36 -0
  331. scipy/optimize/tests/test_optimize.py +95 -17
  332. scipy/optimize/tests/test_slsqp.py +36 -4
  333. scipy/optimize/tests/test_zeros.py +34 -1
  334. scipy/signal/__init__.py +12 -23
  335. scipy/signal/_delegators.py +568 -0
  336. scipy/signal/_filter_design.py +459 -241
  337. scipy/signal/_fir_filter_design.py +262 -90
  338. scipy/signal/_lti_conversion.py +3 -2
  339. scipy/signal/_ltisys.py +118 -91
  340. scipy/signal/_max_len_seq_inner.cpython-312-darwin.so +0 -0
  341. scipy/signal/_peak_finding_utils.cpython-312-darwin.so +0 -0
  342. scipy/signal/_polyutils.py +172 -0
  343. scipy/signal/_short_time_fft.py +519 -70
  344. scipy/signal/_signal_api.py +30 -0
  345. scipy/signal/_signaltools.py +719 -399
  346. scipy/signal/_sigtools.cpython-312-darwin.so +0 -0
  347. scipy/signal/_sosfilt.cpython-312-darwin.so +0 -0
  348. scipy/signal/_spectral_py.py +230 -50
  349. scipy/signal/_spline.cpython-312-darwin.so +0 -0
  350. scipy/signal/_spline_filters.py +108 -68
  351. scipy/signal/_support_alternative_backends.py +73 -0
  352. scipy/signal/_upfirdn.py +4 -1
  353. scipy/signal/_upfirdn_apply.cpython-312-darwin.so +0 -0
  354. scipy/signal/_waveforms.py +2 -11
  355. scipy/signal/_wavelets.py +1 -1
  356. scipy/signal/fir_filter_design.py +1 -0
  357. scipy/signal/spline.py +4 -11
  358. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  359. scipy/signal/tests/test_bsplines.py +114 -79
  360. scipy/signal/tests/test_cont2discrete.py +9 -2
  361. scipy/signal/tests/test_filter_design.py +721 -481
  362. scipy/signal/tests/test_fir_filter_design.py +332 -140
  363. scipy/signal/tests/test_savitzky_golay.py +4 -3
  364. scipy/signal/tests/test_short_time_fft.py +221 -3
  365. scipy/signal/tests/test_signaltools.py +2144 -1348
  366. scipy/signal/tests/test_spectral.py +50 -6
  367. scipy/signal/tests/test_splines.py +161 -96
  368. scipy/signal/tests/test_upfirdn.py +84 -50
  369. scipy/signal/tests/test_waveforms.py +20 -0
  370. scipy/signal/tests/test_windows.py +607 -466
  371. scipy/signal/windows/_windows.py +287 -148
  372. scipy/sparse/__init__.py +23 -4
  373. scipy/sparse/_base.py +270 -108
  374. scipy/sparse/_bsr.py +7 -4
  375. scipy/sparse/_compressed.py +59 -231
  376. scipy/sparse/_construct.py +90 -38
  377. scipy/sparse/_coo.py +115 -181
  378. scipy/sparse/_csc.py +4 -4
  379. scipy/sparse/_csparsetools.cpython-312-darwin.so +0 -0
  380. scipy/sparse/_csr.py +2 -2
  381. scipy/sparse/_data.py +48 -48
  382. scipy/sparse/_dia.py +105 -18
  383. scipy/sparse/_dok.py +0 -23
  384. scipy/sparse/_index.py +4 -4
  385. scipy/sparse/_matrix.py +23 -0
  386. scipy/sparse/_sparsetools.cpython-312-darwin.so +0 -0
  387. scipy/sparse/_sputils.py +37 -22
  388. scipy/sparse/base.py +0 -9
  389. scipy/sparse/bsr.py +0 -14
  390. scipy/sparse/compressed.py +0 -23
  391. scipy/sparse/construct.py +0 -6
  392. scipy/sparse/coo.py +0 -14
  393. scipy/sparse/csc.py +0 -3
  394. scipy/sparse/csgraph/_flow.cpython-312-darwin.so +0 -0
  395. scipy/sparse/csgraph/_matching.cpython-312-darwin.so +0 -0
  396. scipy/sparse/csgraph/_min_spanning_tree.cpython-312-darwin.so +0 -0
  397. scipy/sparse/csgraph/_reordering.cpython-312-darwin.so +0 -0
  398. scipy/sparse/csgraph/_shortest_path.cpython-312-darwin.so +0 -0
  399. scipy/sparse/csgraph/_tools.cpython-312-darwin.so +0 -0
  400. scipy/sparse/csgraph/_traversal.cpython-312-darwin.so +0 -0
  401. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  402. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  403. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  404. scipy/sparse/csr.py +0 -5
  405. scipy/sparse/data.py +1 -6
  406. scipy/sparse/dia.py +0 -7
  407. scipy/sparse/dok.py +0 -10
  408. scipy/sparse/linalg/_dsolve/_superlu.cpython-312-darwin.so +0 -0
  409. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  410. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  411. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-312-darwin.so +0 -0
  412. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  413. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  414. scipy/sparse/linalg/_interface.py +17 -18
  415. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  416. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  417. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  418. scipy/sparse/linalg/_isolve/minres.py +5 -5
  419. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  420. scipy/sparse/linalg/_isolve/utils.py +2 -8
  421. scipy/sparse/linalg/_matfuncs.py +1 -1
  422. scipy/sparse/linalg/_norm.py +1 -1
  423. scipy/sparse/linalg/_propack/_cpropack.cpython-312-darwin.so +0 -0
  424. scipy/sparse/linalg/_propack/_dpropack.cpython-312-darwin.so +0 -0
  425. scipy/sparse/linalg/_propack/_spropack.cpython-312-darwin.so +0 -0
  426. scipy/sparse/linalg/_propack/_zpropack.cpython-312-darwin.so +0 -0
  427. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  428. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  429. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  430. scipy/sparse/tests/test_base.py +214 -42
  431. scipy/sparse/tests/test_common1d.py +7 -7
  432. scipy/sparse/tests/test_construct.py +1 -1
  433. scipy/sparse/tests/test_coo.py +272 -4
  434. scipy/sparse/tests/test_sparsetools.py +5 -0
  435. scipy/sparse/tests/test_sputils.py +36 -7
  436. scipy/spatial/_ckdtree.cpython-312-darwin.so +0 -0
  437. scipy/spatial/_distance_pybind.cpython-312-darwin.so +0 -0
  438. scipy/spatial/_distance_wrap.cpython-312-darwin.so +0 -0
  439. scipy/spatial/_hausdorff.cpython-312-darwin.so +0 -0
  440. scipy/spatial/_qhull.cpython-312-darwin.so +0 -0
  441. scipy/spatial/_voronoi.cpython-312-darwin.so +0 -0
  442. scipy/spatial/distance.py +49 -42
  443. scipy/spatial/tests/test_distance.py +15 -1
  444. scipy/spatial/tests/test_kdtree.py +1 -0
  445. scipy/spatial/tests/test_qhull.py +7 -2
  446. scipy/spatial/transform/__init__.py +5 -3
  447. scipy/spatial/transform/_rigid_transform.cpython-312-darwin.so +0 -0
  448. scipy/spatial/transform/_rotation.cpython-312-darwin.so +0 -0
  449. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  450. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  451. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  452. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  453. scipy/special/__init__.py +1 -47
  454. scipy/special/_add_newdocs.py +34 -772
  455. scipy/special/_basic.py +22 -25
  456. scipy/special/_comb.cpython-312-darwin.so +0 -0
  457. scipy/special/_ellip_harm_2.cpython-312-darwin.so +0 -0
  458. scipy/special/_gufuncs.cpython-312-darwin.so +0 -0
  459. scipy/special/_logsumexp.py +67 -58
  460. scipy/special/_orthogonal.pyi +1 -1
  461. scipy/special/_specfun.cpython-312-darwin.so +0 -0
  462. scipy/special/_special_ufuncs.cpython-312-darwin.so +0 -0
  463. scipy/special/_spherical_bessel.py +4 -4
  464. scipy/special/_support_alternative_backends.py +212 -119
  465. scipy/special/_test_internal.cpython-312-darwin.so +0 -0
  466. scipy/special/_testutils.py +4 -4
  467. scipy/special/_ufuncs.cpython-312-darwin.so +0 -0
  468. scipy/special/_ufuncs.pyi +1 -0
  469. scipy/special/_ufuncs.pyx +215 -1400
  470. scipy/special/_ufuncs_cxx.cpython-312-darwin.so +0 -0
  471. scipy/special/_ufuncs_cxx.pxd +2 -15
  472. scipy/special/_ufuncs_cxx.pyx +5 -44
  473. scipy/special/_ufuncs_cxx_defs.h +2 -16
  474. scipy/special/_ufuncs_defs.h +0 -8
  475. scipy/special/cython_special.cpython-312-darwin.so +0 -0
  476. scipy/special/cython_special.pxd +1 -1
  477. scipy/special/tests/_cython_examples/meson.build +10 -1
  478. scipy/special/tests/test_basic.py +153 -20
  479. scipy/special/tests/test_boost_ufuncs.py +3 -0
  480. scipy/special/tests/test_cdflib.py +35 -11
  481. scipy/special/tests/test_gammainc.py +16 -0
  482. scipy/special/tests/test_hyp2f1.py +2 -2
  483. scipy/special/tests/test_log1mexp.py +85 -0
  484. scipy/special/tests/test_logsumexp.py +206 -64
  485. scipy/special/tests/test_mpmath.py +1 -0
  486. scipy/special/tests/test_nan_inputs.py +1 -1
  487. scipy/special/tests/test_orthogonal.py +17 -18
  488. scipy/special/tests/test_sf_error.py +3 -2
  489. scipy/special/tests/test_sph_harm.py +6 -7
  490. scipy/special/tests/test_support_alternative_backends.py +211 -76
  491. scipy/stats/__init__.py +4 -1
  492. scipy/stats/_ansari_swilk_statistics.cpython-312-darwin.so +0 -0
  493. scipy/stats/_axis_nan_policy.py +5 -12
  494. scipy/stats/_biasedurn.cpython-312-darwin.so +0 -0
  495. scipy/stats/_continued_fraction.py +387 -0
  496. scipy/stats/_continuous_distns.py +277 -310
  497. scipy/stats/_correlation.py +1 -1
  498. scipy/stats/_covariance.py +6 -3
  499. scipy/stats/_discrete_distns.py +39 -32
  500. scipy/stats/_distn_infrastructure.py +39 -12
  501. scipy/stats/_distribution_infrastructure.py +900 -238
  502. scipy/stats/_entropy.py +9 -10
  503. scipy/{_lib → stats}/_finite_differences.py +1 -1
  504. scipy/stats/_hypotests.py +83 -50
  505. scipy/stats/_kde.py +53 -49
  506. scipy/stats/_ksstats.py +1 -1
  507. scipy/stats/_levy_stable/__init__.py +7 -15
  508. scipy/stats/_levy_stable/levyst.cpython-312-darwin.so +0 -0
  509. scipy/stats/_morestats.py +118 -73
  510. scipy/stats/_mstats_basic.py +13 -17
  511. scipy/stats/_mstats_extras.py +8 -8
  512. scipy/stats/_multivariate.py +89 -113
  513. scipy/stats/_new_distributions.py +97 -20
  514. scipy/stats/_page_trend_test.py +12 -5
  515. scipy/stats/_probability_distribution.py +265 -43
  516. scipy/stats/_qmc.py +14 -9
  517. scipy/stats/_qmc_cy.cpython-312-darwin.so +0 -0
  518. scipy/stats/_qmvnt.py +16 -95
  519. scipy/stats/_qmvnt_cy.cpython-312-darwin.so +0 -0
  520. scipy/stats/_quantile.py +335 -0
  521. scipy/stats/_rcont/rcont.cpython-312-darwin.so +0 -0
  522. scipy/stats/_resampling.py +4 -29
  523. scipy/stats/_sampling.py +1 -1
  524. scipy/stats/_sobol.cpython-312-darwin.so +0 -0
  525. scipy/stats/_stats.cpython-312-darwin.so +0 -0
  526. scipy/stats/_stats_mstats_common.py +21 -2
  527. scipy/stats/_stats_py.py +550 -476
  528. scipy/stats/_stats_pythran.cpython-312-darwin.so +0 -0
  529. scipy/stats/_unuran/unuran_wrapper.cpython-312-darwin.so +0 -0
  530. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  531. scipy/stats/_variation.py +6 -8
  532. scipy/stats/_wilcoxon.py +13 -7
  533. scipy/stats/tests/common_tests.py +6 -4
  534. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  535. scipy/stats/tests/test_continued_fraction.py +173 -0
  536. scipy/stats/tests/test_continuous.py +379 -60
  537. scipy/stats/tests/test_continuous_basic.py +18 -12
  538. scipy/stats/tests/test_discrete_basic.py +14 -8
  539. scipy/stats/tests/test_discrete_distns.py +16 -16
  540. scipy/stats/tests/test_distributions.py +95 -75
  541. scipy/stats/tests/test_entropy.py +40 -48
  542. scipy/stats/tests/test_fit.py +4 -3
  543. scipy/stats/tests/test_hypotests.py +153 -24
  544. scipy/stats/tests/test_kdeoth.py +109 -41
  545. scipy/stats/tests/test_marray.py +289 -0
  546. scipy/stats/tests/test_morestats.py +79 -47
  547. scipy/stats/tests/test_mstats_basic.py +3 -3
  548. scipy/stats/tests/test_multivariate.py +434 -83
  549. scipy/stats/tests/test_qmc.py +13 -10
  550. scipy/stats/tests/test_quantile.py +199 -0
  551. scipy/stats/tests/test_rank.py +119 -112
  552. scipy/stats/tests/test_resampling.py +47 -56
  553. scipy/stats/tests/test_sampling.py +9 -4
  554. scipy/stats/tests/test_stats.py +799 -939
  555. scipy/stats/tests/test_variation.py +8 -6
  556. scipy/version.py +2 -2
  557. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  558. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  559. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +560 -567
  560. scipy-1.16.0rc2.dist-info/WHEEL +6 -0
  561. scipy/_lib/array_api_extra/_funcs.py +0 -484
  562. scipy/_lib/array_api_extra/_typing.py +0 -8
  563. scipy/interpolate/_bspl.cpython-312-darwin.so +0 -0
  564. scipy/optimize/_cobyla.cpython-312-darwin.so +0 -0
  565. scipy/optimize/_cython_nnls.cpython-312-darwin.so +0 -0
  566. scipy/optimize/_slsqp.cpython-312-darwin.so +0 -0
  567. scipy/spatial/qhull_src/COPYING.txt +0 -38
  568. scipy/special/libsf_error_state.dylib +0 -0
  569. scipy/special/tests/test_log_softmax.py +0 -109
  570. scipy/special/tests/test_xsf_cuda.py +0 -114
  571. scipy/special/xsf/binom.h +0 -89
  572. scipy/special/xsf/cdflib.h +0 -100
  573. scipy/special/xsf/cephes/airy.h +0 -307
  574. scipy/special/xsf/cephes/besselpoly.h +0 -51
  575. scipy/special/xsf/cephes/beta.h +0 -257
  576. scipy/special/xsf/cephes/cbrt.h +0 -131
  577. scipy/special/xsf/cephes/chbevl.h +0 -85
  578. scipy/special/xsf/cephes/chdtr.h +0 -193
  579. scipy/special/xsf/cephes/const.h +0 -87
  580. scipy/special/xsf/cephes/ellie.h +0 -293
  581. scipy/special/xsf/cephes/ellik.h +0 -251
  582. scipy/special/xsf/cephes/ellpe.h +0 -107
  583. scipy/special/xsf/cephes/ellpk.h +0 -117
  584. scipy/special/xsf/cephes/expn.h +0 -260
  585. scipy/special/xsf/cephes/gamma.h +0 -398
  586. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  587. scipy/special/xsf/cephes/hyperg.h +0 -361
  588. scipy/special/xsf/cephes/i0.h +0 -149
  589. scipy/special/xsf/cephes/i1.h +0 -158
  590. scipy/special/xsf/cephes/igam.h +0 -421
  591. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  592. scipy/special/xsf/cephes/igami.h +0 -313
  593. scipy/special/xsf/cephes/j0.h +0 -225
  594. scipy/special/xsf/cephes/j1.h +0 -198
  595. scipy/special/xsf/cephes/jv.h +0 -715
  596. scipy/special/xsf/cephes/k0.h +0 -164
  597. scipy/special/xsf/cephes/k1.h +0 -163
  598. scipy/special/xsf/cephes/kn.h +0 -243
  599. scipy/special/xsf/cephes/lanczos.h +0 -112
  600. scipy/special/xsf/cephes/ndtr.h +0 -275
  601. scipy/special/xsf/cephes/poch.h +0 -85
  602. scipy/special/xsf/cephes/polevl.h +0 -167
  603. scipy/special/xsf/cephes/psi.h +0 -194
  604. scipy/special/xsf/cephes/rgamma.h +0 -111
  605. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  606. scipy/special/xsf/cephes/shichi.h +0 -248
  607. scipy/special/xsf/cephes/sici.h +0 -224
  608. scipy/special/xsf/cephes/sindg.h +0 -221
  609. scipy/special/xsf/cephes/tandg.h +0 -139
  610. scipy/special/xsf/cephes/trig.h +0 -58
  611. scipy/special/xsf/cephes/unity.h +0 -186
  612. scipy/special/xsf/cephes/zeta.h +0 -172
  613. scipy/special/xsf/config.h +0 -304
  614. scipy/special/xsf/digamma.h +0 -205
  615. scipy/special/xsf/error.h +0 -57
  616. scipy/special/xsf/evalpoly.h +0 -47
  617. scipy/special/xsf/expint.h +0 -266
  618. scipy/special/xsf/hyp2f1.h +0 -694
  619. scipy/special/xsf/iv_ratio.h +0 -173
  620. scipy/special/xsf/lambertw.h +0 -150
  621. scipy/special/xsf/loggamma.h +0 -163
  622. scipy/special/xsf/sici.h +0 -200
  623. scipy/special/xsf/tools.h +0 -427
  624. scipy/special/xsf/trig.h +0 -164
  625. scipy/special/xsf/wright_bessel.h +0 -843
  626. scipy/special/xsf/zlog1.h +0 -35
  627. scipy/stats/_mvn.cpython-312-darwin.so +0 -0
  628. scipy-1.15.3.dist-info/WHEEL +0 -4
@@ -2,25 +2,26 @@ from multiprocessing import Pool
2
2
  from multiprocessing.pool import Pool as PWL
3
3
  import re
4
4
  import math
5
+ import functools
5
6
  from fractions import Fraction
6
7
 
7
8
  import numpy as np
8
9
  from numpy.testing import assert_equal, assert_
9
10
  import pytest
10
11
  from pytest import raises as assert_raises
11
- import hypothesis.extra.numpy as npst
12
- from hypothesis import given, strategies, reproduce_failure # noqa: F401
13
- from scipy.conftest import array_api_compatible, skip_xp_invalid_arg
12
+ from scipy.conftest import skip_xp_invalid_arg
14
13
 
15
- from scipy._lib._array_api import (xp_assert_equal, xp_assert_close, is_numpy,
16
- xp_copy, is_array_api_strict)
14
+ from scipy._lib._array_api import xp_assert_equal, is_numpy
17
15
  from scipy._lib._util import (_aligned_zeros, check_random_state, MapWrapper,
18
16
  getfullargspec_no_self, FullArgSpec,
19
17
  rng_integers, _validate_int, _rename_parameter,
20
- _contains_nan, _rng_html_rewrite, _lazywhere)
18
+ _contains_nan, _rng_html_rewrite, _workers_wrapper)
19
+ import scipy._lib.array_api_extra as xpx
20
+ from scipy._lib.array_api_extra.testing import lazy_xp_function
21
21
  from scipy import cluster, interpolate, linalg, optimize, sparse, spatial, stats
22
22
 
23
- skip_xp_backends = pytest.mark.skip_xp_backends
23
+
24
+ lazy_xp_function(_contains_nan)
24
25
 
25
26
 
26
27
  @pytest.mark.slow
@@ -147,6 +148,36 @@ def test_mapwrapper_parallel():
147
148
  assert_equal(list(out), out_arg)
148
149
 
149
150
 
151
+ @_workers_wrapper
152
+ def user_of_workers(x, b=1, workers=None):
153
+ assert workers is not None
154
+ assert isinstance(workers, MapWrapper)
155
+ return np.array(list(workers(np.sin, x * b)))
156
+
157
+
158
+ def test__workers_wrapper():
159
+ arr = np.linspace(0, np.pi)
160
+ req = np.sin(arr * 2.0)
161
+
162
+ with Pool(2) as p:
163
+ v = user_of_workers(arr, workers=p.map, b=2)
164
+ assert_equal(v, req)
165
+
166
+ v = user_of_workers(arr, workers=None, b=2)
167
+ assert_equal(v, req)
168
+
169
+ v = user_of_workers(arr, workers=2, b=2)
170
+ assert_equal(v, req)
171
+
172
+ # assess if decorator works with partial functions
173
+ part_f = functools.partial(user_of_workers, b=2)
174
+ assert_equal(part_f(arr), req)
175
+
176
+ with Pool(2) as p:
177
+ part_f = functools.partial(user_of_workers, b=2, workers=p.map)
178
+ assert_equal(part_f(arr), req)
179
+
180
+
150
181
  def test_rng_integers():
151
182
  rng = np.random.RandomState()
152
183
 
@@ -296,86 +327,103 @@ class TestRenameParameter:
296
327
  self.old_keyword_deprecated(new=10, old=10)
297
328
 
298
329
 
299
- class TestContainsNaNTest:
300
-
330
+ class TestContainsNaN:
301
331
  def test_policy(self):
302
332
  data = np.array([1, 2, 3, np.nan])
303
333
 
304
- contains_nan, nan_policy = _contains_nan(data, nan_policy="propagate")
305
- assert contains_nan
306
- assert nan_policy == "propagate"
307
-
308
- contains_nan, nan_policy = _contains_nan(data, nan_policy="omit")
309
- assert contains_nan
310
- assert nan_policy == "omit"
334
+ assert _contains_nan(data) # default policy is "propagate"
335
+ assert _contains_nan(data, nan_policy="propagate")
336
+ assert _contains_nan(data, nan_policy="omit")
337
+ assert not _contains_nan(data[:3])
338
+ assert not _contains_nan(data[:3], nan_policy="propagate")
339
+ assert not _contains_nan(data[:3], nan_policy="omit")
311
340
 
312
- msg = "The input contains nan values"
313
- with pytest.raises(ValueError, match=msg):
341
+ with pytest.raises(ValueError, match="The input contains nan values"):
314
342
  _contains_nan(data, nan_policy="raise")
343
+ assert not _contains_nan(data[:3], nan_policy="raise")
315
344
 
316
- msg = "nan_policy must be one of"
317
- with pytest.raises(ValueError, match=msg):
345
+ with pytest.raises(ValueError, match="nan_policy must be one of"):
318
346
  _contains_nan(data, nan_policy="nan")
319
347
 
320
348
  def test_contains_nan(self):
321
- data1 = np.array([1, 2, 3])
322
- assert not _contains_nan(data1)[0]
323
-
324
- data2 = np.array([1, 2, 3, np.nan])
325
- assert _contains_nan(data2)[0]
326
-
327
- data3 = np.array([np.nan, 2, 3, np.nan])
328
- assert _contains_nan(data3)[0]
329
-
330
- data4 = np.array([[1, 2], [3, 4]])
331
- assert not _contains_nan(data4)[0]
332
-
333
- data5 = np.array([[1, 2], [3, np.nan]])
334
- assert _contains_nan(data5)[0]
349
+ # Special case: empty array
350
+ assert not _contains_nan(np.array([], dtype=float))
351
+
352
+ # Integer arrays cannot contain NaN
353
+ assert not _contains_nan(np.array([1, 2, 3]))
354
+ assert not _contains_nan(np.array([[1, 2], [3, 4]]))
355
+
356
+ assert not _contains_nan(np.array([1., 2., 3.]))
357
+ assert not _contains_nan(np.array([1., 2.j, 3.]))
358
+ assert _contains_nan(np.array([1., 2.j, np.nan]))
359
+ assert _contains_nan(np.array([1., 2., np.nan]))
360
+ assert _contains_nan(np.array([np.nan, 2., np.nan]))
361
+ assert not _contains_nan(np.array([[1., 2.], [3., 4.]]))
362
+ assert _contains_nan(np.array([[1., 2.], [3., np.nan]]))
335
363
 
336
364
  @skip_xp_invalid_arg
337
365
  def test_contains_nan_with_strings(self):
338
366
  data1 = np.array([1, 2, "3", np.nan]) # converted to string "nan"
339
- assert not _contains_nan(data1)[0]
367
+ assert not _contains_nan(data1)
340
368
 
341
369
  data2 = np.array([1, 2, "3", np.nan], dtype='object')
342
- assert _contains_nan(data2)[0]
370
+ assert _contains_nan(data2)
343
371
 
344
372
  data3 = np.array([["1", 2], [3, np.nan]]) # converted to string "nan"
345
- assert not _contains_nan(data3)[0]
373
+ assert not _contains_nan(data3)
346
374
 
347
375
  data4 = np.array([["1", 2], [3, np.nan]], dtype='object')
348
- assert _contains_nan(data4)[0]
376
+ assert _contains_nan(data4)
349
377
 
350
- @skip_xp_backends('jax.numpy',
351
- reason="JAX arrays do not support item assignment")
352
- @pytest.mark.usefixtures("skip_xp_backends")
353
- @array_api_compatible
378
+ @pytest.mark.skip_xp_backends(eager_only=True,
379
+ reason="lazy backends tested separately")
354
380
  @pytest.mark.parametrize("nan_policy", ['propagate', 'omit', 'raise'])
355
381
  def test_array_api(self, xp, nan_policy):
356
382
  rng = np.random.default_rng(932347235892482)
357
383
  x0 = rng.random(size=(2, 3, 4))
358
384
  x = xp.asarray(x0)
359
- x_nan = xp_copy(x, xp=xp)
360
- x_nan[1, 2, 1] = np.nan
385
+ assert not _contains_nan(x, nan_policy)
361
386
 
362
- contains_nan, nan_policy_out = _contains_nan(x, nan_policy=nan_policy)
363
- assert not contains_nan
364
- assert nan_policy_out == nan_policy
387
+ x = xpx.at(x)[1, 2, 1].set(np.nan)
365
388
 
366
389
  if nan_policy == 'raise':
367
- message = 'The input contains...'
368
- with pytest.raises(ValueError, match=message):
369
- _contains_nan(x_nan, nan_policy=nan_policy)
390
+ with pytest.raises(ValueError, match="The input contains nan values"):
391
+ _contains_nan(x, nan_policy)
370
392
  elif nan_policy == 'omit' and not is_numpy(xp):
371
- message = "`nan_policy='omit' is incompatible..."
372
- with pytest.raises(ValueError, match=message):
373
- _contains_nan(x_nan, nan_policy=nan_policy)
393
+ with pytest.raises(ValueError, match="nan_policy='omit' is incompatible"):
394
+ _contains_nan(x, nan_policy)
395
+ assert _contains_nan(x, nan_policy, xp_omit_okay=True)
374
396
  elif nan_policy == 'propagate':
375
- contains_nan, nan_policy_out = _contains_nan(
376
- x_nan, nan_policy=nan_policy)
377
- assert contains_nan
378
- assert nan_policy_out == nan_policy
397
+ assert _contains_nan(x, nan_policy)
398
+
399
+ @pytest.mark.skip_xp_backends("numpy", reason="lazy backends only")
400
+ @pytest.mark.skip_xp_backends("cupy", reason="lazy backends only")
401
+ @pytest.mark.skip_xp_backends("array_api_strict", reason="lazy backends only")
402
+ @pytest.mark.skip_xp_backends("torch", reason="lazy backends only")
403
+ def test_array_api_lazy(self, xp):
404
+ rng = np.random.default_rng(932347235892482)
405
+ x0 = rng.random(size=(2, 3, 4))
406
+ x = xp.asarray(x0)
407
+
408
+ xp_assert_equal(_contains_nan(x), xp.asarray(False))
409
+ xp_assert_equal(_contains_nan(x, "propagate"), xp.asarray(False))
410
+ xp_assert_equal(_contains_nan(x, "omit", xp_omit_okay=True), xp.asarray(False))
411
+ # Lazy arrays don't support "omit" and "raise" policies
412
+ match = "not supported for lazy arrays"
413
+ with pytest.raises(TypeError, match=match):
414
+ _contains_nan(x, "omit")
415
+ with pytest.raises(TypeError, match=match):
416
+ _contains_nan(x, "raise")
417
+
418
+ x = xpx.at(x)[1, 2, 1].set(np.nan)
419
+
420
+ xp_assert_equal(_contains_nan(x), xp.asarray(True))
421
+ xp_assert_equal(_contains_nan(x, "propagate"), xp.asarray(True))
422
+ xp_assert_equal(_contains_nan(x, "omit", xp_omit_okay=True), xp.asarray(True))
423
+ with pytest.raises(TypeError, match=match):
424
+ _contains_nan(x, "omit")
425
+ with pytest.raises(TypeError, match=match):
426
+ _contains_nan(x, "raise")
379
427
 
380
428
 
381
429
  def test__rng_html_rewrite():
@@ -591,67 +639,3 @@ class TestTransitionToRNG:
591
639
  res3 = method(self, **{arg_name: None})
592
640
  assert_equal(res2, res1)
593
641
  assert_equal(res3, res1)
594
-
595
-
596
- class TestLazywhere:
597
- n_arrays = strategies.integers(min_value=1, max_value=3)
598
- rng_seed = strategies.integers(min_value=1000000000, max_value=9999999999)
599
- dtype = strategies.sampled_from((np.float32, np.float64))
600
- p = strategies.floats(min_value=0, max_value=1)
601
- data = strategies.data()
602
-
603
- @pytest.mark.fail_slow(10)
604
- @pytest.mark.filterwarnings('ignore::RuntimeWarning') # overflows, etc.
605
- @skip_xp_backends('jax.numpy',
606
- reason="JAX arrays do not support item assignment")
607
- @pytest.mark.usefixtures("skip_xp_backends")
608
- @array_api_compatible
609
- @given(n_arrays=n_arrays, rng_seed=rng_seed, dtype=dtype, p=p, data=data)
610
- @pytest.mark.thread_unsafe
611
- def test_basic(self, n_arrays, rng_seed, dtype, p, data, xp):
612
- mbs = npst.mutually_broadcastable_shapes(num_shapes=n_arrays+1,
613
- min_side=0)
614
- input_shapes, result_shape = data.draw(mbs)
615
- cond_shape, *shapes = input_shapes
616
- elements = {'allow_subnormal': False} # cupy/cupy#8382
617
- fillvalue = xp.asarray(data.draw(npst.arrays(dtype=dtype, shape=tuple(),
618
- elements=elements)))
619
- float_fillvalue = float(fillvalue)
620
- arrays = [xp.asarray(data.draw(npst.arrays(dtype=dtype, shape=shape)))
621
- for shape in shapes]
622
-
623
- def f(*args):
624
- return sum(arg for arg in args)
625
-
626
- def f2(*args):
627
- return sum(arg for arg in args) / 2
628
-
629
- rng = np.random.default_rng(rng_seed)
630
- cond = xp.asarray(rng.random(size=cond_shape) > p)
631
-
632
- res1 = _lazywhere(cond, arrays, f, fillvalue)
633
- res2 = _lazywhere(cond, arrays, f, f2=f2)
634
- if not is_array_api_strict(xp):
635
- res3 = _lazywhere(cond, arrays, f, float_fillvalue)
636
-
637
- # Ensure arrays are at least 1d to follow sane type promotion rules.
638
- # This can be removed when minimum supported NumPy is 2.0
639
- if xp == np:
640
- cond, fillvalue, *arrays = np.atleast_1d(cond, fillvalue, *arrays)
641
-
642
- ref1 = xp.where(cond, f(*arrays), fillvalue)
643
- ref2 = xp.where(cond, f(*arrays), f2(*arrays))
644
- if not is_array_api_strict(xp):
645
- # Array API standard doesn't currently define behavior when fillvalue is a
646
- # Python scalar. When it does, test can be run with array_api_strict, too.
647
- ref3 = xp.where(cond, f(*arrays), float_fillvalue)
648
-
649
- if xp == np: # because we ensured arrays are at least 1d
650
- ref1 = ref1.reshape(result_shape)
651
- ref2 = ref2.reshape(result_shape)
652
- ref3 = ref3.reshape(result_shape)
653
-
654
- xp_assert_close(res1, ref1, rtol=2e-16)
655
- xp_assert_equal(res2, ref2)
656
- if not is_array_api_strict(xp):
657
- xp_assert_equal(res3, ref3)
@@ -1,14 +1,19 @@
1
+ import re
2
+
1
3
  import numpy as np
2
4
  import pytest
3
5
 
4
- from scipy.conftest import array_api_compatible
5
6
  from scipy._lib._array_api import (
6
7
  _GLOBAL_CONFIG, array_namespace, _asarray, xp_copy, xp_assert_equal, is_numpy,
7
- np_compat, xp_default_dtype
8
+ np_compat, xp_default_dtype, xp_result_type, is_torch
8
9
  )
10
+ from scipy._lib import array_api_extra as xpx
9
11
  from scipy._lib._array_api_no_0d import xp_assert_equal as xp_assert_equal_no_0d
12
+ from scipy._lib.array_api_extra.testing import lazy_xp_function
13
+
10
14
 
11
- skip_xp_backends = pytest.mark.skip_xp_backends
15
+ lazy_xp_function(_asarray)
16
+ lazy_xp_function(xp_copy)
12
17
 
13
18
 
14
19
  @pytest.mark.skipif(not _GLOBAL_CONFIG["SCIPY_ARRAY_API"],
@@ -25,7 +30,6 @@ class TestArrayAPI:
25
30
  assert 'array_api_compat.numpy' in xp.__name__
26
31
  _GLOBAL_CONFIG["SCIPY_ARRAY_API"] = True
27
32
 
28
- @array_api_compatible
29
33
  def test_asarray(self, xp):
30
34
  x, y = _asarray([0, 1, 2], xp=xp), _asarray(np.arange(3), xp=xp)
31
35
  ref = xp.asarray([0, 1, 2])
@@ -48,32 +52,67 @@ class TestArrayAPI:
48
52
  with pytest.raises(TypeError, match=msg):
49
53
  array_namespace('abc')
50
54
 
51
- def test_array_likes(self):
52
- # should be no exceptions
53
- array_namespace([0, 1, 2])
54
- array_namespace(1, 2, 3)
55
- array_namespace(1)
55
+ @pytest.mark.skip_xp_backends(np_only=True, reason="Array-likes")
56
+ def test_array_likes(self, xp):
57
+ """Test that if all parameters of array_namespace are Array-likes,
58
+ the output is array_api_compat.numpy
59
+ """
60
+ assert array_namespace([0, 1, 2]) is xp
61
+ assert array_namespace((0, 1, 2)) is xp
62
+ assert array_namespace(1, 2, 3) is xp
63
+ assert array_namespace(1) is xp
64
+ assert array_namespace(np.int64(1)) is xp
65
+ assert array_namespace([0, 1, 2], 3) is xp
66
+ assert array_namespace() is xp
67
+ assert array_namespace(None) is xp
68
+ assert array_namespace(1, None) is xp
69
+ assert array_namespace(None, 1) is xp
70
+
71
+ # This only works when xp is numpy!
72
+ assert array_namespace(np.asarray([1, 2]), [3, 4]) is xp
73
+ assert array_namespace(np.int64(1), [3, 4]) is xp
74
+
75
+ def test_array_and_array_likes_mix(self, xp):
76
+ """Test that if there is at least one Array API object among
77
+ the parameters of array_namespace, and all other parameters
78
+ are scalars, the output is its namespace.
79
+
80
+ If there are non-scalar Array-Likes, raise as in array-api-compat.
81
+ """
82
+ x = xp.asarray(1)
83
+ assert array_namespace(x) is xp
84
+ assert array_namespace(x, 1) is xp
85
+ assert array_namespace(1, x) is xp
86
+ assert array_namespace(None, x) is xp
87
+
88
+ if not is_numpy(xp):
89
+ with pytest.raises(TypeError, match="Multiple namespaces"):
90
+ array_namespace(x, [1, 2])
91
+ with pytest.raises(TypeError, match="Multiple namespaces"):
92
+ array_namespace(x, np.int64(1))
93
+
94
+ def test_array_api_extra_hook(self):
95
+ """Test that the `array_namespace` function used by
96
+ array-api-extra has been overridden by scipy
97
+ """
98
+ msg = "only boolean and numerical dtypes are supported"
99
+ with pytest.raises(TypeError, match=msg):
100
+ xpx.atleast_nd("abc", ndim=0)
56
101
 
57
- @skip_xp_backends('jax.numpy',
58
- reason="JAX arrays do not support item assignment")
59
- @pytest.mark.usefixtures("skip_xp_backends")
60
- @array_api_compatible
61
102
  def test_copy(self, xp):
62
103
  for _xp in [xp, None]:
63
104
  x = xp.asarray([1, 2, 3])
64
105
  y = xp_copy(x, xp=_xp)
65
106
  # with numpy we'd want to use np.shared_memory, but that's not specified
66
107
  # in the array-api
67
- x[0] = 10
68
- x[1] = 11
69
- x[2] = 12
70
-
71
- assert x[0] != y[0]
72
- assert x[1] != y[1]
73
- assert x[2] != y[2]
74
108
  assert id(x) != id(y)
75
-
76
- @array_api_compatible
109
+ try:
110
+ y[0] = 10
111
+ except (TypeError, ValueError):
112
+ pass
113
+ else:
114
+ assert x[0] != y[0]
115
+
77
116
  @pytest.mark.parametrize('dtype', ['int32', 'int64', 'float32', 'float64'])
78
117
  @pytest.mark.parametrize('shape', [(), (3,)])
79
118
  def test_strict_checks(self, xp, dtype, shape):
@@ -85,11 +124,19 @@ class TestArrayAPI:
85
124
 
86
125
  kwarg_names = ["check_namespace", "check_dtype", "check_shape", "check_0d"]
87
126
  options = dict(zip(kwarg_names, [True, False, False, False]))
88
- if xp == np:
127
+ if is_numpy(xp):
89
128
  xp_assert_equal(x, y, **options)
90
129
  else:
91
- with pytest.raises(AssertionError, match="Namespaces do not match."):
130
+ with pytest.raises(
131
+ AssertionError,
132
+ match="Namespace of desired array does not match",
133
+ ):
92
134
  xp_assert_equal(x, y, **options)
135
+ with pytest.raises(
136
+ AssertionError,
137
+ match="Namespace of actual and desired arrays do not match",
138
+ ):
139
+ xp_assert_equal(y, x, **options)
93
140
 
94
141
  options = dict(zip(kwarg_names, [False, True, False, False]))
95
142
  if y.dtype.name in str(x.dtype):
@@ -112,12 +159,8 @@ class TestArrayAPI:
112
159
  with pytest.raises(AssertionError, match="Array-ness does not match."):
113
160
  xp_assert_equal(x, y, **options)
114
161
 
115
-
116
- @array_api_compatible
162
+ @pytest.mark.skip_xp_backends(np_only=True, reason="Scalars only exist in NumPy")
117
163
  def test_check_scalar(self, xp):
118
- if not is_numpy(xp):
119
- pytest.skip("Scalars only exist in NumPy")
120
-
121
164
  # identity always passes
122
165
  xp_assert_equal(xp.float64(0), xp.float64(0))
123
166
  xp_assert_equal(xp.asarray(0.), xp.asarray(0.))
@@ -147,12 +190,8 @@ class TestArrayAPI:
147
190
  # as an alternative to `check_0d=False`, explicitly expect scalar
148
191
  xp_assert_equal(xp.float64(0), xp.asarray(0.)[()])
149
192
 
150
-
151
- @array_api_compatible
193
+ @pytest.mark.skip_xp_backends(np_only=True, reason="Scalars only exist in NumPy")
152
194
  def test_check_scalar_no_0d(self, xp):
153
- if not is_numpy(xp):
154
- pytest.skip("Scalars only exist in NumPy")
155
-
156
195
  # identity passes, if first argument is not 0d (or check_0d=True)
157
196
  xp_assert_equal_no_0d(xp.float64(0), xp.float64(0))
158
197
  xp_assert_equal_no_0d(xp.float64(0), xp.float64(0), check_0d=True)
@@ -186,6 +225,98 @@ class TestArrayAPI:
186
225
  xp_assert_equal_no_0d(0., xp.asarray(0.))
187
226
  xp_assert_equal_no_0d(42, xp.asarray(42))
188
227
 
189
- @array_api_compatible
190
228
  def test_default_dtype(self, xp):
191
229
  assert xp_default_dtype(xp) == xp.asarray(1.).dtype
230
+
231
+
232
+ scalars = [1, 1., 1. + 1j]
233
+ lists = [[1], [1.], [1. + 1j]]
234
+ types = ('int8 int16 int32 int64 '
235
+ 'uint8 uint16 uint32 uint64 '
236
+ 'float32 float64 complex64 complex128').split()
237
+ arrays = [np.asarray([1], dtype=getattr(np, t)) for t in types]
238
+
239
+
240
+ def convert_type(x, xp):
241
+ # Convert NumPy array to xp-array
242
+ # Convert string to indicated dtype from xp
243
+ # Return Python scalars unchanged
244
+ if isinstance(x, np.ndarray):
245
+ return xp.asarray(x)
246
+ elif isinstance(x, str):
247
+ return getattr(xp, x)
248
+ return x
249
+
250
+
251
+ def is_inexact(x, xp):
252
+ # Determine whether `x` is of inexact (real of complex floating) dtype
253
+ x = xp.asarray(x) if np.isscalar(x) or isinstance(x, list) else x
254
+ dtype = getattr(x, 'dtype', x)
255
+ return xp.isdtype(dtype, ('real floating', 'complex floating'))
256
+
257
+
258
+ @pytest.mark.parametrize('x', scalars + lists + types + arrays)
259
+ @pytest.mark.parametrize('y', scalars + lists + types + arrays)
260
+ def test_xp_result_type_no_force(x, y, xp):
261
+ # When force_floating==False (default), behavior of `xp_result_type`
262
+ # should match that of `xp.result_type` on the same arguments after
263
+ # converting lists to arrays of type `xp`.
264
+ x = convert_type(x, xp)
265
+ y = convert_type(y, xp)
266
+ x_ref = xp.asarray(x) if isinstance(x, list) else x
267
+ y_ref = xp.asarray(y) if isinstance(y, list) else y
268
+
269
+ try:
270
+ dtype_ref = xp.result_type(x_ref, y_ref)
271
+ expected_error = None
272
+ except Exception as e:
273
+ expected_error = (type(e), str(e))
274
+
275
+ if expected_error is not None:
276
+ with pytest.raises(expected_error[0], match=re.escape(expected_error[1])):
277
+ xp_result_type(x, y, xp=xp)
278
+ return
279
+
280
+ dtype_res = xp_result_type(x, y, xp=xp)
281
+ assert dtype_res == dtype_ref
282
+
283
+
284
+ @pytest.mark.parametrize('x', scalars + lists + types + arrays)
285
+ @pytest.mark.parametrize('y', scalars + lists + types + arrays)
286
+ def test_xp_result_type_force_floating(x, y, xp):
287
+ # When `force_floating==True`, behavior of `xp_result_type`
288
+ # should match that of `xp.result_type` with `1.0` appended to the set of
289
+ # arguments (after converting lists to arrays of type `xp`).
290
+ # If this raises a `TypeError`, which is the case when the result
291
+ # type is not defined by the standard, the result type should be
292
+ # the result type of any inexact (real or complex floating) arguments
293
+ # and the default floating point type.
294
+ if (is_torch(xp) and not(isinstance(x, str) or isinstance(y, str))
295
+ and np.isscalar(x) and np.isscalar(y)):
296
+ pytest.skip("See 3/27/2024 comment at data-apis/array-api-compat#277")
297
+
298
+ x = convert_type(x, xp)
299
+ y = convert_type(y, xp)
300
+ x_ref = xp.asarray(x) if isinstance(x, list) else x
301
+ y_ref = xp.asarray(y) if isinstance(y, list) else y
302
+
303
+ expected_error = None
304
+ try:
305
+ dtype_ref = xp.result_type(x_ref, y_ref, 1.0)
306
+ except TypeError:
307
+ args = []
308
+ if is_inexact(x_ref, xp):
309
+ args.append(x_ref)
310
+ if is_inexact(y_ref, xp):
311
+ args.append(y_ref)
312
+ dtype_ref = xp.result_type(*args, xp.asarray(1.0))
313
+ except Exception as e:
314
+ expected_error = (type(e), str(e))
315
+
316
+ if expected_error is not None:
317
+ with pytest.raises(expected_error[0], match=expected_error[1]):
318
+ xp_result_type(x, y, xp=xp)
319
+ return
320
+
321
+ dtype_res = xp_result_type(x, y, force_floating=True, xp=xp)
322
+ assert dtype_res == dtype_ref
@@ -127,6 +127,13 @@ class TestMakeTupleBunch:
127
127
  assert_equal(Foo.__module__, m)
128
128
  assert_equal(foo.__module__, m)
129
129
 
130
+ def test_passes_polars_checks(self):
131
+ # gh-22450
132
+ Square = _make_tuple_bunch('Square', ['width', 'height'])
133
+ assert hasattr(Square, '_replace')
134
+ assert hasattr(Square, '_field_defaults')
135
+
136
+
130
137
  # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
131
138
  # Argument validation
132
139
  # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -9,12 +9,6 @@ from scipy._lib import _ccallback_c as _test_ccallback_cython
9
9
  from scipy._lib import _test_ccallback
10
10
  from scipy._lib._ccallback import LowLevelCallable
11
11
 
12
- try:
13
- import cffi
14
- HAVE_CFFI = True
15
- except ImportError:
16
- HAVE_CFFI = False
17
-
18
12
 
19
13
  ERROR_VALUE = 2.0
20
14
 
@@ -29,8 +23,7 @@ def callback_python(a, user_data=None):
29
23
  return a + user_data
30
24
 
31
25
  def _get_cffi_func(base, signature):
32
- if not HAVE_CFFI:
33
- pytest.skip("cffi not installed")
26
+ cffi = pytest.importorskip("cffi")
34
27
 
35
28
  # Get function address
36
29
  voidp = ctypes.cast(base, ctypes.c_void_p)
@@ -48,8 +41,7 @@ def _get_ctypes_data():
48
41
 
49
42
 
50
43
  def _get_cffi_data():
51
- if not HAVE_CFFI:
52
- pytest.skip("cffi not installed")
44
+ cffi = pytest.importorskip("cffi")
53
45
  ffi = cffi.FFI()
54
46
  return ffi.new('double *', 2.0)
55
47
 
@@ -357,6 +357,7 @@ def test_api_importable():
357
357
  ('scipy.integrate.odepack', None),
358
358
  ('scipy.integrate.quadpack', None),
359
359
  ('scipy.integrate.vode', None),
360
+ ('scipy.interpolate.dfitpack', None),
360
361
  ('scipy.interpolate.fitpack', None),
361
362
  ('scipy.interpolate.fitpack2', None),
362
363
  ('scipy.interpolate.interpolate', None),
@@ -412,9 +413,21 @@ def test_api_importable():
412
413
  ('scipy.signal.ltisys', None),
413
414
  ('scipy.signal.signaltools', None),
414
415
  ('scipy.signal.spectral', None),
416
+ ('scipy.signal.spline', None),
415
417
  ('scipy.signal.waveforms', None),
416
418
  ('scipy.signal.wavelets', None),
417
419
  ('scipy.signal.windows.windows', 'windows'),
420
+ ('scipy.sparse.base', None),
421
+ ('scipy.sparse.bsr', None),
422
+ ('scipy.sparse.compressed', None),
423
+ ('scipy.sparse.construct', None),
424
+ ('scipy.sparse.coo', None),
425
+ ('scipy.sparse.csc', None),
426
+ ('scipy.sparse.csr', None),
427
+ ('scipy.sparse.data', None),
428
+ ('scipy.sparse.dia', None),
429
+ ('scipy.sparse.dok', None),
430
+ ('scipy.sparse.extract', None),
418
431
  ('scipy.sparse.lil', None),
419
432
  ('scipy.sparse.linalg.dsolve', 'linalg'),
420
433
  ('scipy.sparse.linalg.eigen', 'linalg'),
Binary file