scipy 1.15.2__cp313-cp313t-macosx_14_0_arm64.whl → 1.16.0rc1__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 (637) 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 +497 -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_ccallback.cpython-313t-darwin.so +0 -0
  12. scipy/_lib/_test_deprecation_call.cpython-313t-darwin.so +0 -0
  13. scipy/_lib/_test_deprecation_def.cpython-313t-darwin.so +0 -0
  14. scipy/_lib/_testutils.py +6 -2
  15. scipy/_lib/_util.py +222 -125
  16. scipy/_lib/array_api_compat/__init__.py +4 -4
  17. scipy/_lib/array_api_compat/_internal.py +19 -6
  18. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  19. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  20. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  21. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  22. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  23. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  24. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  25. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  26. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  27. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  28. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  29. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  30. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  31. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  32. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  33. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  34. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  35. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  36. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  37. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  38. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  39. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  40. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  41. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  42. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  43. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  44. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  45. scipy/_lib/array_api_extra/__init__.py +26 -3
  46. scipy/_lib/array_api_extra/_delegation.py +171 -0
  47. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  48. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  49. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  50. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  51. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  52. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  53. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  54. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  58. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  59. scipy/_lib/array_api_extra/testing.py +359 -0
  60. scipy/_lib/decorator.py +2 -2
  61. scipy/_lib/doccer.py +1 -7
  62. scipy/_lib/messagestream.cpython-313t-darwin.so +0 -0
  63. scipy/_lib/pyprima/__init__.py +212 -0
  64. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  65. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  66. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  67. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  68. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  69. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  70. scipy/_lib/pyprima/cobyla/update.py +289 -0
  71. scipy/_lib/pyprima/common/__init__.py +0 -0
  72. scipy/_lib/pyprima/common/_bounds.py +34 -0
  73. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  74. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  75. scipy/_lib/pyprima/common/_project.py +173 -0
  76. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  77. scipy/_lib/pyprima/common/consts.py +47 -0
  78. scipy/_lib/pyprima/common/evaluate.py +99 -0
  79. scipy/_lib/pyprima/common/history.py +38 -0
  80. scipy/_lib/pyprima/common/infos.py +30 -0
  81. scipy/_lib/pyprima/common/linalg.py +435 -0
  82. scipy/_lib/pyprima/common/message.py +290 -0
  83. scipy/_lib/pyprima/common/powalg.py +131 -0
  84. scipy/_lib/pyprima/common/preproc.py +277 -0
  85. scipy/_lib/pyprima/common/present.py +5 -0
  86. scipy/_lib/pyprima/common/ratio.py +54 -0
  87. scipy/_lib/pyprima/common/redrho.py +47 -0
  88. scipy/_lib/pyprima/common/selectx.py +296 -0
  89. scipy/_lib/tests/test__util.py +105 -121
  90. scipy/_lib/tests/test_array_api.py +169 -34
  91. scipy/_lib/tests/test_bunch.py +7 -0
  92. scipy/_lib/tests/test_ccallback.py +2 -10
  93. scipy/_lib/tests/test_public_api.py +13 -0
  94. scipy/cluster/_hierarchy.cpython-313t-darwin.so +0 -0
  95. scipy/cluster/_optimal_leaf_ordering.cpython-313t-darwin.so +0 -0
  96. scipy/cluster/_vq.cpython-313t-darwin.so +0 -0
  97. scipy/cluster/hierarchy.py +393 -223
  98. scipy/cluster/tests/test_hierarchy.py +273 -335
  99. scipy/cluster/tests/test_vq.py +45 -61
  100. scipy/cluster/vq.py +39 -35
  101. scipy/conftest.py +263 -157
  102. scipy/constants/_constants.py +4 -1
  103. scipy/constants/tests/test_codata.py +2 -2
  104. scipy/constants/tests/test_constants.py +11 -18
  105. scipy/datasets/_download_all.py +15 -1
  106. scipy/datasets/_fetchers.py +7 -1
  107. scipy/datasets/_utils.py +1 -1
  108. scipy/differentiate/_differentiate.py +25 -25
  109. scipy/differentiate/tests/test_differentiate.py +24 -25
  110. scipy/fft/_basic.py +20 -0
  111. scipy/fft/_helper.py +3 -34
  112. scipy/fft/_pocketfft/helper.py +29 -1
  113. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  114. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  115. scipy/fft/_realtransforms.py +13 -0
  116. scipy/fft/tests/test_basic.py +27 -25
  117. scipy/fft/tests/test_fftlog.py +16 -7
  118. scipy/fft/tests/test_helper.py +18 -34
  119. scipy/fft/tests/test_real_transforms.py +8 -10
  120. scipy/fftpack/convolve.cpython-313t-darwin.so +0 -0
  121. scipy/fftpack/tests/test_basic.py +2 -4
  122. scipy/fftpack/tests/test_real_transforms.py +8 -9
  123. scipy/integrate/_bvp.py +9 -3
  124. scipy/integrate/_cubature.py +3 -2
  125. scipy/integrate/_dop.cpython-313t-darwin.so +0 -0
  126. scipy/integrate/_ivp/common.py +3 -3
  127. scipy/integrate/_ivp/ivp.py +9 -2
  128. scipy/integrate/_ivp/tests/test_ivp.py +19 -0
  129. scipy/integrate/_lsoda.cpython-313t-darwin.so +0 -0
  130. scipy/integrate/_ode.py +9 -2
  131. scipy/integrate/_odepack.cpython-313t-darwin.so +0 -0
  132. scipy/integrate/_quad_vec.py +21 -29
  133. scipy/integrate/_quadpack.cpython-313t-darwin.so +0 -0
  134. scipy/integrate/_quadpack_py.py +11 -7
  135. scipy/integrate/_quadrature.py +3 -3
  136. scipy/integrate/_rules/_base.py +2 -2
  137. scipy/integrate/_tanhsinh.py +57 -54
  138. scipy/integrate/_test_odeint_banded.cpython-313t-darwin.so +0 -0
  139. scipy/integrate/_vode.cpython-313t-darwin.so +0 -0
  140. scipy/integrate/tests/test__quad_vec.py +0 -6
  141. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  142. scipy/integrate/tests/test_cubature.py +21 -35
  143. scipy/integrate/tests/test_quadrature.py +6 -8
  144. scipy/integrate/tests/test_tanhsinh.py +61 -43
  145. scipy/interpolate/__init__.py +70 -58
  146. scipy/interpolate/_bary_rational.py +22 -22
  147. scipy/interpolate/_bsplines.py +119 -66
  148. scipy/interpolate/_cubic.py +65 -50
  149. scipy/interpolate/_dfitpack.cpython-313t-darwin.so +0 -0
  150. scipy/interpolate/_dierckx.cpython-313t-darwin.so +0 -0
  151. scipy/interpolate/_fitpack.cpython-313t-darwin.so +0 -0
  152. scipy/interpolate/_fitpack2.py +9 -6
  153. scipy/interpolate/_fitpack_impl.py +32 -26
  154. scipy/interpolate/_fitpack_repro.py +23 -19
  155. scipy/interpolate/_interpnd.cpython-313t-darwin.so +0 -0
  156. scipy/interpolate/_interpolate.py +30 -12
  157. scipy/interpolate/_ndbspline.py +13 -18
  158. scipy/interpolate/_ndgriddata.py +5 -8
  159. scipy/interpolate/_polyint.py +95 -31
  160. scipy/interpolate/_ppoly.cpython-313t-darwin.so +0 -0
  161. scipy/interpolate/_rbf.py +2 -2
  162. scipy/interpolate/_rbfinterp.py +1 -1
  163. scipy/interpolate/_rbfinterp_pythran.cpython-313t-darwin.so +0 -0
  164. scipy/interpolate/_rgi.py +31 -26
  165. scipy/interpolate/_rgi_cython.cpython-313t-darwin.so +0 -0
  166. scipy/interpolate/dfitpack.py +0 -20
  167. scipy/interpolate/interpnd.py +1 -2
  168. scipy/interpolate/tests/test_bary_rational.py +2 -2
  169. scipy/interpolate/tests/test_bsplines.py +97 -1
  170. scipy/interpolate/tests/test_fitpack2.py +39 -1
  171. scipy/interpolate/tests/test_interpnd.py +32 -20
  172. scipy/interpolate/tests/test_interpolate.py +48 -4
  173. scipy/interpolate/tests/test_rgi.py +2 -1
  174. scipy/io/_fast_matrix_market/__init__.py +2 -0
  175. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  176. scipy/io/_harwell_boeing/hb.py +7 -11
  177. scipy/io/_idl.py +5 -7
  178. scipy/io/_netcdf.py +15 -5
  179. scipy/io/_test_fortran.cpython-313t-darwin.so +0 -0
  180. scipy/io/arff/tests/test_arffread.py +3 -3
  181. scipy/io/matlab/__init__.py +5 -3
  182. scipy/io/matlab/_mio.py +4 -1
  183. scipy/io/matlab/_mio5.py +19 -13
  184. scipy/io/matlab/_mio5_utils.cpython-313t-darwin.so +0 -0
  185. scipy/io/matlab/_mio_utils.cpython-313t-darwin.so +0 -0
  186. scipy/io/matlab/_miobase.py +4 -1
  187. scipy/io/matlab/_streams.cpython-313t-darwin.so +0 -0
  188. scipy/io/matlab/tests/test_mio.py +46 -18
  189. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  190. scipy/io/tests/test_mmio.py +7 -1
  191. scipy/io/tests/test_wavfile.py +41 -0
  192. scipy/io/wavfile.py +57 -10
  193. scipy/linalg/_basic.py +113 -86
  194. scipy/linalg/_cythonized_array_utils.cpython-313t-darwin.so +0 -0
  195. scipy/linalg/_decomp.py +22 -9
  196. scipy/linalg/_decomp_cholesky.py +28 -13
  197. scipy/linalg/_decomp_cossin.py +45 -30
  198. scipy/linalg/_decomp_interpolative.cpython-313t-darwin.so +0 -0
  199. scipy/linalg/_decomp_ldl.py +4 -1
  200. scipy/linalg/_decomp_lu.py +18 -6
  201. scipy/linalg/_decomp_lu_cython.cpython-313t-darwin.so +0 -0
  202. scipy/linalg/_decomp_polar.py +2 -0
  203. scipy/linalg/_decomp_qr.py +6 -2
  204. scipy/linalg/_decomp_qz.py +3 -0
  205. scipy/linalg/_decomp_schur.py +3 -1
  206. scipy/linalg/_decomp_svd.py +13 -2
  207. scipy/linalg/_decomp_update.cpython-313t-darwin.so +0 -0
  208. scipy/linalg/_expm_frechet.py +4 -0
  209. scipy/linalg/_fblas.cpython-313t-darwin.so +0 -0
  210. scipy/linalg/_flapack.cpython-313t-darwin.so +0 -0
  211. scipy/linalg/_linalg_pythran.cpython-313t-darwin.so +0 -0
  212. scipy/linalg/_matfuncs.py +187 -4
  213. scipy/linalg/_matfuncs_expm.cpython-313t-darwin.so +0 -0
  214. scipy/linalg/_matfuncs_schur_sqrtm.cpython-313t-darwin.so +0 -0
  215. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  216. scipy/linalg/_matfuncs_sqrtm_triu.cpython-313t-darwin.so +0 -0
  217. scipy/linalg/_procrustes.py +2 -0
  218. scipy/linalg/_sketches.py +17 -6
  219. scipy/linalg/_solve_toeplitz.cpython-313t-darwin.so +0 -0
  220. scipy/linalg/_solvers.py +7 -2
  221. scipy/linalg/_special_matrices.py +26 -36
  222. scipy/linalg/cython_blas.cpython-313t-darwin.so +0 -0
  223. scipy/linalg/cython_lapack.cpython-313t-darwin.so +0 -0
  224. scipy/linalg/lapack.py +22 -2
  225. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  226. scipy/linalg/tests/test_basic.py +31 -16
  227. scipy/linalg/tests/test_batch.py +588 -0
  228. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  229. scipy/linalg/tests/test_decomp.py +40 -3
  230. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  231. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  232. scipy/linalg/tests/test_interpolative.py +17 -0
  233. scipy/linalg/tests/test_lapack.py +115 -7
  234. scipy/linalg/tests/test_matfuncs.py +157 -102
  235. scipy/linalg/tests/test_procrustes.py +0 -7
  236. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  237. scipy/linalg/tests/test_special_matrices.py +1 -5
  238. scipy/ndimage/__init__.py +1 -0
  239. scipy/ndimage/_cytest.cpython-313t-darwin.so +0 -0
  240. scipy/ndimage/_delegators.py +8 -2
  241. scipy/ndimage/_filters.py +433 -5
  242. scipy/ndimage/_interpolation.py +36 -6
  243. scipy/ndimage/_measurements.py +4 -2
  244. scipy/ndimage/_morphology.py +5 -0
  245. scipy/ndimage/_nd_image.cpython-313t-darwin.so +0 -0
  246. scipy/ndimage/_ndimage_api.py +2 -1
  247. scipy/ndimage/_ni_docstrings.py +5 -1
  248. scipy/ndimage/_ni_label.cpython-313t-darwin.so +0 -0
  249. scipy/ndimage/_ni_support.py +1 -5
  250. scipy/ndimage/_rank_filter_1d.cpython-313t-darwin.so +0 -0
  251. scipy/ndimage/_support_alternative_backends.py +18 -6
  252. scipy/ndimage/tests/test_filters.py +351 -259
  253. scipy/ndimage/tests/test_fourier.py +7 -9
  254. scipy/ndimage/tests/test_interpolation.py +68 -61
  255. scipy/ndimage/tests/test_measurements.py +18 -35
  256. scipy/ndimage/tests/test_morphology.py +143 -131
  257. scipy/ndimage/tests/test_splines.py +1 -3
  258. scipy/odr/__odrpack.cpython-313t-darwin.so +0 -0
  259. scipy/optimize/_basinhopping.py +13 -7
  260. scipy/optimize/_bglu_dense.cpython-313t-darwin.so +0 -0
  261. scipy/optimize/_bracket.py +46 -26
  262. scipy/optimize/_chandrupatla.py +9 -10
  263. scipy/optimize/_cobyla_py.py +104 -123
  264. scipy/optimize/_constraints.py +14 -10
  265. scipy/optimize/_differentiable_functions.py +371 -230
  266. scipy/optimize/_differentialevolution.py +4 -3
  267. scipy/optimize/_direct.cpython-313t-darwin.so +0 -0
  268. scipy/optimize/_dual_annealing.py +1 -1
  269. scipy/optimize/_elementwise.py +1 -4
  270. scipy/optimize/_group_columns.cpython-313t-darwin.so +0 -0
  271. scipy/optimize/_highspy/_highs_wrapper.py +6 -4
  272. scipy/optimize/_lbfgsb.cpython-313t-darwin.so +0 -0
  273. scipy/optimize/_lbfgsb_py.py +57 -16
  274. scipy/optimize/_linprog_doc.py +2 -2
  275. scipy/optimize/_linprog_highs.py +11 -11
  276. scipy/optimize/_linprog_ip.py +25 -10
  277. scipy/optimize/_linprog_util.py +18 -19
  278. scipy/optimize/_lsap.cpython-313t-darwin.so +0 -0
  279. scipy/optimize/_lsq/common.py +3 -3
  280. scipy/optimize/_lsq/dogbox.py +16 -2
  281. scipy/optimize/_lsq/givens_elimination.cpython-313t-darwin.so +0 -0
  282. scipy/optimize/_lsq/least_squares.py +198 -126
  283. scipy/optimize/_lsq/lsq_linear.py +6 -6
  284. scipy/optimize/_lsq/trf.py +35 -8
  285. scipy/optimize/_milp.py +3 -1
  286. scipy/optimize/_minimize.py +105 -36
  287. scipy/optimize/_minpack.cpython-313t-darwin.so +0 -0
  288. scipy/optimize/_minpack_py.py +21 -14
  289. scipy/optimize/_moduleTNC.cpython-313t-darwin.so +0 -0
  290. scipy/optimize/_nnls.py +20 -21
  291. scipy/optimize/_nonlin.py +34 -3
  292. scipy/optimize/_numdiff.py +288 -110
  293. scipy/optimize/_optimize.py +86 -48
  294. scipy/optimize/_pava_pybind.cpython-313t-darwin.so +0 -0
  295. scipy/optimize/_remove_redundancy.py +5 -5
  296. scipy/optimize/_root_scalar.py +1 -1
  297. scipy/optimize/_shgo.py +6 -0
  298. scipy/optimize/_shgo_lib/_complex.py +1 -1
  299. scipy/optimize/_slsqp_py.py +216 -124
  300. scipy/optimize/_slsqplib.cpython-313t-darwin.so +0 -0
  301. scipy/optimize/_spectral.py +1 -1
  302. scipy/optimize/_tnc.py +8 -1
  303. scipy/optimize/_trlib/_trlib.cpython-313t-darwin.so +0 -0
  304. scipy/optimize/_trustregion.py +20 -6
  305. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  306. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  307. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  308. scipy/optimize/_trustregion_constr/projections.py +12 -8
  309. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  310. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  311. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  312. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  313. scipy/optimize/_trustregion_exact.py +0 -1
  314. scipy/optimize/_zeros.cpython-313t-darwin.so +0 -0
  315. scipy/optimize/_zeros_py.py +97 -17
  316. scipy/optimize/cython_optimize/_zeros.cpython-313t-darwin.so +0 -0
  317. scipy/optimize/slsqp.py +0 -1
  318. scipy/optimize/tests/test__basinhopping.py +1 -1
  319. scipy/optimize/tests/test__differential_evolution.py +4 -4
  320. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  321. scipy/optimize/tests/test__numdiff.py +66 -22
  322. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  323. scipy/optimize/tests/test__shgo.py +9 -1
  324. scipy/optimize/tests/test_bracket.py +71 -46
  325. scipy/optimize/tests/test_chandrupatla.py +133 -135
  326. scipy/optimize/tests/test_cobyla.py +74 -45
  327. scipy/optimize/tests/test_constraints.py +1 -1
  328. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  329. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  330. scipy/optimize/tests/test_least_squares.py +125 -13
  331. scipy/optimize/tests/test_linear_assignment.py +3 -3
  332. scipy/optimize/tests/test_linprog.py +3 -3
  333. scipy/optimize/tests/test_lsq_linear.py +5 -5
  334. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  335. scipy/optimize/tests/test_minpack.py +4 -4
  336. scipy/optimize/tests/test_nnls.py +43 -3
  337. scipy/optimize/tests/test_nonlin.py +36 -0
  338. scipy/optimize/tests/test_optimize.py +95 -17
  339. scipy/optimize/tests/test_slsqp.py +36 -4
  340. scipy/optimize/tests/test_zeros.py +34 -1
  341. scipy/signal/__init__.py +12 -23
  342. scipy/signal/_delegators.py +568 -0
  343. scipy/signal/_filter_design.py +459 -241
  344. scipy/signal/_fir_filter_design.py +262 -90
  345. scipy/signal/_lti_conversion.py +3 -2
  346. scipy/signal/_ltisys.py +118 -91
  347. scipy/signal/_max_len_seq_inner.cpython-313t-darwin.so +0 -0
  348. scipy/signal/_peak_finding_utils.cpython-313t-darwin.so +0 -0
  349. scipy/signal/_polyutils.py +172 -0
  350. scipy/signal/_short_time_fft.py +553 -76
  351. scipy/signal/_signal_api.py +30 -0
  352. scipy/signal/_signaltools.py +719 -396
  353. scipy/signal/_sigtools.cpython-313t-darwin.so +0 -0
  354. scipy/signal/_sosfilt.cpython-313t-darwin.so +0 -0
  355. scipy/signal/_spectral_py.py +221 -50
  356. scipy/signal/_spline.cpython-313t-darwin.so +0 -0
  357. scipy/signal/_spline_filters.py +108 -68
  358. scipy/signal/_support_alternative_backends.py +73 -0
  359. scipy/signal/_upfirdn.py +4 -1
  360. scipy/signal/_upfirdn_apply.cpython-313t-darwin.so +0 -0
  361. scipy/signal/_waveforms.py +2 -11
  362. scipy/signal/_wavelets.py +1 -1
  363. scipy/signal/fir_filter_design.py +1 -0
  364. scipy/signal/spline.py +4 -11
  365. scipy/signal/tests/_scipy_spectral_test_shim.py +5 -182
  366. scipy/signal/tests/test_bsplines.py +114 -79
  367. scipy/signal/tests/test_cont2discrete.py +9 -2
  368. scipy/signal/tests/test_filter_design.py +721 -481
  369. scipy/signal/tests/test_fir_filter_design.py +332 -140
  370. scipy/signal/tests/test_savitzky_golay.py +4 -3
  371. scipy/signal/tests/test_short_time_fft.py +231 -5
  372. scipy/signal/tests/test_signaltools.py +2149 -1348
  373. scipy/signal/tests/test_spectral.py +19 -6
  374. scipy/signal/tests/test_splines.py +161 -96
  375. scipy/signal/tests/test_upfirdn.py +84 -50
  376. scipy/signal/tests/test_waveforms.py +20 -0
  377. scipy/signal/tests/test_windows.py +607 -466
  378. scipy/signal/windows/_windows.py +287 -148
  379. scipy/sparse/__init__.py +23 -4
  380. scipy/sparse/_base.py +269 -120
  381. scipy/sparse/_bsr.py +7 -4
  382. scipy/sparse/_compressed.py +59 -234
  383. scipy/sparse/_construct.py +90 -38
  384. scipy/sparse/_coo.py +115 -181
  385. scipy/sparse/_csc.py +4 -4
  386. scipy/sparse/_csparsetools.cpython-313t-darwin.so +0 -0
  387. scipy/sparse/_csr.py +2 -2
  388. scipy/sparse/_data.py +48 -48
  389. scipy/sparse/_dia.py +105 -21
  390. scipy/sparse/_dok.py +0 -23
  391. scipy/sparse/_index.py +4 -4
  392. scipy/sparse/_matrix.py +23 -0
  393. scipy/sparse/_sparsetools.cpython-313t-darwin.so +0 -0
  394. scipy/sparse/_sputils.py +37 -22
  395. scipy/sparse/base.py +0 -9
  396. scipy/sparse/bsr.py +0 -14
  397. scipy/sparse/compressed.py +0 -23
  398. scipy/sparse/construct.py +0 -6
  399. scipy/sparse/coo.py +0 -14
  400. scipy/sparse/csc.py +0 -3
  401. scipy/sparse/csgraph/_flow.cpython-313t-darwin.so +0 -0
  402. scipy/sparse/csgraph/_matching.cpython-313t-darwin.so +0 -0
  403. scipy/sparse/csgraph/_min_spanning_tree.cpython-313t-darwin.so +0 -0
  404. scipy/sparse/csgraph/_reordering.cpython-313t-darwin.so +0 -0
  405. scipy/sparse/csgraph/_shortest_path.cpython-313t-darwin.so +0 -0
  406. scipy/sparse/csgraph/_tools.cpython-313t-darwin.so +0 -0
  407. scipy/sparse/csgraph/_traversal.cpython-313t-darwin.so +0 -0
  408. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  409. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  410. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  411. scipy/sparse/csr.py +0 -5
  412. scipy/sparse/data.py +1 -6
  413. scipy/sparse/dia.py +0 -7
  414. scipy/sparse/dok.py +0 -10
  415. scipy/sparse/linalg/_dsolve/_superlu.cpython-313t-darwin.so +0 -0
  416. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  417. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  418. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313t-darwin.so +0 -0
  419. scipy/sparse/linalg/_eigen/arpack/arpack.py +28 -20
  420. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  421. scipy/sparse/linalg/_expm_multiply.py +8 -3
  422. scipy/sparse/linalg/_interface.py +29 -26
  423. scipy/sparse/linalg/_isolve/_gcrotmk.py +6 -5
  424. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  425. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  426. scipy/sparse/linalg/_isolve/minres.py +5 -5
  427. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  428. scipy/sparse/linalg/_isolve/utils.py +2 -8
  429. scipy/sparse/linalg/_matfuncs.py +1 -1
  430. scipy/sparse/linalg/_norm.py +1 -1
  431. scipy/sparse/linalg/_propack/_cpropack.cpython-313t-darwin.so +0 -0
  432. scipy/sparse/linalg/_propack/_dpropack.cpython-313t-darwin.so +0 -0
  433. scipy/sparse/linalg/_propack/_spropack.cpython-313t-darwin.so +0 -0
  434. scipy/sparse/linalg/_propack/_zpropack.cpython-313t-darwin.so +0 -0
  435. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  436. scipy/sparse/linalg/tests/test_expm_multiply.py +10 -0
  437. scipy/sparse/linalg/tests/test_interface.py +35 -0
  438. scipy/sparse/linalg/tests/test_pydata_sparse.py +18 -0
  439. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  440. scipy/sparse/tests/test_base.py +217 -40
  441. scipy/sparse/tests/test_common1d.py +17 -12
  442. scipy/sparse/tests/test_construct.py +1 -1
  443. scipy/sparse/tests/test_coo.py +272 -4
  444. scipy/sparse/tests/test_sparsetools.py +5 -0
  445. scipy/sparse/tests/test_sputils.py +36 -7
  446. scipy/spatial/_ckdtree.cpython-313t-darwin.so +0 -0
  447. scipy/spatial/_distance_pybind.cpython-313t-darwin.so +0 -0
  448. scipy/spatial/_distance_wrap.cpython-313t-darwin.so +0 -0
  449. scipy/spatial/_hausdorff.cpython-313t-darwin.so +0 -0
  450. scipy/spatial/_qhull.cpython-313t-darwin.so +0 -0
  451. scipy/spatial/_voronoi.cpython-313t-darwin.so +0 -0
  452. scipy/spatial/distance.py +49 -42
  453. scipy/spatial/tests/test_distance.py +3 -1
  454. scipy/spatial/tests/test_kdtree.py +1 -0
  455. scipy/spatial/tests/test_qhull.py +106 -2
  456. scipy/spatial/transform/__init__.py +5 -3
  457. scipy/spatial/transform/_rigid_transform.cpython-313t-darwin.so +0 -0
  458. scipy/spatial/transform/_rotation.cpython-313t-darwin.so +0 -0
  459. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  460. scipy/spatial/transform/tests/test_rotation.py +1342 -790
  461. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  462. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  463. scipy/special/__init__.py +1 -47
  464. scipy/special/_add_newdocs.py +34 -772
  465. scipy/special/_basic.py +22 -25
  466. scipy/special/_comb.cpython-313t-darwin.so +0 -0
  467. scipy/special/_ellip_harm_2.cpython-313t-darwin.so +0 -0
  468. scipy/special/_gufuncs.cpython-313t-darwin.so +0 -0
  469. scipy/special/_logsumexp.py +83 -69
  470. scipy/special/_orthogonal.pyi +1 -1
  471. scipy/special/_specfun.cpython-313t-darwin.so +0 -0
  472. scipy/special/_special_ufuncs.cpython-313t-darwin.so +0 -0
  473. scipy/special/_spherical_bessel.py +4 -4
  474. scipy/special/_support_alternative_backends.py +212 -119
  475. scipy/special/_test_internal.cpython-313t-darwin.so +0 -0
  476. scipy/special/_testutils.py +4 -4
  477. scipy/special/_ufuncs.cpython-313t-darwin.so +0 -0
  478. scipy/special/_ufuncs.pyi +1 -0
  479. scipy/special/_ufuncs.pyx +215 -1400
  480. scipy/special/_ufuncs_cxx.cpython-313t-darwin.so +0 -0
  481. scipy/special/_ufuncs_cxx.pxd +2 -15
  482. scipy/special/_ufuncs_cxx.pyx +5 -44
  483. scipy/special/_ufuncs_cxx_defs.h +2 -16
  484. scipy/special/_ufuncs_defs.h +0 -8
  485. scipy/special/cython_special.cpython-313t-darwin.so +0 -0
  486. scipy/special/cython_special.pxd +1 -1
  487. scipy/special/tests/_cython_examples/meson.build +10 -1
  488. scipy/special/tests/test_basic.py +153 -20
  489. scipy/special/tests/test_boost_ufuncs.py +3 -0
  490. scipy/special/tests/test_cdflib.py +35 -11
  491. scipy/special/tests/test_gammainc.py +16 -0
  492. scipy/special/tests/test_hyp2f1.py +23 -2
  493. scipy/special/tests/test_log1mexp.py +85 -0
  494. scipy/special/tests/test_logsumexp.py +220 -64
  495. scipy/special/tests/test_mpmath.py +1 -0
  496. scipy/special/tests/test_nan_inputs.py +1 -1
  497. scipy/special/tests/test_orthogonal.py +17 -18
  498. scipy/special/tests/test_sf_error.py +3 -2
  499. scipy/special/tests/test_sph_harm.py +6 -7
  500. scipy/special/tests/test_support_alternative_backends.py +211 -76
  501. scipy/stats/__init__.py +4 -1
  502. scipy/stats/_ansari_swilk_statistics.cpython-313t-darwin.so +0 -0
  503. scipy/stats/_axis_nan_policy.py +4 -3
  504. scipy/stats/_biasedurn.cpython-313t-darwin.so +0 -0
  505. scipy/stats/_continued_fraction.py +387 -0
  506. scipy/stats/_continuous_distns.py +296 -319
  507. scipy/stats/_covariance.py +6 -3
  508. scipy/stats/_discrete_distns.py +39 -32
  509. scipy/stats/_distn_infrastructure.py +39 -12
  510. scipy/stats/_distribution_infrastructure.py +900 -238
  511. scipy/stats/_entropy.py +7 -8
  512. scipy/{_lib → stats}/_finite_differences.py +1 -1
  513. scipy/stats/_hypotests.py +82 -49
  514. scipy/stats/_kde.py +53 -49
  515. scipy/stats/_ksstats.py +1 -1
  516. scipy/stats/_levy_stable/__init__.py +7 -15
  517. scipy/stats/_levy_stable/levyst.cpython-313t-darwin.so +0 -0
  518. scipy/stats/_morestats.py +112 -67
  519. scipy/stats/_mstats_basic.py +13 -17
  520. scipy/stats/_mstats_extras.py +8 -8
  521. scipy/stats/_multivariate.py +89 -113
  522. scipy/stats/_new_distributions.py +97 -20
  523. scipy/stats/_page_trend_test.py +12 -5
  524. scipy/stats/_probability_distribution.py +265 -43
  525. scipy/stats/_qmc.py +14 -9
  526. scipy/stats/_qmc_cy.cpython-313t-darwin.so +0 -0
  527. scipy/stats/_qmvnt.py +16 -95
  528. scipy/stats/_qmvnt_cy.cpython-313t-darwin.so +0 -0
  529. scipy/stats/_quantile.py +335 -0
  530. scipy/stats/_rcont/rcont.cpython-313t-darwin.so +0 -0
  531. scipy/stats/_resampling.py +4 -29
  532. scipy/stats/_sampling.py +1 -1
  533. scipy/stats/_sobol.cpython-313t-darwin.so +0 -0
  534. scipy/stats/_stats.cpython-313t-darwin.so +0 -0
  535. scipy/stats/_stats_mstats_common.py +19 -2
  536. scipy/stats/_stats_py.py +534 -460
  537. scipy/stats/_stats_pythran.cpython-313t-darwin.so +0 -0
  538. scipy/stats/_unuran/unuran_wrapper.cpython-313t-darwin.so +0 -0
  539. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  540. scipy/stats/_variation.py +5 -7
  541. scipy/stats/_wilcoxon.py +13 -7
  542. scipy/stats/tests/common_tests.py +6 -4
  543. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  544. scipy/stats/tests/test_continued_fraction.py +173 -0
  545. scipy/stats/tests/test_continuous.py +379 -60
  546. scipy/stats/tests/test_continuous_basic.py +18 -12
  547. scipy/stats/tests/test_discrete_basic.py +14 -8
  548. scipy/stats/tests/test_discrete_distns.py +16 -16
  549. scipy/stats/tests/test_distributions.py +117 -75
  550. scipy/stats/tests/test_entropy.py +40 -48
  551. scipy/stats/tests/test_fit.py +4 -3
  552. scipy/stats/tests/test_hypotests.py +153 -24
  553. scipy/stats/tests/test_kdeoth.py +109 -41
  554. scipy/stats/tests/test_marray.py +289 -0
  555. scipy/stats/tests/test_morestats.py +79 -47
  556. scipy/stats/tests/test_mstats_basic.py +3 -3
  557. scipy/stats/tests/test_multivariate.py +434 -83
  558. scipy/stats/tests/test_qmc.py +13 -10
  559. scipy/stats/tests/test_quantile.py +199 -0
  560. scipy/stats/tests/test_rank.py +119 -112
  561. scipy/stats/tests/test_resampling.py +47 -56
  562. scipy/stats/tests/test_sampling.py +9 -4
  563. scipy/stats/tests/test_stats.py +799 -939
  564. scipy/stats/tests/test_variation.py +8 -6
  565. scipy/version.py +2 -2
  566. {scipy-1.15.2.dist-info → scipy-1.16.0rc1.dist-info}/LICENSE.txt +1 -1
  567. {scipy-1.15.2.dist-info → scipy-1.16.0rc1.dist-info}/METADATA +9 -9
  568. {scipy-1.15.2.dist-info → scipy-1.16.0rc1.dist-info}/RECORD +569 -576
  569. scipy-1.16.0rc1.dist-info/WHEEL +6 -0
  570. scipy/_lib/array_api_extra/_funcs.py +0 -484
  571. scipy/_lib/array_api_extra/_typing.py +0 -8
  572. scipy/interpolate/_bspl.cpython-313t-darwin.so +0 -0
  573. scipy/optimize/_cobyla.cpython-313t-darwin.so +0 -0
  574. scipy/optimize/_cython_nnls.cpython-313t-darwin.so +0 -0
  575. scipy/optimize/_slsqp.cpython-313t-darwin.so +0 -0
  576. scipy/spatial/qhull_src/COPYING.txt +0 -38
  577. scipy/special/libsf_error_state.dylib +0 -0
  578. scipy/special/tests/test_log_softmax.py +0 -109
  579. scipy/special/tests/test_xsf_cuda.py +0 -114
  580. scipy/special/xsf/binom.h +0 -89
  581. scipy/special/xsf/cdflib.h +0 -100
  582. scipy/special/xsf/cephes/airy.h +0 -307
  583. scipy/special/xsf/cephes/besselpoly.h +0 -51
  584. scipy/special/xsf/cephes/beta.h +0 -257
  585. scipy/special/xsf/cephes/cbrt.h +0 -131
  586. scipy/special/xsf/cephes/chbevl.h +0 -85
  587. scipy/special/xsf/cephes/chdtr.h +0 -193
  588. scipy/special/xsf/cephes/const.h +0 -87
  589. scipy/special/xsf/cephes/ellie.h +0 -293
  590. scipy/special/xsf/cephes/ellik.h +0 -251
  591. scipy/special/xsf/cephes/ellpe.h +0 -107
  592. scipy/special/xsf/cephes/ellpk.h +0 -117
  593. scipy/special/xsf/cephes/expn.h +0 -260
  594. scipy/special/xsf/cephes/gamma.h +0 -398
  595. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  596. scipy/special/xsf/cephes/hyperg.h +0 -361
  597. scipy/special/xsf/cephes/i0.h +0 -149
  598. scipy/special/xsf/cephes/i1.h +0 -158
  599. scipy/special/xsf/cephes/igam.h +0 -421
  600. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  601. scipy/special/xsf/cephes/igami.h +0 -313
  602. scipy/special/xsf/cephes/j0.h +0 -225
  603. scipy/special/xsf/cephes/j1.h +0 -198
  604. scipy/special/xsf/cephes/jv.h +0 -715
  605. scipy/special/xsf/cephes/k0.h +0 -164
  606. scipy/special/xsf/cephes/k1.h +0 -163
  607. scipy/special/xsf/cephes/kn.h +0 -243
  608. scipy/special/xsf/cephes/lanczos.h +0 -112
  609. scipy/special/xsf/cephes/ndtr.h +0 -275
  610. scipy/special/xsf/cephes/poch.h +0 -85
  611. scipy/special/xsf/cephes/polevl.h +0 -167
  612. scipy/special/xsf/cephes/psi.h +0 -194
  613. scipy/special/xsf/cephes/rgamma.h +0 -111
  614. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  615. scipy/special/xsf/cephes/shichi.h +0 -248
  616. scipy/special/xsf/cephes/sici.h +0 -224
  617. scipy/special/xsf/cephes/sindg.h +0 -221
  618. scipy/special/xsf/cephes/tandg.h +0 -139
  619. scipy/special/xsf/cephes/trig.h +0 -58
  620. scipy/special/xsf/cephes/unity.h +0 -186
  621. scipy/special/xsf/cephes/zeta.h +0 -172
  622. scipy/special/xsf/config.h +0 -304
  623. scipy/special/xsf/digamma.h +0 -205
  624. scipy/special/xsf/error.h +0 -57
  625. scipy/special/xsf/evalpoly.h +0 -47
  626. scipy/special/xsf/expint.h +0 -266
  627. scipy/special/xsf/hyp2f1.h +0 -694
  628. scipy/special/xsf/iv_ratio.h +0 -173
  629. scipy/special/xsf/lambertw.h +0 -150
  630. scipy/special/xsf/loggamma.h +0 -163
  631. scipy/special/xsf/sici.h +0 -200
  632. scipy/special/xsf/tools.h +0 -427
  633. scipy/special/xsf/trig.h +0 -164
  634. scipy/special/xsf/wright_bessel.h +0 -843
  635. scipy/special/xsf/zlog1.h +0 -35
  636. scipy/stats/_mvn.cpython-313t-darwin.so +0 -0
  637. scipy-1.15.2.dist-info/WHEEL +0 -4
