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
@@ -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