scipy 1.15.3__cp313-cp313-win_amd64.whl → 1.16.0rc2__cp313-cp313-win_amd64.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 (759) hide show
  1. scipy/__config__.py +8 -8
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cp313-win_amd64.dll.a +0 -0
  4. scipy/_cyutility.cp313-win_amd64.pyd +0 -0
  5. scipy/_lib/_array_api.py +486 -161
  6. scipy/_lib/_array_api_compat_vendor.py +9 -0
  7. scipy/_lib/_bunch.py +4 -0
  8. scipy/_lib/_ccallback_c.cp313-win_amd64.dll.a +0 -0
  9. scipy/_lib/_ccallback_c.cp313-win_amd64.pyd +0 -0
  10. scipy/_lib/_docscrape.py +1 -1
  11. scipy/_lib/_elementwise_iterative_method.py +15 -26
  12. scipy/_lib/_fpumode.cp313-win_amd64.dll.a +0 -0
  13. scipy/_lib/_fpumode.cp313-win_amd64.pyd +0 -0
  14. scipy/_lib/_sparse.py +41 -0
  15. scipy/_lib/_test_ccallback.cp313-win_amd64.dll.a +0 -0
  16. scipy/_lib/_test_ccallback.cp313-win_amd64.pyd +0 -0
  17. scipy/_lib/_test_deprecation_call.cp313-win_amd64.dll.a +0 -0
  18. scipy/_lib/_test_deprecation_call.cp313-win_amd64.pyd +0 -0
  19. scipy/_lib/_test_deprecation_def.cp313-win_amd64.dll.a +0 -0
  20. scipy/_lib/_test_deprecation_def.cp313-win_amd64.pyd +0 -0
  21. scipy/_lib/_testutils.py +6 -2
  22. scipy/_lib/_uarray/_uarray.cp313-win_amd64.dll.a +0 -0
  23. scipy/_lib/_uarray/_uarray.cp313-win_amd64.pyd +0 -0
  24. scipy/_lib/_util.py +222 -125
  25. scipy/_lib/array_api_compat/__init__.py +4 -4
  26. scipy/_lib/array_api_compat/_internal.py +19 -6
  27. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  28. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  29. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  30. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  31. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  32. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  33. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  34. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  35. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  36. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  37. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  38. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  39. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  40. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  41. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  42. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  43. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  44. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  45. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  46. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  47. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  48. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  49. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  50. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  51. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  52. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  53. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  54. scipy/_lib/array_api_extra/__init__.py +26 -3
  55. scipy/_lib/array_api_extra/_delegation.py +171 -0
  56. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  57. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  58. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  59. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  60. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  61. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  62. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  63. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  64. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  65. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  66. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  67. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  68. scipy/_lib/array_api_extra/testing.py +359 -0
  69. scipy/_lib/decorator.py +2 -2
  70. scipy/_lib/doccer.py +1 -7
  71. scipy/_lib/messagestream.cp313-win_amd64.dll.a +0 -0
  72. scipy/_lib/messagestream.cp313-win_amd64.pyd +0 -0
  73. scipy/_lib/pyprima/__init__.py +212 -0
  74. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  75. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  76. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  77. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  78. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  79. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  80. scipy/_lib/pyprima/cobyla/update.py +289 -0
  81. scipy/_lib/pyprima/common/__init__.py +0 -0
  82. scipy/_lib/pyprima/common/_bounds.py +34 -0
  83. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  84. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  85. scipy/_lib/pyprima/common/_project.py +173 -0
  86. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  87. scipy/_lib/pyprima/common/consts.py +47 -0
  88. scipy/_lib/pyprima/common/evaluate.py +99 -0
  89. scipy/_lib/pyprima/common/history.py +38 -0
  90. scipy/_lib/pyprima/common/infos.py +30 -0
  91. scipy/_lib/pyprima/common/linalg.py +435 -0
  92. scipy/_lib/pyprima/common/message.py +290 -0
  93. scipy/_lib/pyprima/common/powalg.py +131 -0
  94. scipy/_lib/pyprima/common/preproc.py +277 -0
  95. scipy/_lib/pyprima/common/present.py +5 -0
  96. scipy/_lib/pyprima/common/ratio.py +54 -0
  97. scipy/_lib/pyprima/common/redrho.py +47 -0
  98. scipy/_lib/pyprima/common/selectx.py +296 -0
  99. scipy/_lib/tests/test__util.py +105 -121
  100. scipy/_lib/tests/test_array_api.py +166 -35
  101. scipy/_lib/tests/test_bunch.py +7 -0
  102. scipy/_lib/tests/test_ccallback.py +2 -10
  103. scipy/_lib/tests/test_public_api.py +13 -0
  104. scipy/cluster/_hierarchy.cp313-win_amd64.dll.a +0 -0
  105. scipy/cluster/_hierarchy.cp313-win_amd64.pyd +0 -0
  106. scipy/cluster/_optimal_leaf_ordering.cp313-win_amd64.dll.a +0 -0
  107. scipy/cluster/_optimal_leaf_ordering.cp313-win_amd64.pyd +0 -0
  108. scipy/cluster/_vq.cp313-win_amd64.dll.a +0 -0
  109. scipy/cluster/_vq.cp313-win_amd64.pyd +0 -0
  110. scipy/cluster/hierarchy.py +393 -223
  111. scipy/cluster/tests/test_hierarchy.py +273 -335
  112. scipy/cluster/tests/test_vq.py +45 -61
  113. scipy/cluster/vq.py +39 -35
  114. scipy/conftest.py +263 -157
  115. scipy/constants/_constants.py +4 -1
  116. scipy/constants/tests/test_codata.py +2 -2
  117. scipy/constants/tests/test_constants.py +11 -18
  118. scipy/datasets/_download_all.py +15 -1
  119. scipy/datasets/_fetchers.py +7 -1
  120. scipy/datasets/_utils.py +1 -1
  121. scipy/differentiate/_differentiate.py +25 -25
  122. scipy/differentiate/tests/test_differentiate.py +24 -25
  123. scipy/fft/_basic.py +20 -0
  124. scipy/fft/_helper.py +3 -34
  125. scipy/fft/_pocketfft/helper.py +29 -1
  126. scipy/fft/_pocketfft/pypocketfft.cp313-win_amd64.dll.a +0 -0
  127. scipy/fft/_pocketfft/pypocketfft.cp313-win_amd64.pyd +0 -0
  128. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  129. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  130. scipy/fft/_realtransforms.py +13 -0
  131. scipy/fft/tests/test_basic.py +27 -25
  132. scipy/fft/tests/test_fftlog.py +16 -7
  133. scipy/fft/tests/test_helper.py +18 -34
  134. scipy/fft/tests/test_real_transforms.py +8 -10
  135. scipy/fftpack/convolve.cp313-win_amd64.dll.a +0 -0
  136. scipy/fftpack/convolve.cp313-win_amd64.pyd +0 -0
  137. scipy/fftpack/tests/test_basic.py +2 -4
  138. scipy/fftpack/tests/test_real_transforms.py +8 -9
  139. scipy/integrate/_bvp.py +9 -3
  140. scipy/integrate/_cubature.py +3 -2
  141. scipy/integrate/_dop.cp313-win_amd64.dll.a +0 -0
  142. scipy/integrate/_dop.cp313-win_amd64.pyd +0 -0
  143. scipy/integrate/_lsoda.cp313-win_amd64.dll.a +0 -0
  144. scipy/integrate/_lsoda.cp313-win_amd64.pyd +0 -0
  145. scipy/integrate/_ode.py +9 -2
  146. scipy/integrate/_odepack.cp313-win_amd64.dll.a +0 -0
  147. scipy/integrate/_odepack.cp313-win_amd64.pyd +0 -0
  148. scipy/integrate/_quad_vec.py +21 -29
  149. scipy/integrate/_quadpack.cp313-win_amd64.dll.a +0 -0
  150. scipy/integrate/_quadpack.cp313-win_amd64.pyd +0 -0
  151. scipy/integrate/_quadpack_py.py +11 -7
  152. scipy/integrate/_quadrature.py +3 -3
  153. scipy/integrate/_rules/_base.py +2 -2
  154. scipy/integrate/_tanhsinh.py +48 -47
  155. scipy/integrate/_test_multivariate.cp313-win_amd64.dll.a +0 -0
  156. scipy/integrate/_test_multivariate.cp313-win_amd64.pyd +0 -0
  157. scipy/integrate/_test_odeint_banded.cp313-win_amd64.dll.a +0 -0
  158. scipy/integrate/_test_odeint_banded.cp313-win_amd64.pyd +0 -0
  159. scipy/integrate/_vode.cp313-win_amd64.dll.a +0 -0
  160. scipy/integrate/_vode.cp313-win_amd64.pyd +0 -0
  161. scipy/integrate/tests/test__quad_vec.py +0 -6
  162. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  163. scipy/integrate/tests/test_cubature.py +21 -35
  164. scipy/integrate/tests/test_quadrature.py +6 -8
  165. scipy/integrate/tests/test_tanhsinh.py +56 -48
  166. scipy/interpolate/__init__.py +70 -58
  167. scipy/interpolate/_bary_rational.py +22 -22
  168. scipy/interpolate/_bsplines.py +119 -66
  169. scipy/interpolate/_cubic.py +65 -50
  170. scipy/interpolate/_dfitpack.cp313-win_amd64.dll.a +0 -0
  171. scipy/interpolate/_dfitpack.cp313-win_amd64.pyd +0 -0
  172. scipy/interpolate/_dierckx.cp313-win_amd64.dll.a +0 -0
  173. scipy/interpolate/_dierckx.cp313-win_amd64.pyd +0 -0
  174. scipy/interpolate/_fitpack.cp313-win_amd64.dll.a +0 -0
  175. scipy/interpolate/_fitpack.cp313-win_amd64.pyd +0 -0
  176. scipy/interpolate/_fitpack2.py +9 -6
  177. scipy/interpolate/_fitpack_impl.py +32 -26
  178. scipy/interpolate/_fitpack_repro.py +23 -19
  179. scipy/interpolate/_interpnd.cp313-win_amd64.dll.a +0 -0
  180. scipy/interpolate/_interpnd.cp313-win_amd64.pyd +0 -0
  181. scipy/interpolate/_interpolate.py +30 -12
  182. scipy/interpolate/_ndbspline.py +13 -18
  183. scipy/interpolate/_ndgriddata.py +5 -8
  184. scipy/interpolate/_polyint.py +95 -31
  185. scipy/interpolate/_ppoly.cp313-win_amd64.dll.a +0 -0
  186. scipy/interpolate/_ppoly.cp313-win_amd64.pyd +0 -0
  187. scipy/interpolate/_rbf.py +2 -2
  188. scipy/interpolate/_rbfinterp.py +1 -1
  189. scipy/interpolate/_rbfinterp_pythran.cp313-win_amd64.dll.a +0 -0
  190. scipy/interpolate/_rbfinterp_pythran.cp313-win_amd64.pyd +0 -0
  191. scipy/interpolate/_rgi.py +31 -26
  192. scipy/interpolate/_rgi_cython.cp313-win_amd64.dll.a +0 -0
  193. scipy/interpolate/_rgi_cython.cp313-win_amd64.pyd +0 -0
  194. scipy/interpolate/dfitpack.py +0 -20
  195. scipy/interpolate/interpnd.py +1 -2
  196. scipy/interpolate/tests/test_bary_rational.py +2 -2
  197. scipy/interpolate/tests/test_bsplines.py +97 -1
  198. scipy/interpolate/tests/test_fitpack2.py +39 -1
  199. scipy/interpolate/tests/test_interpnd.py +32 -20
  200. scipy/interpolate/tests/test_interpolate.py +48 -4
  201. scipy/interpolate/tests/test_rgi.py +2 -1
  202. scipy/io/_fast_matrix_market/__init__.py +2 -0
  203. scipy/io/_fast_matrix_market/_fmm_core.cp313-win_amd64.dll.a +0 -0
  204. scipy/io/_fast_matrix_market/_fmm_core.cp313-win_amd64.pyd +0 -0
  205. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  206. scipy/io/_harwell_boeing/hb.py +7 -11
  207. scipy/io/_idl.py +5 -7
  208. scipy/io/_netcdf.py +15 -5
  209. scipy/io/_test_fortran.cp313-win_amd64.dll.a +0 -0
  210. scipy/io/_test_fortran.cp313-win_amd64.pyd +0 -0
  211. scipy/io/arff/tests/test_arffread.py +3 -3
  212. scipy/io/matlab/__init__.py +5 -3
  213. scipy/io/matlab/_mio.py +4 -1
  214. scipy/io/matlab/_mio5.py +19 -13
  215. scipy/io/matlab/_mio5_utils.cp313-win_amd64.dll.a +0 -0
  216. scipy/io/matlab/_mio5_utils.cp313-win_amd64.pyd +0 -0
  217. scipy/io/matlab/_mio_utils.cp313-win_amd64.dll.a +0 -0
  218. scipy/io/matlab/_mio_utils.cp313-win_amd64.pyd +0 -0
  219. scipy/io/matlab/_miobase.py +4 -1
  220. scipy/io/matlab/_streams.cp313-win_amd64.dll.a +0 -0
  221. scipy/io/matlab/_streams.cp313-win_amd64.pyd +0 -0
  222. scipy/io/matlab/tests/test_mio.py +46 -18
  223. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  224. scipy/io/tests/test_mmio.py +7 -1
  225. scipy/io/tests/test_wavfile.py +41 -0
  226. scipy/io/wavfile.py +57 -10
  227. scipy/linalg/_basic.py +113 -86
  228. scipy/linalg/_cythonized_array_utils.cp313-win_amd64.dll.a +0 -0
  229. scipy/linalg/_cythonized_array_utils.cp313-win_amd64.pyd +0 -0
  230. scipy/linalg/_decomp.py +22 -9
  231. scipy/linalg/_decomp_cholesky.py +28 -13
  232. scipy/linalg/_decomp_cossin.py +45 -30
  233. scipy/linalg/_decomp_interpolative.cp313-win_amd64.dll.a +0 -0
  234. scipy/linalg/_decomp_interpolative.cp313-win_amd64.pyd +0 -0
  235. scipy/linalg/_decomp_ldl.py +4 -1
  236. scipy/linalg/_decomp_lu.py +18 -6
  237. scipy/linalg/_decomp_lu_cython.cp313-win_amd64.dll.a +0 -0
  238. scipy/linalg/_decomp_lu_cython.cp313-win_amd64.pyd +0 -0
  239. scipy/linalg/_decomp_polar.py +2 -0
  240. scipy/linalg/_decomp_qr.py +6 -2
  241. scipy/linalg/_decomp_qz.py +3 -0
  242. scipy/linalg/_decomp_schur.py +3 -1
  243. scipy/linalg/_decomp_svd.py +13 -2
  244. scipy/linalg/_decomp_update.cp313-win_amd64.dll.a +0 -0
  245. scipy/linalg/_decomp_update.cp313-win_amd64.pyd +0 -0
  246. scipy/linalg/_expm_frechet.py +4 -0
  247. scipy/linalg/_fblas.cp313-win_amd64.dll.a +0 -0
  248. scipy/linalg/_fblas.cp313-win_amd64.pyd +0 -0
  249. scipy/linalg/_flapack.cp313-win_amd64.dll.a +0 -0
  250. scipy/linalg/_flapack.cp313-win_amd64.pyd +0 -0
  251. scipy/linalg/_linalg_pythran.cp313-win_amd64.dll.a +0 -0
  252. scipy/linalg/_linalg_pythran.cp313-win_amd64.pyd +0 -0
  253. scipy/linalg/_matfuncs.py +187 -4
  254. scipy/linalg/_matfuncs_expm.cp313-win_amd64.dll.a +0 -0
  255. scipy/linalg/_matfuncs_expm.cp313-win_amd64.pyd +0 -0
  256. scipy/linalg/_matfuncs_schur_sqrtm.cp313-win_amd64.dll.a +0 -0
  257. scipy/linalg/_matfuncs_schur_sqrtm.cp313-win_amd64.pyd +0 -0
  258. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  259. scipy/linalg/_matfuncs_sqrtm_triu.cp313-win_amd64.dll.a +0 -0
  260. scipy/linalg/_matfuncs_sqrtm_triu.cp313-win_amd64.pyd +0 -0
  261. scipy/linalg/_procrustes.py +2 -0
  262. scipy/linalg/_sketches.py +17 -6
  263. scipy/linalg/_solve_toeplitz.cp313-win_amd64.dll.a +0 -0
  264. scipy/linalg/_solve_toeplitz.cp313-win_amd64.pyd +0 -0
  265. scipy/linalg/_solvers.py +7 -2
  266. scipy/linalg/_special_matrices.py +26 -36
  267. scipy/linalg/cython_blas.cp313-win_amd64.dll.a +0 -0
  268. scipy/linalg/cython_blas.cp313-win_amd64.pyd +0 -0
  269. scipy/linalg/cython_lapack.cp313-win_amd64.dll.a +0 -0
  270. scipy/linalg/cython_lapack.cp313-win_amd64.pyd +0 -0
  271. scipy/linalg/lapack.py +22 -2
  272. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  273. scipy/linalg/tests/test_basic.py +31 -16
  274. scipy/linalg/tests/test_batch.py +588 -0
  275. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  276. scipy/linalg/tests/test_decomp.py +40 -3
  277. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  278. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  279. scipy/linalg/tests/test_lapack.py +115 -7
  280. scipy/linalg/tests/test_matfuncs.py +157 -102
  281. scipy/linalg/tests/test_procrustes.py +0 -7
  282. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  283. scipy/linalg/tests/test_special_matrices.py +1 -5
  284. scipy/ndimage/__init__.py +1 -0
  285. scipy/ndimage/_ctest.cp313-win_amd64.dll.a +0 -0
  286. scipy/ndimage/_ctest.cp313-win_amd64.pyd +0 -0
  287. scipy/ndimage/_cytest.cp313-win_amd64.dll.a +0 -0
  288. scipy/ndimage/_cytest.cp313-win_amd64.pyd +0 -0
  289. scipy/ndimage/_delegators.py +8 -2
  290. scipy/ndimage/_filters.py +453 -5
  291. scipy/ndimage/_interpolation.py +36 -6
  292. scipy/ndimage/_measurements.py +4 -2
  293. scipy/ndimage/_morphology.py +5 -0
  294. scipy/ndimage/_nd_image.cp313-win_amd64.dll.a +0 -0
  295. scipy/ndimage/_nd_image.cp313-win_amd64.pyd +0 -0
  296. scipy/ndimage/_ni_docstrings.py +5 -1
  297. scipy/ndimage/_ni_label.cp313-win_amd64.dll.a +0 -0
  298. scipy/ndimage/_ni_label.cp313-win_amd64.pyd +0 -0
  299. scipy/ndimage/_ni_support.py +1 -5
  300. scipy/ndimage/_rank_filter_1d.cp313-win_amd64.dll.a +0 -0
  301. scipy/ndimage/_rank_filter_1d.cp313-win_amd64.pyd +0 -0
  302. scipy/ndimage/_support_alternative_backends.py +18 -6
  303. scipy/ndimage/tests/test_filters.py +370 -259
  304. scipy/ndimage/tests/test_fourier.py +7 -9
  305. scipy/ndimage/tests/test_interpolation.py +68 -61
  306. scipy/ndimage/tests/test_measurements.py +18 -35
  307. scipy/ndimage/tests/test_morphology.py +143 -131
  308. scipy/ndimage/tests/test_splines.py +1 -3
  309. scipy/odr/__odrpack.cp313-win_amd64.dll.a +0 -0
  310. scipy/odr/__odrpack.cp313-win_amd64.pyd +0 -0
  311. scipy/optimize/_basinhopping.py +13 -7
  312. scipy/optimize/_bglu_dense.cp313-win_amd64.dll.a +0 -0
  313. scipy/optimize/_bglu_dense.cp313-win_amd64.pyd +0 -0
  314. scipy/optimize/_bracket.py +17 -24
  315. scipy/optimize/_chandrupatla.py +9 -10
  316. scipy/optimize/_cobyla_py.py +104 -123
  317. scipy/optimize/_constraints.py +14 -10
  318. scipy/optimize/_differentiable_functions.py +371 -230
  319. scipy/optimize/_differentialevolution.py +4 -3
  320. scipy/optimize/_direct.cp313-win_amd64.dll.a +0 -0
  321. scipy/optimize/_direct.cp313-win_amd64.pyd +0 -0
  322. scipy/optimize/_dual_annealing.py +1 -1
  323. scipy/optimize/_elementwise.py +1 -4
  324. scipy/optimize/_group_columns.cp313-win_amd64.dll.a +0 -0
  325. scipy/optimize/_group_columns.cp313-win_amd64.pyd +0 -0
  326. scipy/optimize/_highspy/_core.cp313-win_amd64.dll.a +0 -0
  327. scipy/optimize/_highspy/_core.cp313-win_amd64.pyd +0 -0
  328. scipy/optimize/_highspy/_highs_options.cp313-win_amd64.dll.a +0 -0
  329. scipy/optimize/_highspy/_highs_options.cp313-win_amd64.pyd +0 -0
  330. scipy/optimize/_lbfgsb.cp313-win_amd64.dll.a +0 -0
  331. scipy/optimize/_lbfgsb.cp313-win_amd64.pyd +0 -0
  332. scipy/optimize/_lbfgsb_py.py +57 -16
  333. scipy/optimize/_linprog_doc.py +2 -2
  334. scipy/optimize/_linprog_highs.py +2 -2
  335. scipy/optimize/_linprog_ip.py +25 -10
  336. scipy/optimize/_linprog_util.py +14 -16
  337. scipy/optimize/_lsap.cp313-win_amd64.dll.a +0 -0
  338. scipy/optimize/_lsap.cp313-win_amd64.pyd +0 -0
  339. scipy/optimize/_lsq/common.py +3 -3
  340. scipy/optimize/_lsq/dogbox.py +16 -2
  341. scipy/optimize/_lsq/givens_elimination.cp313-win_amd64.dll.a +0 -0
  342. scipy/optimize/_lsq/givens_elimination.cp313-win_amd64.pyd +0 -0
  343. scipy/optimize/_lsq/least_squares.py +198 -126
  344. scipy/optimize/_lsq/lsq_linear.py +6 -6
  345. scipy/optimize/_lsq/trf.py +35 -8
  346. scipy/optimize/_milp.py +3 -1
  347. scipy/optimize/_minimize.py +105 -36
  348. scipy/optimize/_minpack.cp313-win_amd64.dll.a +0 -0
  349. scipy/optimize/_minpack.cp313-win_amd64.pyd +0 -0
  350. scipy/optimize/_minpack_py.py +21 -14
  351. scipy/optimize/_moduleTNC.cp313-win_amd64.dll.a +0 -0
  352. scipy/optimize/_moduleTNC.cp313-win_amd64.pyd +0 -0
  353. scipy/optimize/_nnls.py +20 -21
  354. scipy/optimize/_nonlin.py +34 -3
  355. scipy/optimize/_numdiff.py +288 -110
  356. scipy/optimize/_optimize.py +86 -48
  357. scipy/optimize/_pava_pybind.cp313-win_amd64.dll.a +0 -0
  358. scipy/optimize/_pava_pybind.cp313-win_amd64.pyd +0 -0
  359. scipy/optimize/_remove_redundancy.py +5 -5
  360. scipy/optimize/_root_scalar.py +1 -1
  361. scipy/optimize/_shgo.py +6 -0
  362. scipy/optimize/_shgo_lib/_complex.py +1 -1
  363. scipy/optimize/_slsqp_py.py +216 -124
  364. scipy/optimize/_slsqplib.cp313-win_amd64.dll.a +0 -0
  365. scipy/optimize/_slsqplib.cp313-win_amd64.pyd +0 -0
  366. scipy/optimize/_spectral.py +1 -1
  367. scipy/optimize/_tnc.py +8 -1
  368. scipy/optimize/_trlib/_trlib.cp313-win_amd64.dll.a +0 -0
  369. scipy/optimize/_trlib/_trlib.cp313-win_amd64.pyd +0 -0
  370. scipy/optimize/_trustregion.py +20 -6
  371. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  372. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  373. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  374. scipy/optimize/_trustregion_constr/projections.py +12 -8
  375. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  376. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  377. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  378. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  379. scipy/optimize/_trustregion_exact.py +0 -1
  380. scipy/optimize/_zeros.cp313-win_amd64.dll.a +0 -0
  381. scipy/optimize/_zeros.cp313-win_amd64.pyd +0 -0
  382. scipy/optimize/_zeros_py.py +97 -17
  383. scipy/optimize/cython_optimize/_zeros.cp313-win_amd64.dll.a +0 -0
  384. scipy/optimize/cython_optimize/_zeros.cp313-win_amd64.pyd +0 -0
  385. scipy/optimize/slsqp.py +0 -1
  386. scipy/optimize/tests/test__basinhopping.py +1 -1
  387. scipy/optimize/tests/test__differential_evolution.py +4 -4
  388. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  389. scipy/optimize/tests/test__numdiff.py +66 -22
  390. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  391. scipy/optimize/tests/test__shgo.py +9 -1
  392. scipy/optimize/tests/test_bracket.py +36 -46
  393. scipy/optimize/tests/test_chandrupatla.py +133 -135
  394. scipy/optimize/tests/test_cobyla.py +74 -45
  395. scipy/optimize/tests/test_constraints.py +1 -1
  396. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  397. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  398. scipy/optimize/tests/test_least_squares.py +125 -13
  399. scipy/optimize/tests/test_linear_assignment.py +3 -3
  400. scipy/optimize/tests/test_linprog.py +3 -3
  401. scipy/optimize/tests/test_lsq_linear.py +6 -6
  402. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  403. scipy/optimize/tests/test_minpack.py +4 -4
  404. scipy/optimize/tests/test_nnls.py +43 -3
  405. scipy/optimize/tests/test_nonlin.py +36 -0
  406. scipy/optimize/tests/test_optimize.py +95 -17
  407. scipy/optimize/tests/test_slsqp.py +36 -4
  408. scipy/optimize/tests/test_zeros.py +34 -1
  409. scipy/signal/__init__.py +12 -23
  410. scipy/signal/_delegators.py +568 -0
  411. scipy/signal/_filter_design.py +459 -241
  412. scipy/signal/_fir_filter_design.py +262 -90
  413. scipy/signal/_lti_conversion.py +3 -2
  414. scipy/signal/_ltisys.py +118 -91
  415. scipy/signal/_max_len_seq_inner.cp313-win_amd64.dll.a +0 -0
  416. scipy/signal/_max_len_seq_inner.cp313-win_amd64.pyd +0 -0
  417. scipy/signal/_peak_finding_utils.cp313-win_amd64.dll.a +0 -0
  418. scipy/signal/_peak_finding_utils.cp313-win_amd64.pyd +0 -0
  419. scipy/signal/_polyutils.py +172 -0
  420. scipy/signal/_short_time_fft.py +519 -70
  421. scipy/signal/_signal_api.py +30 -0
  422. scipy/signal/_signaltools.py +719 -399
  423. scipy/signal/_sigtools.cp313-win_amd64.dll.a +0 -0
  424. scipy/signal/_sigtools.cp313-win_amd64.pyd +0 -0
  425. scipy/signal/_sosfilt.cp313-win_amd64.dll.a +0 -0
  426. scipy/signal/_sosfilt.cp313-win_amd64.pyd +0 -0
  427. scipy/signal/_spectral_py.py +230 -50
  428. scipy/signal/_spline.cp313-win_amd64.dll.a +0 -0
  429. scipy/signal/_spline.cp313-win_amd64.pyd +0 -0
  430. scipy/signal/_spline_filters.py +108 -68
  431. scipy/signal/_support_alternative_backends.py +73 -0
  432. scipy/signal/_upfirdn.py +4 -1
  433. scipy/signal/_upfirdn_apply.cp313-win_amd64.dll.a +0 -0
  434. scipy/signal/_upfirdn_apply.cp313-win_amd64.pyd +0 -0
  435. scipy/signal/_waveforms.py +2 -11
  436. scipy/signal/_wavelets.py +1 -1
  437. scipy/signal/fir_filter_design.py +1 -0
  438. scipy/signal/spline.py +4 -11
  439. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  440. scipy/signal/tests/test_bsplines.py +114 -79
  441. scipy/signal/tests/test_cont2discrete.py +9 -2
  442. scipy/signal/tests/test_filter_design.py +721 -481
  443. scipy/signal/tests/test_fir_filter_design.py +332 -140
  444. scipy/signal/tests/test_savitzky_golay.py +4 -3
  445. scipy/signal/tests/test_short_time_fft.py +221 -3
  446. scipy/signal/tests/test_signaltools.py +2144 -1348
  447. scipy/signal/tests/test_spectral.py +50 -6
  448. scipy/signal/tests/test_splines.py +161 -96
  449. scipy/signal/tests/test_upfirdn.py +84 -50
  450. scipy/signal/tests/test_waveforms.py +20 -0
  451. scipy/signal/tests/test_windows.py +607 -466
  452. scipy/signal/windows/_windows.py +287 -148
  453. scipy/sparse/__init__.py +23 -4
  454. scipy/sparse/_base.py +270 -108
  455. scipy/sparse/_bsr.py +7 -4
  456. scipy/sparse/_compressed.py +59 -231
  457. scipy/sparse/_construct.py +90 -38
  458. scipy/sparse/_coo.py +115 -181
  459. scipy/sparse/_csc.py +4 -4
  460. scipy/sparse/_csparsetools.cp313-win_amd64.dll.a +0 -0
  461. scipy/sparse/_csparsetools.cp313-win_amd64.pyd +0 -0
  462. scipy/sparse/_csr.py +2 -2
  463. scipy/sparse/_data.py +48 -48
  464. scipy/sparse/_dia.py +105 -18
  465. scipy/sparse/_dok.py +0 -23
  466. scipy/sparse/_index.py +4 -4
  467. scipy/sparse/_matrix.py +23 -0
  468. scipy/sparse/_sparsetools.cp313-win_amd64.dll.a +0 -0
  469. scipy/sparse/_sparsetools.cp313-win_amd64.pyd +0 -0
  470. scipy/sparse/_sputils.py +37 -22
  471. scipy/sparse/base.py +0 -9
  472. scipy/sparse/bsr.py +0 -14
  473. scipy/sparse/compressed.py +0 -23
  474. scipy/sparse/construct.py +0 -6
  475. scipy/sparse/coo.py +0 -14
  476. scipy/sparse/csc.py +0 -3
  477. scipy/sparse/csgraph/_flow.cp313-win_amd64.dll.a +0 -0
  478. scipy/sparse/csgraph/_flow.cp313-win_amd64.pyd +0 -0
  479. scipy/sparse/csgraph/_matching.cp313-win_amd64.dll.a +0 -0
  480. scipy/sparse/csgraph/_matching.cp313-win_amd64.pyd +0 -0
  481. scipy/sparse/csgraph/_min_spanning_tree.cp313-win_amd64.dll.a +0 -0
  482. scipy/sparse/csgraph/_min_spanning_tree.cp313-win_amd64.pyd +0 -0
  483. scipy/sparse/csgraph/_reordering.cp313-win_amd64.dll.a +0 -0
  484. scipy/sparse/csgraph/_reordering.cp313-win_amd64.pyd +0 -0
  485. scipy/sparse/csgraph/_shortest_path.cp313-win_amd64.dll.a +0 -0
  486. scipy/sparse/csgraph/_shortest_path.cp313-win_amd64.pyd +0 -0
  487. scipy/sparse/csgraph/_tools.cp313-win_amd64.dll.a +0 -0
  488. scipy/sparse/csgraph/_tools.cp313-win_amd64.pyd +0 -0
  489. scipy/sparse/csgraph/_traversal.cp313-win_amd64.dll.a +0 -0
  490. scipy/sparse/csgraph/_traversal.cp313-win_amd64.pyd +0 -0
  491. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  492. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  493. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  494. scipy/sparse/csr.py +0 -5
  495. scipy/sparse/data.py +1 -6
  496. scipy/sparse/dia.py +0 -7
  497. scipy/sparse/dok.py +0 -10
  498. scipy/sparse/linalg/_dsolve/_superlu.cp313-win_amd64.dll.a +0 -0
  499. scipy/sparse/linalg/_dsolve/_superlu.cp313-win_amd64.pyd +0 -0
  500. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  501. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  502. scipy/sparse/linalg/_eigen/arpack/_arpack.cp313-win_amd64.dll.a +0 -0
  503. scipy/sparse/linalg/_eigen/arpack/_arpack.cp313-win_amd64.pyd +0 -0
  504. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  505. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  506. scipy/sparse/linalg/_interface.py +17 -18
  507. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  508. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  509. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  510. scipy/sparse/linalg/_isolve/minres.py +5 -5
  511. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  512. scipy/sparse/linalg/_isolve/utils.py +2 -8
  513. scipy/sparse/linalg/_matfuncs.py +1 -1
  514. scipy/sparse/linalg/_norm.py +1 -1
  515. scipy/sparse/linalg/_propack/_cpropack.cp313-win_amd64.dll.a +0 -0
  516. scipy/sparse/linalg/_propack/_cpropack.cp313-win_amd64.pyd +0 -0
  517. scipy/sparse/linalg/_propack/_dpropack.cp313-win_amd64.dll.a +0 -0
  518. scipy/sparse/linalg/_propack/_dpropack.cp313-win_amd64.pyd +0 -0
  519. scipy/sparse/linalg/_propack/_spropack.cp313-win_amd64.dll.a +0 -0
  520. scipy/sparse/linalg/_propack/_spropack.cp313-win_amd64.pyd +0 -0
  521. scipy/sparse/linalg/_propack/_zpropack.cp313-win_amd64.dll.a +0 -0
  522. scipy/sparse/linalg/_propack/_zpropack.cp313-win_amd64.pyd +0 -0
  523. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  524. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  525. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  526. scipy/sparse/tests/test_base.py +214 -42
  527. scipy/sparse/tests/test_common1d.py +7 -7
  528. scipy/sparse/tests/test_construct.py +1 -1
  529. scipy/sparse/tests/test_coo.py +272 -4
  530. scipy/sparse/tests/test_sparsetools.py +5 -0
  531. scipy/sparse/tests/test_sputils.py +36 -7
  532. scipy/spatial/_ckdtree.cp313-win_amd64.dll.a +0 -0
  533. scipy/spatial/_ckdtree.cp313-win_amd64.pyd +0 -0
  534. scipy/spatial/_distance_pybind.cp313-win_amd64.dll.a +0 -0
  535. scipy/spatial/_distance_pybind.cp313-win_amd64.pyd +0 -0
  536. scipy/spatial/_distance_wrap.cp313-win_amd64.dll.a +0 -0
  537. scipy/spatial/_distance_wrap.cp313-win_amd64.pyd +0 -0
  538. scipy/spatial/_hausdorff.cp313-win_amd64.dll.a +0 -0
  539. scipy/spatial/_hausdorff.cp313-win_amd64.pyd +0 -0
  540. scipy/spatial/_qhull.cp313-win_amd64.dll.a +0 -0
  541. scipy/spatial/_qhull.cp313-win_amd64.pyd +0 -0
  542. scipy/spatial/_voronoi.cp313-win_amd64.dll.a +0 -0
  543. scipy/spatial/_voronoi.cp313-win_amd64.pyd +0 -0
  544. scipy/spatial/distance.py +49 -42
  545. scipy/spatial/tests/test_distance.py +15 -1
  546. scipy/spatial/tests/test_kdtree.py +1 -0
  547. scipy/spatial/tests/test_qhull.py +7 -2
  548. scipy/spatial/transform/__init__.py +5 -3
  549. scipy/spatial/transform/_rigid_transform.cp313-win_amd64.dll.a +0 -0
  550. scipy/spatial/transform/_rigid_transform.cp313-win_amd64.pyd +0 -0
  551. scipy/spatial/transform/_rotation.cp313-win_amd64.dll.a +0 -0
  552. scipy/spatial/transform/_rotation.cp313-win_amd64.pyd +0 -0
  553. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  554. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  555. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  556. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  557. scipy/special/__init__.py +1 -47
  558. scipy/special/_add_newdocs.py +34 -772
  559. scipy/special/_basic.py +22 -25
  560. scipy/special/_comb.cp313-win_amd64.dll.a +0 -0
  561. scipy/special/_comb.cp313-win_amd64.pyd +0 -0
  562. scipy/special/_ellip_harm_2.cp313-win_amd64.dll.a +0 -0
  563. scipy/special/_ellip_harm_2.cp313-win_amd64.pyd +0 -0
  564. scipy/special/_gufuncs.cp313-win_amd64.dll.a +0 -0
  565. scipy/special/_gufuncs.cp313-win_amd64.pyd +0 -0
  566. scipy/special/_logsumexp.py +67 -58
  567. scipy/special/_orthogonal.pyi +1 -1
  568. scipy/special/_specfun.cp313-win_amd64.dll.a +0 -0
  569. scipy/special/_specfun.cp313-win_amd64.pyd +0 -0
  570. scipy/special/_special_ufuncs.cp313-win_amd64.dll.a +0 -0
  571. scipy/special/_special_ufuncs.cp313-win_amd64.pyd +0 -0
  572. scipy/special/_spherical_bessel.py +4 -4
  573. scipy/special/_support_alternative_backends.py +212 -119
  574. scipy/special/_test_internal.cp313-win_amd64.dll.a +0 -0
  575. scipy/special/_test_internal.cp313-win_amd64.pyd +0 -0
  576. scipy/special/_testutils.py +4 -4
  577. scipy/special/_ufuncs.cp313-win_amd64.dll.a +0 -0
  578. scipy/special/_ufuncs.cp313-win_amd64.pyd +0 -0
  579. scipy/special/_ufuncs.pyi +1 -0
  580. scipy/special/_ufuncs.pyx +215 -1400
  581. scipy/special/_ufuncs_cxx.cp313-win_amd64.dll.a +0 -0
  582. scipy/special/_ufuncs_cxx.cp313-win_amd64.pyd +0 -0
  583. scipy/special/_ufuncs_cxx.pxd +2 -15
  584. scipy/special/_ufuncs_cxx.pyx +5 -44
  585. scipy/special/_ufuncs_cxx_defs.h +2 -16
  586. scipy/special/_ufuncs_defs.h +0 -8
  587. scipy/special/cython_special.cp313-win_amd64.dll.a +0 -0
  588. scipy/special/cython_special.cp313-win_amd64.pyd +0 -0
  589. scipy/special/cython_special.pxd +1 -1
  590. scipy/special/tests/_cython_examples/meson.build +10 -1
  591. scipy/special/tests/test_basic.py +153 -20
  592. scipy/special/tests/test_boost_ufuncs.py +3 -0
  593. scipy/special/tests/test_cdflib.py +35 -11
  594. scipy/special/tests/test_gammainc.py +16 -0
  595. scipy/special/tests/test_hyp2f1.py +2 -2
  596. scipy/special/tests/test_log1mexp.py +85 -0
  597. scipy/special/tests/test_logsumexp.py +206 -64
  598. scipy/special/tests/test_mpmath.py +1 -0
  599. scipy/special/tests/test_nan_inputs.py +1 -1
  600. scipy/special/tests/test_orthogonal.py +17 -18
  601. scipy/special/tests/test_sf_error.py +3 -2
  602. scipy/special/tests/test_sph_harm.py +6 -7
  603. scipy/special/tests/test_support_alternative_backends.py +211 -76
  604. scipy/stats/__init__.py +4 -1
  605. scipy/stats/_ansari_swilk_statistics.cp313-win_amd64.dll.a +0 -0
  606. scipy/stats/_ansari_swilk_statistics.cp313-win_amd64.pyd +0 -0
  607. scipy/stats/_axis_nan_policy.py +5 -12
  608. scipy/stats/_biasedurn.cp313-win_amd64.dll.a +0 -0
  609. scipy/stats/_biasedurn.cp313-win_amd64.pyd +0 -0
  610. scipy/stats/_continued_fraction.py +387 -0
  611. scipy/stats/_continuous_distns.py +277 -310
  612. scipy/stats/_correlation.py +1 -1
  613. scipy/stats/_covariance.py +6 -3
  614. scipy/stats/_discrete_distns.py +39 -32
  615. scipy/stats/_distn_infrastructure.py +39 -12
  616. scipy/stats/_distribution_infrastructure.py +900 -238
  617. scipy/stats/_entropy.py +9 -10
  618. scipy/{_lib → stats}/_finite_differences.py +1 -1
  619. scipy/stats/_hypotests.py +83 -50
  620. scipy/stats/_kde.py +53 -49
  621. scipy/stats/_ksstats.py +1 -1
  622. scipy/stats/_levy_stable/__init__.py +7 -15
  623. scipy/stats/_levy_stable/levyst.cp313-win_amd64.dll.a +0 -0
  624. scipy/stats/_levy_stable/levyst.cp313-win_amd64.pyd +0 -0
  625. scipy/stats/_morestats.py +118 -73
  626. scipy/stats/_mstats_basic.py +13 -17
  627. scipy/stats/_mstats_extras.py +8 -8
  628. scipy/stats/_multivariate.py +89 -113
  629. scipy/stats/_new_distributions.py +97 -20
  630. scipy/stats/_page_trend_test.py +12 -5
  631. scipy/stats/_probability_distribution.py +265 -43
  632. scipy/stats/_qmc.py +14 -9
  633. scipy/stats/_qmc_cy.cp313-win_amd64.dll.a +0 -0
  634. scipy/stats/_qmc_cy.cp313-win_amd64.pyd +0 -0
  635. scipy/stats/_qmvnt.py +16 -95
  636. scipy/stats/_qmvnt_cy.cp313-win_amd64.dll.a +0 -0
  637. scipy/stats/_qmvnt_cy.cp313-win_amd64.pyd +0 -0
  638. scipy/stats/_quantile.py +335 -0
  639. scipy/stats/_rcont/rcont.cp313-win_amd64.dll.a +0 -0
  640. scipy/stats/_rcont/rcont.cp313-win_amd64.pyd +0 -0
  641. scipy/stats/_resampling.py +4 -29
  642. scipy/stats/_sampling.py +1 -1
  643. scipy/stats/_sobol.cp313-win_amd64.dll.a +0 -0
  644. scipy/stats/_sobol.cp313-win_amd64.pyd +0 -0
  645. scipy/stats/_stats.cp313-win_amd64.dll.a +0 -0
  646. scipy/stats/_stats.cp313-win_amd64.pyd +0 -0
  647. scipy/stats/_stats_mstats_common.py +21 -2
  648. scipy/stats/_stats_py.py +550 -476
  649. scipy/stats/_stats_pythran.cp313-win_amd64.dll.a +0 -0
  650. scipy/stats/_stats_pythran.cp313-win_amd64.pyd +0 -0
  651. scipy/stats/_unuran/unuran_wrapper.cp313-win_amd64.dll.a +0 -0
  652. scipy/stats/_unuran/unuran_wrapper.cp313-win_amd64.pyd +0 -0
  653. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  654. scipy/stats/_variation.py +6 -8
  655. scipy/stats/_wilcoxon.py +13 -7
  656. scipy/stats/tests/common_tests.py +6 -4
  657. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  658. scipy/stats/tests/test_continued_fraction.py +173 -0
  659. scipy/stats/tests/test_continuous.py +379 -60
  660. scipy/stats/tests/test_continuous_basic.py +18 -12
  661. scipy/stats/tests/test_discrete_basic.py +14 -8
  662. scipy/stats/tests/test_discrete_distns.py +16 -16
  663. scipy/stats/tests/test_distributions.py +95 -75
  664. scipy/stats/tests/test_entropy.py +40 -48
  665. scipy/stats/tests/test_fit.py +4 -3
  666. scipy/stats/tests/test_hypotests.py +153 -24
  667. scipy/stats/tests/test_kdeoth.py +109 -41
  668. scipy/stats/tests/test_marray.py +289 -0
  669. scipy/stats/tests/test_morestats.py +79 -47
  670. scipy/stats/tests/test_mstats_basic.py +3 -3
  671. scipy/stats/tests/test_multivariate.py +434 -83
  672. scipy/stats/tests/test_qmc.py +13 -10
  673. scipy/stats/tests/test_quantile.py +199 -0
  674. scipy/stats/tests/test_rank.py +119 -112
  675. scipy/stats/tests/test_resampling.py +47 -56
  676. scipy/stats/tests/test_sampling.py +9 -4
  677. scipy/stats/tests/test_stats.py +799 -939
  678. scipy/stats/tests/test_variation.py +8 -6
  679. scipy/version.py +2 -2
  680. scipy-1.16.0rc2.dist-info/DELVEWHEEL +2 -0
  681. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  682. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  683. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +685 -693
  684. scipy/_lib/array_api_extra/_funcs.py +0 -484
  685. scipy/_lib/array_api_extra/_typing.py +0 -8
  686. scipy/interpolate/_bspl.cp313-win_amd64.dll.a +0 -0
  687. scipy/interpolate/_bspl.cp313-win_amd64.pyd +0 -0
  688. scipy/optimize/_cobyla.cp313-win_amd64.dll.a +0 -0
  689. scipy/optimize/_cobyla.cp313-win_amd64.pyd +0 -0
  690. scipy/optimize/_cython_nnls.cp313-win_amd64.dll.a +0 -0
  691. scipy/optimize/_cython_nnls.cp313-win_amd64.pyd +0 -0
  692. scipy/optimize/_slsqp.cp313-win_amd64.dll.a +0 -0
  693. scipy/optimize/_slsqp.cp313-win_amd64.pyd +0 -0
  694. scipy/spatial/qhull_src/COPYING.txt +0 -38
  695. scipy/special/libsf_error_state.dll +0 -0
  696. scipy/special/libsf_error_state.dll.a +0 -0
  697. scipy/special/tests/test_log_softmax.py +0 -109
  698. scipy/special/tests/test_xsf_cuda.py +0 -114
  699. scipy/special/xsf/binom.h +0 -89
  700. scipy/special/xsf/cdflib.h +0 -100
  701. scipy/special/xsf/cephes/airy.h +0 -307
  702. scipy/special/xsf/cephes/besselpoly.h +0 -51
  703. scipy/special/xsf/cephes/beta.h +0 -257
  704. scipy/special/xsf/cephes/cbrt.h +0 -131
  705. scipy/special/xsf/cephes/chbevl.h +0 -85
  706. scipy/special/xsf/cephes/chdtr.h +0 -193
  707. scipy/special/xsf/cephes/const.h +0 -87
  708. scipy/special/xsf/cephes/ellie.h +0 -293
  709. scipy/special/xsf/cephes/ellik.h +0 -251
  710. scipy/special/xsf/cephes/ellpe.h +0 -107
  711. scipy/special/xsf/cephes/ellpk.h +0 -117
  712. scipy/special/xsf/cephes/expn.h +0 -260
  713. scipy/special/xsf/cephes/gamma.h +0 -398
  714. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  715. scipy/special/xsf/cephes/hyperg.h +0 -361
  716. scipy/special/xsf/cephes/i0.h +0 -149
  717. scipy/special/xsf/cephes/i1.h +0 -158
  718. scipy/special/xsf/cephes/igam.h +0 -421
  719. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  720. scipy/special/xsf/cephes/igami.h +0 -313
  721. scipy/special/xsf/cephes/j0.h +0 -225
  722. scipy/special/xsf/cephes/j1.h +0 -198
  723. scipy/special/xsf/cephes/jv.h +0 -715
  724. scipy/special/xsf/cephes/k0.h +0 -164
  725. scipy/special/xsf/cephes/k1.h +0 -163
  726. scipy/special/xsf/cephes/kn.h +0 -243
  727. scipy/special/xsf/cephes/lanczos.h +0 -112
  728. scipy/special/xsf/cephes/ndtr.h +0 -275
  729. scipy/special/xsf/cephes/poch.h +0 -85
  730. scipy/special/xsf/cephes/polevl.h +0 -167
  731. scipy/special/xsf/cephes/psi.h +0 -194
  732. scipy/special/xsf/cephes/rgamma.h +0 -111
  733. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  734. scipy/special/xsf/cephes/shichi.h +0 -248
  735. scipy/special/xsf/cephes/sici.h +0 -224
  736. scipy/special/xsf/cephes/sindg.h +0 -221
  737. scipy/special/xsf/cephes/tandg.h +0 -139
  738. scipy/special/xsf/cephes/trig.h +0 -58
  739. scipy/special/xsf/cephes/unity.h +0 -186
  740. scipy/special/xsf/cephes/zeta.h +0 -172
  741. scipy/special/xsf/config.h +0 -304
  742. scipy/special/xsf/digamma.h +0 -205
  743. scipy/special/xsf/error.h +0 -57
  744. scipy/special/xsf/evalpoly.h +0 -47
  745. scipy/special/xsf/expint.h +0 -266
  746. scipy/special/xsf/hyp2f1.h +0 -694
  747. scipy/special/xsf/iv_ratio.h +0 -173
  748. scipy/special/xsf/lambertw.h +0 -150
  749. scipy/special/xsf/loggamma.h +0 -163
  750. scipy/special/xsf/sici.h +0 -200
  751. scipy/special/xsf/tools.h +0 -427
  752. scipy/special/xsf/trig.h +0 -164
  753. scipy/special/xsf/wright_bessel.h +0 -843
  754. scipy/special/xsf/zlog1.h +0 -35
  755. scipy/stats/_mvn.cp313-win_amd64.dll.a +0 -0
  756. scipy/stats/_mvn.cp313-win_amd64.pyd +0 -0
  757. scipy-1.15.3.dist-info/DELVEWHEEL +0 -2
  758. /scipy-1.15.3-cp313-cp313-win_amd64.whl → /scipy-1.16.0rc2-cp313-cp313-win_amd64.whl +0 -0
  759. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
@@ -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