@@ -1,27 +1,25 @@
1
- import warnings
1
+ import math
2
2
  import sys
3
3
  from copy import deepcopy
4
4
  from threading import Lock
5
5
 
6
6
  import numpy as np
7
- from numpy.testing import (
8
- assert_array_equal, assert_equal, assert_, suppress_warnings
9
- )
7
+ from numpy.testing import assert_array_equal, suppress_warnings
10
8
  import pytest
11
9
  from pytest import raises as assert_raises
12
10
 
13
11
  from scipy.cluster.vq import (kmeans, kmeans2, py_vq, vq, whiten,
14
12
  ClusterError, _krandinit)
15
13
  from scipy.cluster import _vq
16
- from scipy.conftest import array_api_compatible
17
14
  from scipy.sparse._sputils import matrix
18
15
 
19
16
  from scipy._lib import array_api_extra as xpx
20
17
  from scipy._lib._array_api import (
21
- SCIPY_ARRAY_API, array_namespace, xp_copy, xp_assert_close, xp_assert_equal
18
+ SCIPY_ARRAY_API, eager_warns, is_lazy_array, make_xp_test_case,
19
+ xp_copy, xp_assert_close, xp_assert_equal
22
20
  )
23
21
 
24
- pytestmark = [array_api_compatible, pytest.mark.usefixtures("skip_xp_backends")]
22
+ xfail_xp_backends = pytest.mark.xfail_xp_backends
25
23
  skip_xp_backends = pytest.mark.skip_xp_backends
26
24
 
27
25
  TESTDATA_2D = np.array([
@@ -80,6 +78,7 @@ CODET2 = np.array([[11.0/3, 8.0/3],
80
78
  LABEL1 = np.array([0, 1, 2, 2, 2, 2, 1, 2, 1, 1, 1])
81
79
 
82
80
 
81
+ @make_xp_test_case(whiten)
83
82
  class TestWhiten:
84
83
 
85
84
  def test_whiten(self, xp):
@@ -96,13 +95,7 @@ class TestWhiten:
96
95
  [0.45067590, 0.45464607]])
97
96
  xp_assert_close(whiten(obs), desired, rtol=1e-5)
98
97
 
99
- @pytest.fixture
100
- def whiten_lock(self):
101
- return Lock()
102
-
103
- @skip_xp_backends('jax.numpy',
104
- reason='jax arrays do not support item assignment')
105
- def test_whiten_zero_std(self, xp, whiten_lock):
98
+ def test_whiten_zero_std(self, xp):
106
99
  desired = xp.asarray([[0., 1.0, 2.86666544],
107
100
  [0., 1.0, 1.32460034],
108
101
  [0., 1.0, 3.74382172]])
@@ -111,27 +104,32 @@ class TestWhiten:
111
104
  [0., 1., 0.34243798],
112
105
  [0., 1., 0.96785929]])
113
106
 
114
- with whiten_lock:
115
- with warnings.catch_warnings(record=True) as w:
116
- warnings.simplefilter('always')
117
-
118
- xp_assert_close(whiten(obs), desired, rtol=1e-5)
107
+ with eager_warns(obs, RuntimeWarning, match="standard deviation zero"):
108
+ actual = whiten(obs)
109
+ xp_assert_close(actual, desired, rtol=1e-5)
119
110
 
120
- assert_equal(len(w), 1)
121
- assert_(issubclass(w[-1].category, RuntimeWarning))
111
+ @pytest.mark.filterwarnings("ignore:invalid value encountered:RuntimeWarning:dask")
112
+ @pytest.mark.parametrize("bad_value", [math.nan, math.inf, -math.inf])
113
+ def test_whiten_not_finite(self, bad_value, xp):
114
+ obs = xp.asarray([[0.98744510, bad_value],
115
+ [0.62093317, 0.19406729],
116
+ [0.87545741, 0.00735733],
117
+ [0.85124403, 0.26499712],
118
+ [0.45067590, 0.45464607]])
122
119
 
123
- def test_whiten_not_finite(self, xp):
124
- for bad_value in xp.nan, xp.inf, -xp.inf:
125
- obs = xp.asarray([[0.98744510, bad_value],
126
- [0.62093317, 0.19406729],
127
- [0.87545741, 0.00735733],
128
- [0.85124403, 0.26499712],
129
- [0.45067590, 0.45464607]])
120
+ if is_lazy_array(obs):
121
+ desired = xp.asarray([[5.08738849, math.nan],
122
+ [3.19909255, math.nan],
123
+ [4.51041982, math.nan],
124
+ [4.38567074, math.nan],
125
+ [2.32191480, math.nan]])
126
+ xp_assert_close(whiten(obs), desired, rtol=1e-5)
127
+ else:
130
128
  assert_raises(ValueError, whiten, obs)
131
129
 
132
130
  @pytest.mark.skipif(SCIPY_ARRAY_API,
133
131
  reason='`np.matrix` unsupported in array API mode')
134
- def test_whiten_not_finite_matrix(self, xp):
132
+ def test_whiten_not_finite_matrix(self):
135
133
  for bad_value in np.nan, np.inf, -np.inf:
136
134
  obs = matrix([[0.98744510, bad_value],
137
135
  [0.62093317, 0.19406729],
@@ -141,9 +139,9 @@ class TestWhiten:
141
139
  assert_raises(ValueError, whiten, obs)
142
140
 
143
141
 
142
+ @make_xp_test_case(vq)
144
143
  class TestVq:
145
144
 
146
- @skip_xp_backends(cpu_only=True)
147
145
  def test_py_vq(self, xp):
148
146
  initc = np.concatenate([[X[0]], [X[1]], [X[2]]])
149
147
  # label1.dtype varies between int32 and int64 over platforms
@@ -153,28 +151,26 @@ class TestVq:
153
151
 
154
152
  @pytest.mark.skipif(SCIPY_ARRAY_API,
155
153
  reason='`np.matrix` unsupported in array API mode')
156
- def test_py_vq_matrix(self, xp):
154
+ def test_py_vq_matrix(self):
157
155
  initc = np.concatenate([[X[0]], [X[1]], [X[2]]])
158
156
  # label1.dtype varies between int32 and int64 over platforms
159
157
  label1 = py_vq(matrix(X), matrix(initc))[0]
160
158
  assert_array_equal(label1, LABEL1)
161
159
 
162
- @skip_xp_backends(np_only=True, reason='`_vq` only supports NumPy backend')
163
160
  def test_vq(self, xp):
164
161
  initc = np.concatenate([[X[0]], [X[1]], [X[2]]])
165
- label1, _ = _vq.vq(xp.asarray(X), xp.asarray(initc))
162
+ label1, _ = _vq.vq(X, initc)
166
163
  assert_array_equal(label1, LABEL1)
167
164
  _, _ = vq(xp.asarray(X), xp.asarray(initc))
168
165
 
169
166
  @pytest.mark.skipif(SCIPY_ARRAY_API,
170
167
  reason='`np.matrix` unsupported in array API mode')
171
- def test_vq_matrix(self, xp):
168
+ def test_vq_matrix(self):
172
169
  initc = np.concatenate([[X[0]], [X[1]], [X[2]]])
173
170
  label1, _ = _vq.vq(matrix(X), matrix(initc))
174
171
  assert_array_equal(label1, LABEL1)
175
172
  _, _ = vq(matrix(X), matrix(initc))
176
173
 
177
- @skip_xp_backends(cpu_only=True)
178
174
  def test_vq_1d(self, xp):
179
175
  # Test special rank 1 vq algo, python implementation.
180
176
  data = X[:, 0]
@@ -187,18 +183,15 @@ class TestVq:
187
183
  xp_assert_equal(ta, xp.asarray(a, dtype=xp.int64), check_dtype=False)
188
184
  xp_assert_equal(tb, xp.asarray(b))
189
185
 
190
- @skip_xp_backends(np_only=True, reason='`_vq` only supports NumPy backend')
191
- def test__vq_sametype(self, xp):
192
- a = xp.asarray([1.0, 2.0], dtype=xp.float64)
193
- b = a.astype(xp.float32)
186
+ def test__vq_sametype(self):
187
+ a = np.asarray([1.0, 2.0])
188
+ b = a.astype(np.float32)
194
189
  assert_raises(TypeError, _vq.vq, a, b)
195
190
 
196
- @skip_xp_backends(np_only=True, reason='`_vq` only supports NumPy backend')
197
- def test__vq_invalid_type(self, xp):
198
- a = xp.asarray([1, 2], dtype=int)
191
+ def test__vq_invalid_type(self):
192
+ a = np.asarray([1, 2], dtype=int)
199
193
  assert_raises(TypeError, _vq.vq, a, a)
200
194
 
201
- @skip_xp_backends(cpu_only=True)
202
195
  def test_vq_large_nfeat(self, xp):
203
196
  X = np.random.rand(20, 20)
204
197
  code_book = np.random.rand(3, 20)
@@ -222,7 +215,6 @@ class TestVq:
222
215
  # codes1.dtype varies between int32 and int64 over platforms
223
216
  xp_assert_equal(codes1, xp.asarray(codes0, dtype=xp.int64), check_dtype=False)
224
217
 
225
- @skip_xp_backends(cpu_only=True)
226
218
  def test_vq_large_features(self, xp):
227
219
  X = np.random.rand(10, 5) * 1000000
228
220
  code_book = np.random.rand(2, 5) * 1000000
@@ -238,8 +230,8 @@ class TestVq:
238
230
 
239
231
  # Whole class skipped on GPU for now;
240
232
  # once pdist/cdist are hooked up for CuPy, more tests will work
241
- @skip_xp_backends(cpu_only=True)
242
- class TestKMean:
233
+ @make_xp_test_case(kmeans, kmeans2)
234
+ class TestKMeans:
243
235
 
244
236
  def test_large_features(self, xp):
245
237
  # Generate a data set with large values, and run kmeans on it to
@@ -267,7 +259,7 @@ class TestKMean:
267
259
 
268
260
  @pytest.mark.skipif(SCIPY_ARRAY_API,
269
261
  reason='`np.matrix` unsupported in array API mode')
270
- def test_kmeans_simple_matrix(self, xp):
262
+ def test_kmeans_simple_matrix(self):
271
263
  rng = np.random.default_rng(54321)
272
264
  initc = np.concatenate([[X[0]], [X[1]], [X[2]]])
273
265
  code1 = kmeans(matrix(X), matrix(initc), iter=1, rng=rng)[0]
@@ -302,9 +294,9 @@ class TestKMean:
302
294
 
303
295
  @pytest.mark.skipif(SCIPY_ARRAY_API,
304
296
  reason='`np.matrix` unsupported in array API mode')
305
- def test_kmeans2_simple_matrix(self, xp):
297
+ def test_kmeans2_simple_matrix(self):
306
298
  rng = np.random.default_rng(12345678)
307
- initc = xp.asarray(np.concatenate([[X[0]], [X[1]], [X[2]]]))
299
+ initc = np.concatenate([[X[0]], [X[1]], [X[2]]])
308
300
  code1 = kmeans2(matrix(X), matrix(initc), iter=1, rng=rng)[0]
309
301
  code2 = kmeans2(matrix(X), matrix(initc), iter=2, rng=rng)[0]
310
302
 
@@ -334,8 +326,6 @@ class TestKMean:
334
326
  data = xp.reshape(data, (20, 20))[:10, :]
335
327
  kmeans2(data, 2)
336
328
 
337
- @skip_xp_backends('jax.numpy',
338
- reason='jax arrays do not support item assignment')
339
329
  def test_kmeans2_init(self, xp):
340
330
  rng = np.random.default_rng(12345678)
341
331
  data = xp.asarray(TESTDATA_2D)
@@ -357,6 +347,7 @@ class TestKMean:
357
347
  def krand_lock(self):
358
348
  return Lock()
359
349
 
350
+ @xfail_xp_backends('dask.array', reason="Wrong answer")
360
351
  @pytest.mark.skipif(sys.platform == 'win32',
361
352
  reason='Fails with MemoryError in Wine.')
362
353
  def test_krandinit(self, xp, krand_lock):
@@ -364,13 +355,12 @@ class TestKMean:
364
355
  datas = [xp.reshape(data, (200, 2)),
365
356
  xp.reshape(data, (20, 20))[:10, :]]
366
357
  k = int(1e6)
367
- xp_test = array_namespace(data)
368
358
  with krand_lock:
369
359
  for data in datas:
370
360
  rng = np.random.default_rng(1234)
371
- init = _krandinit(data, k, rng, xp_test)
372
- orig_cov = xpx.cov(data.T, xp=xp_test)
373
- init_cov = xpx.cov(init.T, xp=xp_test)
361
+ init = _krandinit(data, k, rng, xp)
362
+ orig_cov = xpx.cov(data.T, xp=xp)
363
+ init_cov = xpx.cov(init.T, xp=xp)
374
364
  xp_assert_close(orig_cov, init_cov, atol=1.1e-2)
375
365
 
376
366
  def test_kmeans2_empty(self, xp):
@@ -390,8 +380,6 @@ class TestKMean:
390
380
  xp_assert_close(res[0], xp.asarray([4.], dtype=xp.float64))
391
381
  xp_assert_close(res[1], xp.asarray(2.3999999999999999, dtype=xp.float64)[()])
392
382
 
393
- @skip_xp_backends('jax.numpy',
394
- reason='jax arrays do not support item assignment')
395
383
  def test_kmeans2_kpp_low_dim(self, xp):
396
384
  # Regression test for gh-11462
397
385
  rng = np.random.default_rng(2358792345678234568)
@@ -401,8 +389,6 @@ class TestKMean:
401
389
  xp_assert_close(res, prev_res)
402
390
 
403
391
  @pytest.mark.thread_unsafe
404
- @skip_xp_backends('jax.numpy',
405
- reason='jax arrays do not support item assignment')
406
392
  def test_kmeans2_kpp_high_dim(self, xp):
407
393
  # Regression test for gh-11462
408
394
  rng = np.random.default_rng(23587923456834568)
@@ -427,8 +413,6 @@ class TestKMean:
427
413
  xp_assert_close(res[0], xp.asarray([-0.4, 8.], dtype=xp.float64))
428
414
  xp_assert_close(res[1], xp.asarray(1.0666666666666667, dtype=xp.float64)[()])
429
415
 
430
- @skip_xp_backends('jax.numpy',
431
- reason='jax arrays do not support item assignment')
432
416
  def test_kmeans_and_kmeans2_random_seed(self, xp):
433
417
 
434
418
  seed_list = [
scipy/cluster/vq.py CHANGED
@@ -67,9 +67,8 @@ code book.
67
67
  import warnings
68
68
  import numpy as np
69
69
  from collections import deque
70
- from scipy._lib._array_api import (
71
- _asarray, array_namespace, xp_size, xp_copy
72
- )
70
+ from scipy._lib._array_api import (_asarray, array_namespace, is_lazy_array,
71
+ xp_capabilities, xp_copy, xp_size)
73
72
  from scipy._lib._util import (check_random_state, rng_integers,
74
73
  _transition_to_rng)
75
74
  from scipy._lib import array_api_extra as xpx
@@ -86,7 +85,8 @@ class ClusterError(Exception):
86
85
  pass
87
86
 
88
87
 
89
- def whiten(obs, check_finite=True):
88
+ @xp_capabilities()
89
+ def whiten(obs, check_finite=None):
90
90
  """
91
91
  Normalize a group of observations on a per feature basis.
92
92
 
@@ -100,19 +100,19 @@ def whiten(obs, check_finite=True):
100
100
  ----------
101
101
  obs : ndarray
102
102
  Each row of the array is an observation. The
103
- columns are the features seen during each observation.
103
+ columns are the features seen during each observation::
104
104
 
105
- >>> # f0 f1 f2
106
- >>> obs = [[ 1., 1., 1.], #o0
107
- ... [ 2., 2., 2.], #o1
108
- ... [ 3., 3., 3.], #o2
109
- ... [ 4., 4., 4.]] #o3
105
+ # f0 f1 f2
106
+ obs = [[ 1., 1., 1.], #o0
107
+ [ 2., 2., 2.], #o1
108
+ [ 3., 3., 3.], #o2
109
+ [ 4., 4., 4.]] #o3
110
110
 
111
111
  check_finite : bool, optional
112
112
  Whether to check that the input matrices contain only finite numbers.
113
113
  Disabling may give a performance gain, but may result in problems
114
114
  (crashes, non-termination) if the inputs do contain infinities or NaNs.
115
- Default: True
115
+ Default: True for eager backends and False for lazy ones.
116
116
 
117
117
  Returns
118
118
  -------
@@ -134,17 +134,21 @@ def whiten(obs, check_finite=True):
134
134
 
135
135
  """
136
136
  xp = array_namespace(obs)
137
+ if check_finite is None:
138
+ check_finite = not is_lazy_array(obs)
137
139
  obs = _asarray(obs, check_finite=check_finite, xp=xp)
138
140
  std_dev = xp.std(obs, axis=0)
139
141
  zero_std_mask = std_dev == 0
140
- if xp.any(zero_std_mask):
141
- std_dev[zero_std_mask] = 1.0
142
+ std_dev = xpx.at(std_dev, zero_std_mask).set(1.0)
143
+ if check_finite and xp.any(zero_std_mask):
142
144
  warnings.warn("Some columns have standard deviation zero. "
143
145
  "The values of these columns will not change.",
144
146
  RuntimeWarning, stacklevel=2)
145
147
  return obs / std_dev
146
148
 
147
149
 
150
+ @xp_capabilities(cpu_only=True, reason="uses spatial.distance.cdist",
151
+ jax_jit=False, allow_dask_compute=True)
148
152
  def vq(obs, code_book, check_finite=True):
149
153
  """
150
154
  Assign codes from a code book to observations.
@@ -168,13 +172,12 @@ def vq(obs, code_book, check_finite=True):
168
172
  code_book : ndarray
169
173
  The code book is usually generated using the k-means algorithm.
170
174
  Each row of the array holds a different code, and the columns are
171
- the features of the code.
175
+ the features of the code::
172
176
 
173
- >>> # f0 f1 f2 f3
174
- >>> code_book = [
175
- ... [ 1., 2., 3., 4.], #c0
176
- ... [ 1., 2., 3., 4.], #c1
177
- ... [ 1., 2., 3., 4.]] #c2
177
+ # f0 f1 f2 f3
178
+ code_book = [[ 1., 2., 3., 4.], #c0
179
+ [ 1., 2., 3., 4.], #c1
180
+ [ 1., 2., 3., 4.]] #c2
178
181
 
179
182
  check_finite : bool, optional
180
183
  Whether to check that the input matrices contain only finite numbers.
@@ -208,10 +211,9 @@ def vq(obs, code_book, check_finite=True):
208
211
  code_book = _asarray(code_book, xp=xp, check_finite=check_finite)
209
212
  ct = xp.result_type(obs, code_book)
210
213
 
211
- c_obs = xp.astype(obs, ct, copy=False)
212
- c_code_book = xp.astype(code_book, ct, copy=False)
213
-
214
214
  if xp.isdtype(ct, kind='real floating'):
215
+ c_obs = xp.astype(obs, ct, copy=False)
216
+ c_code_book = xp.astype(code_book, ct, copy=False)
215
217
  c_obs = np.asarray(c_obs)
216
218
  c_code_book = np.asarray(c_code_book)
217
219
  result = _vq.vq(c_obs, c_code_book)
@@ -310,25 +312,24 @@ def _kmeans(obs, guess, thresh=1e-5, xp=None):
310
312
  code_book = guess
311
313
  diff = xp.inf
312
314
  prev_avg_dists = deque([diff], maxlen=2)
315
+
316
+ np_obs = np.asarray(obs)
313
317
  while diff > thresh:
314
318
  # compute membership and distances between obs and code_book
315
319
  obs_code, distort = vq(obs, code_book, check_finite=False)
316
320
  prev_avg_dists.append(xp.mean(distort, axis=-1))
317
321
  # recalc code_book as centroids of associated obs
318
- obs = np.asarray(obs)
319
322
  obs_code = np.asarray(obs_code)
320
- code_book, has_members = _vq.update_cluster_means(obs, obs_code,
323
+ code_book, has_members = _vq.update_cluster_means(np_obs, obs_code,
321
324
  code_book.shape[0])
322
- obs = xp.asarray(obs)
323
- obs_code = xp.asarray(obs_code)
324
- code_book = xp.asarray(code_book)
325
- has_members = xp.asarray(has_members)
326
325
  code_book = code_book[has_members]
326
+ code_book = xp.asarray(code_book)
327
327
  diff = xp.abs(prev_avg_dists[0] - prev_avg_dists[1])
328
328
 
329
329
  return code_book, prev_avg_dists[1]
330
330
 
331
331
 
332
+ @xp_capabilities(cpu_only=True, jax_jit=False, allow_dask_compute=True)
332
333
  @_transition_to_rng("seed")
333
334
  def kmeans(obs, k_or_guess, iter=20, thresh=1e-5, check_finite=True,
334
335
  *, rng=None):
@@ -480,7 +481,7 @@ def kmeans(obs, k_or_guess, iter=20, thresh=1e-5, check_finite=True,
480
481
  if k != guess:
481
482
  raise ValueError("If k_or_guess is a scalar, it must be an integer.")
482
483
  if k < 1:
483
- raise ValueError("Asked for %d clusters." % k)
484
+ raise ValueError(f"Asked for {k} clusters.")
484
485
 
485
486
  rng = check_random_state(rng)
486
487
 
@@ -609,15 +610,16 @@ def _kpp(data, k, rng, xp):
609
610
 
610
611
  for i in range(k):
611
612
  if i == 0:
612
- init[i, :] = data[rng_integers(rng, data.shape[0]), :]
613
-
613
+ data_idx = rng_integers(rng, data.shape[0])
614
614
  else:
615
615
  D2 = cdist(init[:i,:], data, metric='sqeuclidean').min(axis=0)
616
616
  probs = D2/D2.sum()
617
617
  cumprobs = probs.cumsum()
618
618
  r = rng.uniform()
619
619
  cumprobs = np.asarray(cumprobs)
620
- init[i, :] = data[np.searchsorted(cumprobs, r), :]
620
+ data_idx = int(np.searchsorted(cumprobs, r))
621
+
622
+ init = xpx.at(init)[i, :].set(data[data_idx, :])
621
623
 
622
624
  if ndim == 1:
623
625
  init = init[:, 0]
@@ -643,6 +645,7 @@ def _missing_raise():
643
645
  _valid_miss_meth = {'warn': _missing_warn, 'raise': _missing_raise}
644
646
 
645
647
 
648
+ @xp_capabilities(cpu_only=True, jax_jit=False, allow_dask_compute=True)
646
649
  @_transition_to_rng("seed")
647
650
  def kmeans2(data, k, iter=10, thresh=1e-5, minit='random',
648
651
  missing='warn', check_finite=True, *, rng=None):
@@ -799,8 +802,9 @@ def kmeans2(data, k, iter=10, thresh=1e-5, minit='random',
799
802
  nc = int(code_book)
800
803
 
801
804
  if nc < 1:
802
- raise ValueError("Cannot ask kmeans2 for %d clusters"
803
- " (k was %s)" % (nc, code_book))
805
+ raise ValueError(
806
+ f"Cannot ask kmeans2 for {nc} clusters (k was {code_book})"
807
+ )
804
808
  elif nc != code_book:
805
809
  warnings.warn("k was not an integer, was converted.", stacklevel=2)
806
810
 
@@ -814,7 +818,7 @@ def kmeans2(data, k, iter=10, thresh=1e-5, minit='random',
814
818
 
815
819
  data = np.asarray(data)
816
820
  code_book = np.asarray(code_book)
817
- for i in range(iter):
821
+ for _ in range(iter):
818
822
  # Compute the nearest neighbor for each obs using the current code book
819
823
  label = vq(data, code_book, check_finite=check_finite)[0]
820
824
  # Update the code book by computing centroids