scipy 1.15.2__cp313-cp313t-musllinux_1_2_aarch64.whl → 1.16.0__cp313-cp313t-musllinux_1_2_aarch64.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 (651) hide show
  1. scipy/__config__.py +13 -13
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cpython-313t-aarch64-linux-musl.so +0 -0
  4. scipy/_lib/_array_api.py +497 -161
  5. scipy/_lib/_array_api_compat_vendor.py +9 -0
  6. scipy/_lib/_bunch.py +4 -0
  7. scipy/_lib/_ccallback_c.cpython-313t-aarch64-linux-musl.so +0 -0
  8. scipy/_lib/_docscrape.py +1 -1
  9. scipy/_lib/_elementwise_iterative_method.py +15 -26
  10. scipy/_lib/_fpumode.cpython-313t-aarch64-linux-musl.so +0 -0
  11. scipy/_lib/_sparse.py +41 -0
  12. scipy/_lib/_test_ccallback.cpython-313t-aarch64-linux-musl.so +0 -0
  13. scipy/_lib/_test_deprecation_call.cpython-313t-aarch64-linux-musl.so +0 -0
  14. scipy/_lib/_test_deprecation_def.cpython-313t-aarch64-linux-musl.so +0 -0
  15. scipy/_lib/_testutils.py +6 -2
  16. scipy/_lib/_uarray/_uarray.cpython-313t-aarch64-linux-musl.so +0 -0
  17. scipy/_lib/_util.py +222 -125
  18. scipy/_lib/array_api_compat/__init__.py +4 -4
  19. scipy/_lib/array_api_compat/_internal.py +19 -6
  20. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  21. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  22. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  23. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  24. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  25. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  26. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  27. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  28. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  29. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  30. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  31. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  32. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  33. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  34. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  35. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  36. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  37. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  38. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  39. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  40. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  41. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  42. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  43. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  44. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  45. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  46. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  47. scipy/_lib/array_api_extra/__init__.py +26 -3
  48. scipy/_lib/array_api_extra/_delegation.py +171 -0
  49. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  50. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  51. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  52. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  53. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  54. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  58. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  59. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  60. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  61. scipy/_lib/array_api_extra/testing.py +359 -0
  62. scipy/_lib/decorator.py +2 -2
  63. scipy/_lib/doccer.py +1 -7
  64. scipy/_lib/messagestream.cpython-313t-aarch64-linux-musl.so +0 -0
  65. scipy/_lib/pyprima/__init__.py +212 -0
  66. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  67. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  68. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  69. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  70. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  71. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  72. scipy/_lib/pyprima/cobyla/update.py +289 -0
  73. scipy/_lib/pyprima/common/__init__.py +0 -0
  74. scipy/_lib/pyprima/common/_bounds.py +34 -0
  75. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  76. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  77. scipy/_lib/pyprima/common/_project.py +173 -0
  78. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  79. scipy/_lib/pyprima/common/consts.py +47 -0
  80. scipy/_lib/pyprima/common/evaluate.py +99 -0
  81. scipy/_lib/pyprima/common/history.py +38 -0
  82. scipy/_lib/pyprima/common/infos.py +30 -0
  83. scipy/_lib/pyprima/common/linalg.py +435 -0
  84. scipy/_lib/pyprima/common/message.py +290 -0
  85. scipy/_lib/pyprima/common/powalg.py +131 -0
  86. scipy/_lib/pyprima/common/preproc.py +277 -0
  87. scipy/_lib/pyprima/common/present.py +5 -0
  88. scipy/_lib/pyprima/common/ratio.py +54 -0
  89. scipy/_lib/pyprima/common/redrho.py +47 -0
  90. scipy/_lib/pyprima/common/selectx.py +296 -0
  91. scipy/_lib/tests/test__util.py +105 -121
  92. scipy/_lib/tests/test_array_api.py +169 -34
  93. scipy/_lib/tests/test_bunch.py +7 -0
  94. scipy/_lib/tests/test_ccallback.py +2 -10
  95. scipy/_lib/tests/test_public_api.py +13 -0
  96. scipy/cluster/_hierarchy.cpython-313t-aarch64-linux-musl.so +0 -0
  97. scipy/cluster/_optimal_leaf_ordering.cpython-313t-aarch64-linux-musl.so +0 -0
  98. scipy/cluster/_vq.cpython-313t-aarch64-linux-musl.so +0 -0
  99. scipy/cluster/hierarchy.py +393 -223
  100. scipy/cluster/tests/test_hierarchy.py +273 -335
  101. scipy/cluster/tests/test_vq.py +45 -61
  102. scipy/cluster/vq.py +39 -35
  103. scipy/conftest.py +282 -151
  104. scipy/constants/_constants.py +4 -1
  105. scipy/constants/tests/test_codata.py +2 -2
  106. scipy/constants/tests/test_constants.py +11 -18
  107. scipy/datasets/_download_all.py +15 -1
  108. scipy/datasets/_fetchers.py +7 -1
  109. scipy/datasets/_utils.py +1 -1
  110. scipy/differentiate/_differentiate.py +25 -25
  111. scipy/differentiate/tests/test_differentiate.py +24 -25
  112. scipy/fft/_basic.py +20 -0
  113. scipy/fft/_helper.py +3 -34
  114. scipy/fft/_pocketfft/helper.py +29 -1
  115. scipy/fft/_pocketfft/pypocketfft.cpython-313t-aarch64-linux-musl.so +0 -0
  116. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  117. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  118. scipy/fft/_realtransforms.py +13 -0
  119. scipy/fft/tests/test_basic.py +27 -25
  120. scipy/fft/tests/test_fftlog.py +16 -7
  121. scipy/fft/tests/test_helper.py +18 -34
  122. scipy/fft/tests/test_real_transforms.py +8 -10
  123. scipy/fftpack/convolve.cpython-313t-aarch64-linux-musl.so +0 -0
  124. scipy/fftpack/tests/test_basic.py +2 -4
  125. scipy/fftpack/tests/test_real_transforms.py +8 -9
  126. scipy/integrate/_bvp.py +9 -3
  127. scipy/integrate/_cubature.py +3 -2
  128. scipy/integrate/_dop.cpython-313t-aarch64-linux-musl.so +0 -0
  129. scipy/integrate/_ivp/common.py +3 -3
  130. scipy/integrate/_ivp/ivp.py +9 -2
  131. scipy/integrate/_ivp/tests/test_ivp.py +19 -0
  132. scipy/integrate/_lsoda.cpython-313t-aarch64-linux-musl.so +0 -0
  133. scipy/integrate/_ode.py +9 -2
  134. scipy/integrate/_odepack.cpython-313t-aarch64-linux-musl.so +0 -0
  135. scipy/integrate/_quad_vec.py +21 -29
  136. scipy/integrate/_quadpack.cpython-313t-aarch64-linux-musl.so +0 -0
  137. scipy/integrate/_quadpack_py.py +11 -7
  138. scipy/integrate/_quadrature.py +3 -3
  139. scipy/integrate/_rules/_base.py +2 -2
  140. scipy/integrate/_tanhsinh.py +57 -54
  141. scipy/integrate/_test_multivariate.cpython-313t-aarch64-linux-musl.so +0 -0
  142. scipy/integrate/_test_odeint_banded.cpython-313t-aarch64-linux-musl.so +0 -0
  143. scipy/integrate/_vode.cpython-313t-aarch64-linux-musl.so +0 -0
  144. scipy/integrate/tests/test__quad_vec.py +0 -6
  145. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  146. scipy/integrate/tests/test_cubature.py +21 -35
  147. scipy/integrate/tests/test_quadrature.py +6 -8
  148. scipy/integrate/tests/test_tanhsinh.py +61 -43
  149. scipy/interpolate/__init__.py +70 -58
  150. scipy/interpolate/_bary_rational.py +22 -22
  151. scipy/interpolate/_bsplines.py +119 -66
  152. scipy/interpolate/_cubic.py +65 -50
  153. scipy/interpolate/_dfitpack.cpython-313t-aarch64-linux-musl.so +0 -0
  154. scipy/interpolate/_dierckx.cpython-313t-aarch64-linux-musl.so +0 -0
  155. scipy/interpolate/_fitpack.cpython-313t-aarch64-linux-musl.so +0 -0
  156. scipy/interpolate/_fitpack2.py +9 -6
  157. scipy/interpolate/_fitpack_impl.py +32 -26
  158. scipy/interpolate/_fitpack_repro.py +23 -19
  159. scipy/interpolate/_interpnd.cpython-313t-aarch64-linux-musl.so +0 -0
  160. scipy/interpolate/_interpolate.py +30 -12
  161. scipy/interpolate/_ndbspline.py +13 -18
  162. scipy/interpolate/_ndgriddata.py +5 -8
  163. scipy/interpolate/_polyint.py +95 -31
  164. scipy/interpolate/_ppoly.cpython-313t-aarch64-linux-musl.so +0 -0
  165. scipy/interpolate/_rbf.py +2 -2
  166. scipy/interpolate/_rbfinterp.py +1 -1
  167. scipy/interpolate/_rbfinterp_pythran.cpython-313t-aarch64-linux-musl.so +0 -0
  168. scipy/interpolate/_rgi.py +31 -26
  169. scipy/interpolate/_rgi_cython.cpython-313t-aarch64-linux-musl.so +0 -0
  170. scipy/interpolate/dfitpack.py +0 -20
  171. scipy/interpolate/interpnd.py +1 -2
  172. scipy/interpolate/tests/test_bary_rational.py +2 -2
  173. scipy/interpolate/tests/test_bsplines.py +97 -1
  174. scipy/interpolate/tests/test_fitpack2.py +39 -1
  175. scipy/interpolate/tests/test_interpnd.py +32 -20
  176. scipy/interpolate/tests/test_interpolate.py +48 -4
  177. scipy/interpolate/tests/test_rgi.py +2 -1
  178. scipy/io/_fast_matrix_market/__init__.py +2 -0
  179. scipy/io/_fast_matrix_market/_fmm_core.cpython-313t-aarch64-linux-musl.so +0 -0
  180. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  181. scipy/io/_harwell_boeing/hb.py +7 -11
  182. scipy/io/_idl.py +5 -7
  183. scipy/io/_netcdf.py +15 -5
  184. scipy/io/_test_fortran.cpython-313t-aarch64-linux-musl.so +0 -0
  185. scipy/io/arff/tests/test_arffread.py +3 -3
  186. scipy/io/matlab/__init__.py +5 -3
  187. scipy/io/matlab/_mio.py +4 -1
  188. scipy/io/matlab/_mio5.py +19 -13
  189. scipy/io/matlab/_mio5_utils.cpython-313t-aarch64-linux-musl.so +0 -0
  190. scipy/io/matlab/_mio_utils.cpython-313t-aarch64-linux-musl.so +0 -0
  191. scipy/io/matlab/_miobase.py +4 -1
  192. scipy/io/matlab/_streams.cpython-313t-aarch64-linux-musl.so +0 -0
  193. scipy/io/matlab/tests/test_mio.py +46 -18
  194. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  195. scipy/io/tests/test_mmio.py +7 -1
  196. scipy/io/tests/test_wavfile.py +41 -0
  197. scipy/io/wavfile.py +57 -10
  198. scipy/linalg/_basic.py +113 -86
  199. scipy/linalg/_cythonized_array_utils.cpython-313t-aarch64-linux-musl.so +0 -0
  200. scipy/linalg/_decomp.py +22 -9
  201. scipy/linalg/_decomp_cholesky.py +28 -13
  202. scipy/linalg/_decomp_cossin.py +45 -30
  203. scipy/linalg/_decomp_interpolative.cpython-313t-aarch64-linux-musl.so +0 -0
  204. scipy/linalg/_decomp_ldl.py +4 -1
  205. scipy/linalg/_decomp_lu.py +18 -6
  206. scipy/linalg/_decomp_lu_cython.cpython-313t-aarch64-linux-musl.so +0 -0
  207. scipy/linalg/_decomp_polar.py +2 -0
  208. scipy/linalg/_decomp_qr.py +6 -2
  209. scipy/linalg/_decomp_qz.py +3 -0
  210. scipy/linalg/_decomp_schur.py +3 -1
  211. scipy/linalg/_decomp_svd.py +13 -2
  212. scipy/linalg/_decomp_update.cpython-313t-aarch64-linux-musl.so +0 -0
  213. scipy/linalg/_expm_frechet.py +4 -0
  214. scipy/linalg/_fblas.cpython-313t-aarch64-linux-musl.so +0 -0
  215. scipy/linalg/_flapack.cpython-313t-aarch64-linux-musl.so +0 -0
  216. scipy/linalg/_linalg_pythran.cpython-313t-aarch64-linux-musl.so +0 -0
  217. scipy/linalg/_matfuncs.py +187 -4
  218. scipy/linalg/_matfuncs_expm.cpython-313t-aarch64-linux-musl.so +0 -0
  219. scipy/linalg/_matfuncs_schur_sqrtm.cpython-313t-aarch64-linux-musl.so +0 -0
  220. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  221. scipy/linalg/_matfuncs_sqrtm_triu.cpython-313t-aarch64-linux-musl.so +0 -0
  222. scipy/linalg/_procrustes.py +2 -0
  223. scipy/linalg/_sketches.py +17 -6
  224. scipy/linalg/_solve_toeplitz.cpython-313t-aarch64-linux-musl.so +0 -0
  225. scipy/linalg/_solvers.py +7 -2
  226. scipy/linalg/_special_matrices.py +26 -36
  227. scipy/linalg/blas.py +35 -24
  228. scipy/linalg/cython_blas.cpython-313t-aarch64-linux-musl.so +0 -0
  229. scipy/linalg/cython_lapack.cpython-313t-aarch64-linux-musl.so +0 -0
  230. scipy/linalg/lapack.py +22 -2
  231. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  232. scipy/linalg/tests/test_basic.py +31 -16
  233. scipy/linalg/tests/test_batch.py +588 -0
  234. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  235. scipy/linalg/tests/test_decomp.py +40 -3
  236. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  237. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  238. scipy/linalg/tests/test_interpolative.py +17 -0
  239. scipy/linalg/tests/test_lapack.py +115 -7
  240. scipy/linalg/tests/test_matfuncs.py +157 -102
  241. scipy/linalg/tests/test_procrustes.py +0 -7
  242. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  243. scipy/linalg/tests/test_special_matrices.py +1 -5
  244. scipy/ndimage/__init__.py +1 -0
  245. scipy/ndimage/_ctest.cpython-313t-aarch64-linux-musl.so +0 -0
  246. scipy/ndimage/_cytest.cpython-313t-aarch64-linux-musl.so +0 -0
  247. scipy/ndimage/_delegators.py +8 -2
  248. scipy/ndimage/_filters.py +453 -5
  249. scipy/ndimage/_interpolation.py +36 -6
  250. scipy/ndimage/_measurements.py +4 -2
  251. scipy/ndimage/_morphology.py +5 -0
  252. scipy/ndimage/_nd_image.cpython-313t-aarch64-linux-musl.so +0 -0
  253. scipy/ndimage/_ndimage_api.py +2 -1
  254. scipy/ndimage/_ni_docstrings.py +5 -1
  255. scipy/ndimage/_ni_label.cpython-313t-aarch64-linux-musl.so +0 -0
  256. scipy/ndimage/_ni_support.py +1 -5
  257. scipy/ndimage/_rank_filter_1d.cpython-313t-aarch64-linux-musl.so +0 -0
  258. scipy/ndimage/_support_alternative_backends.py +18 -6
  259. scipy/ndimage/tests/test_filters.py +384 -259
  260. scipy/ndimage/tests/test_fourier.py +7 -9
  261. scipy/ndimage/tests/test_interpolation.py +68 -61
  262. scipy/ndimage/tests/test_measurements.py +18 -35
  263. scipy/ndimage/tests/test_morphology.py +143 -131
  264. scipy/ndimage/tests/test_splines.py +1 -3
  265. scipy/odr/__odrpack.cpython-313t-aarch64-linux-musl.so +0 -0
  266. scipy/optimize/_basinhopping.py +13 -7
  267. scipy/optimize/_bglu_dense.cpython-313t-aarch64-linux-musl.so +0 -0
  268. scipy/optimize/_bracket.py +46 -26
  269. scipy/optimize/_chandrupatla.py +9 -10
  270. scipy/optimize/_cobyla_py.py +104 -123
  271. scipy/optimize/_constraints.py +14 -10
  272. scipy/optimize/_differentiable_functions.py +371 -230
  273. scipy/optimize/_differentialevolution.py +4 -3
  274. scipy/optimize/_direct.cpython-313t-aarch64-linux-musl.so +0 -0
  275. scipy/optimize/_dual_annealing.py +1 -1
  276. scipy/optimize/_elementwise.py +1 -4
  277. scipy/optimize/_group_columns.cpython-313t-aarch64-linux-musl.so +0 -0
  278. scipy/optimize/_highspy/_core.cpython-313t-aarch64-linux-musl.so +0 -0
  279. scipy/optimize/_highspy/_highs_options.cpython-313t-aarch64-linux-musl.so +0 -0
  280. scipy/optimize/_highspy/_highs_wrapper.py +6 -4
  281. scipy/optimize/_lbfgsb.cpython-313t-aarch64-linux-musl.so +0 -0
  282. scipy/optimize/_lbfgsb_py.py +80 -24
  283. scipy/optimize/_linprog_doc.py +2 -2
  284. scipy/optimize/_linprog_highs.py +11 -11
  285. scipy/optimize/_linprog_ip.py +25 -10
  286. scipy/optimize/_linprog_util.py +18 -19
  287. scipy/optimize/_lsap.cpython-313t-aarch64-linux-musl.so +0 -0
  288. scipy/optimize/_lsq/common.py +3 -3
  289. scipy/optimize/_lsq/dogbox.py +16 -2
  290. scipy/optimize/_lsq/givens_elimination.cpython-313t-aarch64-linux-musl.so +0 -0
  291. scipy/optimize/_lsq/least_squares.py +198 -126
  292. scipy/optimize/_lsq/lsq_linear.py +6 -6
  293. scipy/optimize/_lsq/trf.py +35 -8
  294. scipy/optimize/_milp.py +3 -1
  295. scipy/optimize/_minimize.py +105 -36
  296. scipy/optimize/_minpack.cpython-313t-aarch64-linux-musl.so +0 -0
  297. scipy/optimize/_minpack_py.py +21 -14
  298. scipy/optimize/_moduleTNC.cpython-313t-aarch64-linux-musl.so +0 -0
  299. scipy/optimize/_nnls.py +20 -21
  300. scipy/optimize/_nonlin.py +34 -3
  301. scipy/optimize/_numdiff.py +288 -110
  302. scipy/optimize/_optimize.py +86 -48
  303. scipy/optimize/_pava_pybind.cpython-313t-aarch64-linux-musl.so +0 -0
  304. scipy/optimize/_remove_redundancy.py +5 -5
  305. scipy/optimize/_root_scalar.py +1 -1
  306. scipy/optimize/_shgo.py +6 -0
  307. scipy/optimize/_shgo_lib/_complex.py +1 -1
  308. scipy/optimize/_slsqp_py.py +216 -124
  309. scipy/optimize/_slsqplib.cpython-313t-aarch64-linux-musl.so +0 -0
  310. scipy/optimize/_spectral.py +1 -1
  311. scipy/optimize/_tnc.py +8 -1
  312. scipy/optimize/_trlib/_trlib.cpython-313t-aarch64-linux-musl.so +0 -0
  313. scipy/optimize/_trustregion.py +20 -6
  314. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  315. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  316. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  317. scipy/optimize/_trustregion_constr/projections.py +12 -8
  318. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  319. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  320. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  321. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  322. scipy/optimize/_trustregion_exact.py +0 -1
  323. scipy/optimize/_zeros.cpython-313t-aarch64-linux-musl.so +0 -0
  324. scipy/optimize/_zeros_py.py +97 -17
  325. scipy/optimize/cython_optimize/_zeros.cpython-313t-aarch64-linux-musl.so +0 -0
  326. scipy/optimize/slsqp.py +0 -1
  327. scipy/optimize/tests/test__basinhopping.py +1 -1
  328. scipy/optimize/tests/test__differential_evolution.py +4 -4
  329. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  330. scipy/optimize/tests/test__numdiff.py +66 -22
  331. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  332. scipy/optimize/tests/test__shgo.py +9 -1
  333. scipy/optimize/tests/test_bracket.py +71 -46
  334. scipy/optimize/tests/test_chandrupatla.py +133 -135
  335. scipy/optimize/tests/test_cobyla.py +74 -45
  336. scipy/optimize/tests/test_constraints.py +1 -1
  337. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  338. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  339. scipy/optimize/tests/test_least_squares.py +125 -13
  340. scipy/optimize/tests/test_linear_assignment.py +3 -3
  341. scipy/optimize/tests/test_linprog.py +3 -3
  342. scipy/optimize/tests/test_lsq_linear.py +6 -6
  343. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  344. scipy/optimize/tests/test_minpack.py +4 -4
  345. scipy/optimize/tests/test_nnls.py +43 -3
  346. scipy/optimize/tests/test_nonlin.py +36 -0
  347. scipy/optimize/tests/test_optimize.py +98 -20
  348. scipy/optimize/tests/test_slsqp.py +36 -4
  349. scipy/optimize/tests/test_zeros.py +34 -1
  350. scipy/signal/__init__.py +12 -23
  351. scipy/signal/_delegators.py +568 -0
  352. scipy/signal/_filter_design.py +459 -241
  353. scipy/signal/_fir_filter_design.py +262 -90
  354. scipy/signal/_lti_conversion.py +3 -2
  355. scipy/signal/_ltisys.py +118 -91
  356. scipy/signal/_max_len_seq_inner.cpython-313t-aarch64-linux-musl.so +0 -0
  357. scipy/signal/_peak_finding_utils.cpython-313t-aarch64-linux-musl.so +0 -0
  358. scipy/signal/_polyutils.py +172 -0
  359. scipy/signal/_short_time_fft.py +553 -76
  360. scipy/signal/_signal_api.py +30 -0
  361. scipy/signal/_signaltools.py +719 -396
  362. scipy/signal/_sigtools.cpython-313t-aarch64-linux-musl.so +0 -0
  363. scipy/signal/_sosfilt.cpython-313t-aarch64-linux-musl.so +0 -0
  364. scipy/signal/_spectral_py.py +230 -50
  365. scipy/signal/_spline.cpython-313t-aarch64-linux-musl.so +0 -0
  366. scipy/signal/_spline_filters.py +108 -68
  367. scipy/signal/_support_alternative_backends.py +73 -0
  368. scipy/signal/_upfirdn.py +4 -1
  369. scipy/signal/_upfirdn_apply.cpython-313t-aarch64-linux-musl.so +0 -0
  370. scipy/signal/_waveforms.py +2 -11
  371. scipy/signal/_wavelets.py +1 -1
  372. scipy/signal/fir_filter_design.py +1 -0
  373. scipy/signal/spline.py +4 -11
  374. scipy/signal/tests/_scipy_spectral_test_shim.py +5 -182
  375. scipy/signal/tests/test_bsplines.py +114 -79
  376. scipy/signal/tests/test_cont2discrete.py +9 -2
  377. scipy/signal/tests/test_filter_design.py +721 -481
  378. scipy/signal/tests/test_fir_filter_design.py +332 -140
  379. scipy/signal/tests/test_savitzky_golay.py +4 -3
  380. scipy/signal/tests/test_short_time_fft.py +231 -5
  381. scipy/signal/tests/test_signaltools.py +2150 -1349
  382. scipy/signal/tests/test_spectral.py +50 -6
  383. scipy/signal/tests/test_splines.py +161 -96
  384. scipy/signal/tests/test_upfirdn.py +84 -50
  385. scipy/signal/tests/test_waveforms.py +20 -0
  386. scipy/signal/tests/test_windows.py +607 -466
  387. scipy/signal/windows/_windows.py +287 -148
  388. scipy/sparse/__init__.py +23 -4
  389. scipy/sparse/_base.py +269 -120
  390. scipy/sparse/_bsr.py +7 -4
  391. scipy/sparse/_compressed.py +59 -234
  392. scipy/sparse/_construct.py +90 -38
  393. scipy/sparse/_coo.py +115 -181
  394. scipy/sparse/_csc.py +4 -4
  395. scipy/sparse/_csparsetools.cpython-313t-aarch64-linux-musl.so +0 -0
  396. scipy/sparse/_csr.py +2 -2
  397. scipy/sparse/_data.py +48 -48
  398. scipy/sparse/_dia.py +105 -21
  399. scipy/sparse/_dok.py +0 -23
  400. scipy/sparse/_index.py +4 -4
  401. scipy/sparse/_matrix.py +23 -0
  402. scipy/sparse/_sparsetools.cpython-313t-aarch64-linux-musl.so +0 -0
  403. scipy/sparse/_sputils.py +37 -22
  404. scipy/sparse/base.py +0 -9
  405. scipy/sparse/bsr.py +0 -14
  406. scipy/sparse/compressed.py +0 -23
  407. scipy/sparse/construct.py +0 -6
  408. scipy/sparse/coo.py +0 -14
  409. scipy/sparse/csc.py +0 -3
  410. scipy/sparse/csgraph/_flow.cpython-313t-aarch64-linux-musl.so +0 -0
  411. scipy/sparse/csgraph/_matching.cpython-313t-aarch64-linux-musl.so +0 -0
  412. scipy/sparse/csgraph/_min_spanning_tree.cpython-313t-aarch64-linux-musl.so +0 -0
  413. scipy/sparse/csgraph/_reordering.cpython-313t-aarch64-linux-musl.so +0 -0
  414. scipy/sparse/csgraph/_shortest_path.cpython-313t-aarch64-linux-musl.so +0 -0
  415. scipy/sparse/csgraph/_tools.cpython-313t-aarch64-linux-musl.so +0 -0
  416. scipy/sparse/csgraph/_traversal.cpython-313t-aarch64-linux-musl.so +0 -0
  417. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  418. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  419. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  420. scipy/sparse/csr.py +0 -5
  421. scipy/sparse/data.py +1 -6
  422. scipy/sparse/dia.py +0 -7
  423. scipy/sparse/dok.py +0 -10
  424. scipy/sparse/linalg/_dsolve/_superlu.cpython-313t-aarch64-linux-musl.so +0 -0
  425. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  426. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  427. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313t-aarch64-linux-musl.so +0 -0
  428. scipy/sparse/linalg/_eigen/arpack/arpack.py +28 -20
  429. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  430. scipy/sparse/linalg/_expm_multiply.py +8 -3
  431. scipy/sparse/linalg/_interface.py +29 -26
  432. scipy/sparse/linalg/_isolve/_gcrotmk.py +6 -5
  433. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  434. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  435. scipy/sparse/linalg/_isolve/minres.py +5 -5
  436. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  437. scipy/sparse/linalg/_isolve/utils.py +2 -8
  438. scipy/sparse/linalg/_matfuncs.py +1 -1
  439. scipy/sparse/linalg/_norm.py +1 -1
  440. scipy/sparse/linalg/_propack/_cpropack.cpython-313t-aarch64-linux-musl.so +0 -0
  441. scipy/sparse/linalg/_propack/_dpropack.cpython-313t-aarch64-linux-musl.so +0 -0
  442. scipy/sparse/linalg/_propack/_spropack.cpython-313t-aarch64-linux-musl.so +0 -0
  443. scipy/sparse/linalg/_propack/_zpropack.cpython-313t-aarch64-linux-musl.so +0 -0
  444. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  445. scipy/sparse/linalg/tests/test_expm_multiply.py +10 -0
  446. scipy/sparse/linalg/tests/test_interface.py +35 -0
  447. scipy/sparse/linalg/tests/test_pydata_sparse.py +18 -0
  448. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  449. scipy/sparse/tests/test_base.py +224 -40
  450. scipy/sparse/tests/test_common1d.py +17 -12
  451. scipy/sparse/tests/test_construct.py +1 -1
  452. scipy/sparse/tests/test_coo.py +272 -4
  453. scipy/sparse/tests/test_sparsetools.py +5 -0
  454. scipy/sparse/tests/test_sputils.py +36 -7
  455. scipy/spatial/_ckdtree.cpython-313t-aarch64-linux-musl.so +0 -0
  456. scipy/spatial/_distance_pybind.cpython-313t-aarch64-linux-musl.so +0 -0
  457. scipy/spatial/_distance_wrap.cpython-313t-aarch64-linux-musl.so +0 -0
  458. scipy/spatial/_hausdorff.cpython-313t-aarch64-linux-musl.so +0 -0
  459. scipy/spatial/_qhull.cpython-313t-aarch64-linux-musl.so +0 -0
  460. scipy/spatial/_voronoi.cpython-313t-aarch64-linux-musl.so +0 -0
  461. scipy/spatial/distance.py +49 -42
  462. scipy/spatial/tests/test_distance.py +15 -1
  463. scipy/spatial/tests/test_kdtree.py +1 -0
  464. scipy/spatial/tests/test_qhull.py +106 -2
  465. scipy/spatial/transform/__init__.py +5 -3
  466. scipy/spatial/transform/_rigid_transform.cpython-313t-aarch64-linux-musl.so +0 -0
  467. scipy/spatial/transform/_rotation.cpython-313t-aarch64-linux-musl.so +0 -0
  468. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  469. scipy/spatial/transform/tests/test_rotation.py +1342 -790
  470. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  471. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  472. scipy/special/__init__.py +1 -47
  473. scipy/special/_add_newdocs.py +34 -772
  474. scipy/special/_basic.py +22 -25
  475. scipy/special/_comb.cpython-313t-aarch64-linux-musl.so +0 -0
  476. scipy/special/_ellip_harm_2.cpython-313t-aarch64-linux-musl.so +0 -0
  477. scipy/special/_gufuncs.cpython-313t-aarch64-linux-musl.so +0 -0
  478. scipy/special/_logsumexp.py +83 -69
  479. scipy/special/_orthogonal.pyi +1 -1
  480. scipy/special/_specfun.cpython-313t-aarch64-linux-musl.so +0 -0
  481. scipy/special/_special_ufuncs.cpython-313t-aarch64-linux-musl.so +0 -0
  482. scipy/special/_spherical_bessel.py +4 -4
  483. scipy/special/_support_alternative_backends.py +212 -119
  484. scipy/special/_test_internal.cpython-313t-aarch64-linux-musl.so +0 -0
  485. scipy/special/_testutils.py +4 -4
  486. scipy/special/_ufuncs.cpython-313t-aarch64-linux-musl.so +0 -0
  487. scipy/special/_ufuncs.pyi +1 -0
  488. scipy/special/_ufuncs.pyx +215 -1400
  489. scipy/special/_ufuncs_cxx.cpython-313t-aarch64-linux-musl.so +0 -0
  490. scipy/special/_ufuncs_cxx.pxd +2 -15
  491. scipy/special/_ufuncs_cxx.pyx +5 -44
  492. scipy/special/_ufuncs_cxx_defs.h +2 -16
  493. scipy/special/_ufuncs_defs.h +0 -8
  494. scipy/special/cython_special.cpython-313t-aarch64-linux-musl.so +0 -0
  495. scipy/special/cython_special.pxd +1 -1
  496. scipy/special/tests/_cython_examples/meson.build +10 -1
  497. scipy/special/tests/test_basic.py +153 -20
  498. scipy/special/tests/test_boost_ufuncs.py +3 -0
  499. scipy/special/tests/test_cdflib.py +35 -11
  500. scipy/special/tests/test_gammainc.py +16 -0
  501. scipy/special/tests/test_hyp2f1.py +23 -2
  502. scipy/special/tests/test_log1mexp.py +85 -0
  503. scipy/special/tests/test_logsumexp.py +220 -64
  504. scipy/special/tests/test_mpmath.py +1 -0
  505. scipy/special/tests/test_nan_inputs.py +1 -1
  506. scipy/special/tests/test_orthogonal.py +17 -18
  507. scipy/special/tests/test_sf_error.py +3 -2
  508. scipy/special/tests/test_sph_harm.py +6 -7
  509. scipy/special/tests/test_support_alternative_backends.py +211 -76
  510. scipy/stats/__init__.py +4 -1
  511. scipy/stats/_ansari_swilk_statistics.cpython-313t-aarch64-linux-musl.so +0 -0
  512. scipy/stats/_axis_nan_policy.py +5 -12
  513. scipy/stats/_biasedurn.cpython-313t-aarch64-linux-musl.so +0 -0
  514. scipy/stats/_continued_fraction.py +387 -0
  515. scipy/stats/_continuous_distns.py +296 -319
  516. scipy/stats/_correlation.py +1 -1
  517. scipy/stats/_covariance.py +6 -3
  518. scipy/stats/_discrete_distns.py +39 -32
  519. scipy/stats/_distn_infrastructure.py +39 -12
  520. scipy/stats/_distribution_infrastructure.py +920 -238
  521. scipy/stats/_entropy.py +9 -10
  522. scipy/{_lib → stats}/_finite_differences.py +1 -1
  523. scipy/stats/_hypotests.py +83 -50
  524. scipy/stats/_kde.py +53 -49
  525. scipy/stats/_ksstats.py +1 -1
  526. scipy/stats/_levy_stable/__init__.py +7 -15
  527. scipy/stats/_levy_stable/levyst.cpython-313t-aarch64-linux-musl.so +0 -0
  528. scipy/stats/_morestats.py +118 -73
  529. scipy/stats/_mstats_basic.py +13 -17
  530. scipy/stats/_mstats_extras.py +8 -8
  531. scipy/stats/_multivariate.py +89 -113
  532. scipy/stats/_new_distributions.py +97 -20
  533. scipy/stats/_page_trend_test.py +12 -5
  534. scipy/stats/_probability_distribution.py +265 -43
  535. scipy/stats/_qmc.py +14 -9
  536. scipy/stats/_qmc_cy.cpython-313t-aarch64-linux-musl.so +0 -0
  537. scipy/stats/_qmvnt.py +16 -95
  538. scipy/stats/_qmvnt_cy.cpython-313t-aarch64-linux-musl.so +0 -0
  539. scipy/stats/_quantile.py +335 -0
  540. scipy/stats/_rcont/rcont.cpython-313t-aarch64-linux-musl.so +0 -0
  541. scipy/stats/_resampling.py +5 -30
  542. scipy/stats/_sampling.py +1 -1
  543. scipy/stats/_sobol.cpython-313t-aarch64-linux-musl.so +0 -0
  544. scipy/stats/_stats.cpython-313t-aarch64-linux-musl.so +0 -0
  545. scipy/stats/_stats_mstats_common.py +21 -2
  546. scipy/stats/_stats_py.py +551 -477
  547. scipy/stats/_stats_pythran.cpython-313t-aarch64-linux-musl.so +0 -0
  548. scipy/stats/_unuran/unuran_wrapper.cpython-313t-aarch64-linux-musl.so +0 -0
  549. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  550. scipy/stats/_variation.py +6 -8
  551. scipy/stats/_wilcoxon.py +13 -7
  552. scipy/stats/tests/common_tests.py +6 -4
  553. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  554. scipy/stats/tests/test_continued_fraction.py +173 -0
  555. scipy/stats/tests/test_continuous.py +379 -60
  556. scipy/stats/tests/test_continuous_basic.py +18 -12
  557. scipy/stats/tests/test_discrete_basic.py +14 -8
  558. scipy/stats/tests/test_discrete_distns.py +16 -16
  559. scipy/stats/tests/test_distributions.py +117 -75
  560. scipy/stats/tests/test_entropy.py +40 -48
  561. scipy/stats/tests/test_fit.py +4 -3
  562. scipy/stats/tests/test_hypotests.py +153 -24
  563. scipy/stats/tests/test_kdeoth.py +109 -41
  564. scipy/stats/tests/test_marray.py +289 -0
  565. scipy/stats/tests/test_morestats.py +81 -49
  566. scipy/stats/tests/test_mstats_basic.py +3 -3
  567. scipy/stats/tests/test_multivariate.py +434 -83
  568. scipy/stats/tests/test_qmc.py +13 -10
  569. scipy/stats/tests/test_quantile.py +199 -0
  570. scipy/stats/tests/test_rank.py +119 -112
  571. scipy/stats/tests/test_resampling.py +47 -56
  572. scipy/stats/tests/test_sampling.py +9 -4
  573. scipy/stats/tests/test_stats.py +799 -939
  574. scipy/stats/tests/test_variation.py +8 -6
  575. scipy/version.py +2 -2
  576. {scipy-1.15.2.dist-info → scipy-1.16.0.dist-info}/LICENSE.txt +4 -4
  577. {scipy-1.15.2.dist-info → scipy-1.16.0.dist-info}/METADATA +12 -12
  578. {scipy-1.15.2.dist-info → scipy-1.16.0.dist-info}/RECORD +1316 -1323
  579. scipy.libs/libgcc_s-2d945d6c.so.1 +0 -0
  580. scipy.libs/libgfortran-67378ab2.so.5.0.0 +0 -0
  581. scipy.libs/{libstdc++-1b614e01.so.6.0.32 → libstdc++-85f2cd6d.so.6.0.33} +0 -0
  582. scipy/_lib/array_api_extra/_funcs.py +0 -484
  583. scipy/_lib/array_api_extra/_typing.py +0 -8
  584. scipy/interpolate/_bspl.cpython-313t-aarch64-linux-musl.so +0 -0
  585. scipy/optimize/_cobyla.cpython-313t-aarch64-linux-musl.so +0 -0
  586. scipy/optimize/_cython_nnls.cpython-313t-aarch64-linux-musl.so +0 -0
  587. scipy/optimize/_slsqp.cpython-313t-aarch64-linux-musl.so +0 -0
  588. scipy/spatial/qhull_src/COPYING.txt +0 -38
  589. scipy/special/libsf_error_state.so +0 -0
  590. scipy/special/tests/test_log_softmax.py +0 -109
  591. scipy/special/tests/test_xsf_cuda.py +0 -114
  592. scipy/special/xsf/binom.h +0 -89
  593. scipy/special/xsf/cdflib.h +0 -100
  594. scipy/special/xsf/cephes/airy.h +0 -307
  595. scipy/special/xsf/cephes/besselpoly.h +0 -51
  596. scipy/special/xsf/cephes/beta.h +0 -257
  597. scipy/special/xsf/cephes/cbrt.h +0 -131
  598. scipy/special/xsf/cephes/chbevl.h +0 -85
  599. scipy/special/xsf/cephes/chdtr.h +0 -193
  600. scipy/special/xsf/cephes/const.h +0 -87
  601. scipy/special/xsf/cephes/ellie.h +0 -293
  602. scipy/special/xsf/cephes/ellik.h +0 -251
  603. scipy/special/xsf/cephes/ellpe.h +0 -107
  604. scipy/special/xsf/cephes/ellpk.h +0 -117
  605. scipy/special/xsf/cephes/expn.h +0 -260
  606. scipy/special/xsf/cephes/gamma.h +0 -398
  607. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  608. scipy/special/xsf/cephes/hyperg.h +0 -361
  609. scipy/special/xsf/cephes/i0.h +0 -149
  610. scipy/special/xsf/cephes/i1.h +0 -158
  611. scipy/special/xsf/cephes/igam.h +0 -421
  612. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  613. scipy/special/xsf/cephes/igami.h +0 -313
  614. scipy/special/xsf/cephes/j0.h +0 -225
  615. scipy/special/xsf/cephes/j1.h +0 -198
  616. scipy/special/xsf/cephes/jv.h +0 -715
  617. scipy/special/xsf/cephes/k0.h +0 -164
  618. scipy/special/xsf/cephes/k1.h +0 -163
  619. scipy/special/xsf/cephes/kn.h +0 -243
  620. scipy/special/xsf/cephes/lanczos.h +0 -112
  621. scipy/special/xsf/cephes/ndtr.h +0 -275
  622. scipy/special/xsf/cephes/poch.h +0 -85
  623. scipy/special/xsf/cephes/polevl.h +0 -167
  624. scipy/special/xsf/cephes/psi.h +0 -194
  625. scipy/special/xsf/cephes/rgamma.h +0 -111
  626. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  627. scipy/special/xsf/cephes/shichi.h +0 -248
  628. scipy/special/xsf/cephes/sici.h +0 -224
  629. scipy/special/xsf/cephes/sindg.h +0 -221
  630. scipy/special/xsf/cephes/tandg.h +0 -139
  631. scipy/special/xsf/cephes/trig.h +0 -58
  632. scipy/special/xsf/cephes/unity.h +0 -186
  633. scipy/special/xsf/cephes/zeta.h +0 -172
  634. scipy/special/xsf/config.h +0 -304
  635. scipy/special/xsf/digamma.h +0 -205
  636. scipy/special/xsf/error.h +0 -57
  637. scipy/special/xsf/evalpoly.h +0 -47
  638. scipy/special/xsf/expint.h +0 -266
  639. scipy/special/xsf/hyp2f1.h +0 -694
  640. scipy/special/xsf/iv_ratio.h +0 -173
  641. scipy/special/xsf/lambertw.h +0 -150
  642. scipy/special/xsf/loggamma.h +0 -163
  643. scipy/special/xsf/sici.h +0 -200
  644. scipy/special/xsf/tools.h +0 -427
  645. scipy/special/xsf/trig.h +0 -164
  646. scipy/special/xsf/wright_bessel.h +0 -843
  647. scipy/special/xsf/zlog1.h +0 -35
  648. scipy/stats/_mvn.cpython-313t-aarch64-linux-musl.so +0 -0
  649. scipy.libs/libgcc_s-7393e603.so.1 +0 -0
  650. scipy.libs/libgfortran-eb933d8e.so.5.0.0 +0 -0
  651. {scipy-1.15.2.dist-info → scipy-1.16.0.dist-info}/WHEEL +0 -0
@@ -1,8 +1,9 @@
1
+ import math
1
2
  import numpy as np
2
- from numpy.testing import assert_equal
3
+ from numpy.testing import assert_equal, assert_allclose, suppress_warnings
3
4
  import pytest
4
5
  from scipy.linalg import block_diag
5
- from scipy.sparse import coo_array, random_array
6
+ from scipy.sparse import coo_array, random_array, SparseEfficiencyWarning
6
7
  from .._coo import _block_diag, _extract_block_diag
7
8
 
8
9
 
@@ -563,8 +564,7 @@ def test_nd_add_sparse_with_inconsistent_shapes(a_shape, b_shape):
563
564
 
564
565
  arr_a = random_array((a_shape), density=0.6, rng=rng, dtype=int)
565
566
  arr_b = random_array((b_shape), density=0.6, rng=rng, dtype=int)
566
- with pytest.raises(ValueError,
567
- match="(Incompatible|inconsistent) shapes|cannot be broadcast"):
567
+ with pytest.raises(ValueError, match="inconsistent shapes"):
568
568
  arr_a + arr_b
569
569
 
570
570
 
@@ -849,3 +849,271 @@ def test_extract_block_diag(shape):
849
849
  res = _extract_block_diag(_block_diag(sp_x), shape)
850
850
 
851
851
  assert_equal(res.toarray(), sp_x.toarray())
852
+
853
+
854
+ add_sub_shapes = [
855
+ ((3,4), (3,4)), ((3,4,6), (3,4,6)), ((3,7,5), (3,7,5))
856
+ ]
857
+ @pytest.mark.parametrize(('a_shape', 'b_shape'), add_sub_shapes)
858
+ def test_add_no_broadcasting(a_shape, b_shape):
859
+ rng = np.random.default_rng(23409823)
860
+ a = random_array(a_shape, density=0.6, random_state=rng, dtype=int)
861
+ b = random_array(b_shape, density=0.6, random_state=rng, dtype=int)
862
+
863
+ res = a + b
864
+ exp = np.add(a.toarray(), b.toarray())
865
+ assert_equal(res.toarray(), exp)
866
+ res = a + b.toarray()
867
+ assert_equal(res, exp)
868
+
869
+ @pytest.mark.parametrize(('a_shape', 'b_shape'), add_sub_shapes)
870
+ def test_sub_no_broadcasting(a_shape, b_shape):
871
+ rng = np.random.default_rng(23409823)
872
+ a = random_array(a_shape, density=0.6, random_state=rng, dtype=int)
873
+ b = random_array(b_shape, density=0.6, random_state=rng, dtype=int)
874
+
875
+ res = a - b
876
+ exp = np.subtract(a.toarray(), b.toarray())
877
+ assert_equal(res.toarray(), exp)
878
+
879
+ res = a - b.toarray()
880
+ assert_equal(res, exp)
881
+
882
+ argmax_argmin_shapes_axis = [
883
+ ((3,), None), ((3,), 0),
884
+ ((4,6), 1), ((7,3), 0), ((3,5), None),
885
+ ((2,8,7), 2), ((2,8,7), 0),
886
+ ((2,0), 0), ((3,0,0,2), 0),
887
+ ((3,2,4,7), None), ((3,2,4,7), 1), ((3,2,4,7), 0), ((3,2,4,7), 2),
888
+ ((3,2,4,7), -2), ((4,5,7,8,2), 4), ((4,5,7,8,2), -3),
889
+ ]
890
+ @pytest.mark.parametrize(('shape', 'axis'), argmax_argmin_shapes_axis)
891
+ def test_argmax_argmin(shape, axis):
892
+ rng = np.random.default_rng(23409823)
893
+ a = random_array(shape, density=0.6, random_state=rng, dtype=int)
894
+
895
+ res = a.argmax(axis=axis)
896
+ exp = np.argmax(a.toarray(), axis=axis)
897
+ assert_equal(res, exp)
898
+
899
+ res = a.argmin(axis=axis)
900
+ exp = np.argmin(a.toarray(), axis=axis)
901
+ assert_equal(res, exp)
902
+
903
+
904
+ max_min_shapes_axis = [
905
+ ((3,), None), ((3,), 0),
906
+ ((4,6), 1), ((7,3), 0), ((3,5), None),
907
+ ((2,8,7), 2), ((2,8,7), 0),
908
+ ((3,2,4,7), None), ((3,2,4,7), 1), ((3,2,4,7), 0), ((3,2,4,7), 2),
909
+ ((4,5,7,8,2), 4), ((4,5,8,1), 3), ((4,6), (0,)), ((4,6), (0,1)),
910
+ ((3,0,2), 2), ((3,0,2), (0,2)), ((3,0), 0),
911
+ ((3,7,8,5), (0,1)), ((3,7,8,5), (2,1)), ((3,7,8,5), (2,0)),
912
+ ((3,7,8,5), (0,-2)), ((3,7,8,5), (-1,2)), ((3,7,8,5), (3)),
913
+ ((3,7,8,5), (0,1,2)), ((3,7,8,5), (0,1,2,3)),
914
+ ]
915
+ @pytest.mark.parametrize(('shape', 'axis'), max_min_shapes_axis)
916
+ def test_min_max(shape, axis):
917
+ rng = np.random.default_rng(23409823)
918
+ a = random_array(shape, density=0.6, random_state=rng, dtype=int)
919
+
920
+ res_min = a.min(axis=axis)
921
+ exp_min = np.min(a.toarray(), axis=axis)
922
+ res_max = a.max(axis=axis)
923
+ exp_max = np.max(a.toarray(), axis=axis)
924
+ res_nanmin = a.nanmin(axis=axis)
925
+ exp_nanmin = np.nanmin(a.toarray(), axis=axis)
926
+ res_nanmax = a.nanmax(axis=axis)
927
+ exp_nanmax = np.nanmax(a.toarray(), axis=axis)
928
+
929
+ for res, exp in [(res_min, exp_min), (res_max, exp_max),
930
+ (res_nanmin, exp_nanmin), (res_nanmax, exp_nanmax)]:
931
+ if np.issubdtype(type(res), np.number):
932
+ assert_equal(res, exp)
933
+ else:
934
+ assert_equal(res.toarray(), exp)
935
+
936
+
937
+ def test_min_max_full():
938
+ for a in (coo_array([[[1, 2, 3, 4]]]), coo_array([[1, 2, 3, 4]])):
939
+ assert a.min() == 1
940
+ assert (-a).max() == -1
941
+
942
+
943
+ sum_mean_params = [
944
+ ((3,), None, None), ((3,), 0, None),
945
+ ((4,6), 1, None), ((7,3), 0, None), ((3,5), None, None),
946
+ ((2,8,7), 2, None), ((2,8,7), 0, np.zeros((8,7))),
947
+ ((3,2,4,7), None, None), ((3,2,4,7), 1, np.zeros((3,4,7))),
948
+ ((3,2,4,7), 0, None), ((4,5,7,8,2), 4, None),
949
+ ((4,5,8,1), 3, None), ((4,6), (0,), None), ((4,6), (0,1), None),
950
+ ((3,0,2), 2, None), ((3,0,2), (0,2), None), ((3,0), 0, None),
951
+ ((3,7,8,5), (0,1), np.zeros((8,5))), ((3,7,8,5), (2,1), None),
952
+ ((3,7,8,5), (0,-2), None), ((3,7,8,5), (-1,2), np.zeros((3,7))),
953
+ ((3,7,8,5), (3), None), ((3,7,8,5), (0,1,2), np.zeros((5,))),
954
+ ((3,7,8,5), (0,1,2,3), None),
955
+ ]
956
+ @pytest.mark.parametrize(('shape', 'axis', 'out'), sum_mean_params)
957
+ def test_sum(shape, axis, out):
958
+ rng = np.random.default_rng(23409823)
959
+ a = random_array(shape, density=0.6, random_state=rng, dtype=int)
960
+
961
+ res = a.sum(axis=axis, out=out)
962
+ exp = np.sum(a.toarray(), axis=axis)
963
+ assert_equal(res, exp)
964
+ if out is not None:
965
+ assert_equal(out, exp)
966
+ assert id(res) == id(out)
967
+
968
+
969
+ @pytest.mark.parametrize(('shape', 'axis', 'out'), sum_mean_params)
970
+ def test_mean(shape, axis, out):
971
+ rng = np.random.default_rng(23409823)
972
+ a = random_array(shape, density=0.6, random_state=rng, dtype=int)
973
+
974
+ res = a.mean(axis=axis, out=out)
975
+ exp = np.mean(a.toarray(), axis=axis)
976
+ assert_allclose(res, exp)
977
+ if out is not None:
978
+ assert id(res) == id(out)
979
+ assert_allclose(out, exp)
980
+
981
+
982
+ def test_pow_abs_round():
983
+ rng = np.random.default_rng(23409823)
984
+ a = random_array((3,6,5,2,4), density=0.6, random_state=rng, dtype=int)
985
+ assert_allclose((a**3).toarray(), np.power(a.toarray(), 3))
986
+ assert_allclose((a**7).toarray(), np.power(a.toarray(), 7))
987
+ assert_allclose(round(a).toarray(), np.round(a.toarray()))
988
+ assert_allclose(abs(a).toarray(), np.abs(a.toarray()))
989
+
990
+
991
+ #bitwise_op_and_compare_broadcast_shapes = [
992
+ # ((3,4), (3,4)), ((1,4), (2,1)), ((3,5), (1,)), ((1,), (7,8)),
993
+ # ((3,4,6), (3,4,6)), ((4,3), (2,1,3)), ((2,1,3), (4,3)),
994
+ # ((3,5,4), (1,)), ((1,), (7,8,4)), ((16,1,6), (2,6)), ((3,7,5), (3,7,5)),
995
+ # ((16,2,6), (1,2,6)), ((7,8), (5,7,8)), ((4,5,1), (5,1)),
996
+ # ((6,8,3), (4,1,1,3)), ((1,1,1), (3,4,2)), ((3,4,2), (1,1,1,1,1)),
997
+ bitwise_op_and_compare_shapes = [
998
+ ((3,4), (3,4)), ((3,4,6), (3,4,6)), ((3,7,5), (3,7,5)),
999
+ ]
1000
+ @pytest.mark.parametrize(('a_shape', 'b_shape'), bitwise_op_and_compare_shapes)
1001
+ def test_boolean_comparisons(a_shape, b_shape):
1002
+ rng = np.random.default_rng(23409823)
1003
+ sup = suppress_warnings()
1004
+ sup.filter(SparseEfficiencyWarning)
1005
+ a = random_array(a_shape, density=0.6, random_state=rng, dtype=int)
1006
+ b = random_array(b_shape, density=0.6, random_state=rng, dtype=int)
1007
+ with sup:
1008
+ assert_equal((a==b).toarray(), a.toarray()==b.toarray())
1009
+ assert_equal((a!=b).toarray(), a.toarray()!=b.toarray())
1010
+ assert_equal((a>=b).toarray(), a.toarray()>=b.toarray())
1011
+ assert_equal((a<=b).toarray(), a.toarray()<=b.toarray())
1012
+ assert_equal((a>b).toarray(), a.toarray()>b.toarray())
1013
+ assert_equal((a<b).toarray(), a.toarray()<b.toarray())
1014
+ assert_equal((a==b).toarray(), np.bitwise_not((a!=b).toarray()))
1015
+ assert_equal((a>=b).toarray(), np.bitwise_not((a<b).toarray()))
1016
+ assert_equal((a<=b).toarray(), np.bitwise_not((a>b).toarray()))
1017
+
1018
+
1019
+ def test_boolean_comparisons_with_scalar():
1020
+ rng = np.random.default_rng(23409823)
1021
+ sup = suppress_warnings()
1022
+ sup.filter(SparseEfficiencyWarning)
1023
+ a = random_array((5,4,8,7), density=0.6, random_state=rng, dtype=int)
1024
+ with sup:
1025
+ assert_equal((a==0).toarray(), a.toarray()==0)
1026
+ assert_equal((a!=0).toarray(), a.toarray()!=0)
1027
+ assert_equal((a>=1).toarray(), a.toarray()>=1)
1028
+ assert_equal((a<=1).toarray(), a.toarray()<=1)
1029
+ assert_equal((a>0).toarray(), a.toarray()>0)
1030
+ assert_equal((a<0).toarray(), a.toarray()<0)
1031
+
1032
+
1033
+ @pytest.mark.parametrize(('a_shape', 'b_shape'), bitwise_op_and_compare_shapes)
1034
+ def test_multiply(a_shape, b_shape):
1035
+ rng = np.random.default_rng(23409823)
1036
+ a = random_array(a_shape, density=0.6, random_state=rng, dtype=int)
1037
+ b = random_array(b_shape, density=0.6, random_state=rng, dtype=int)
1038
+ res = a * b
1039
+ exp = np.multiply(a.toarray(), b.toarray())
1040
+ assert_equal(res.toarray(), exp)
1041
+
1042
+
1043
+ def test_multiply_with_scalar():
1044
+ rng = np.random.default_rng(23409823)
1045
+ a = random_array((3,5,4), density=0.6, random_state=rng, dtype=int)
1046
+ res = a * 7
1047
+ exp = np.multiply(a.toarray(), 7)
1048
+ assert_equal(res.toarray(), exp)
1049
+
1050
+
1051
+ @pytest.mark.parametrize(('a_shape', 'b_shape'), bitwise_op_and_compare_shapes)
1052
+ def test_divide(a_shape, b_shape):
1053
+ rng = np.random.default_rng(23409823)
1054
+ a = random_array(a_shape, density=0.6, random_state=rng, dtype=int)
1055
+ b = np.arange(1, 1 + math.prod(b_shape)).reshape(b_shape)
1056
+ res = a / b
1057
+ exp = a.toarray() / b
1058
+ assert_allclose(res.toarray(), exp)
1059
+
1060
+ res = a / b
1061
+ assert_allclose(res.toarray(), exp)
1062
+
1063
+
1064
+ def test_divide_with_scalar():
1065
+ rng = np.random.default_rng(23409823)
1066
+ a = random_array((3,5,4), density=0.6, random_state=rng, dtype=int)
1067
+ res = a / 7
1068
+ exp = a.toarray() / 7
1069
+ assert_allclose(res.toarray(), exp)
1070
+
1071
+
1072
+ @pytest.mark.parametrize(('a_shape', 'b_shape'), bitwise_op_and_compare_shapes)
1073
+ def test_maximum(a_shape, b_shape):
1074
+ rng = np.random.default_rng(23409823)
1075
+ sup = suppress_warnings()
1076
+ sup.filter(SparseEfficiencyWarning)
1077
+ a = random_array(a_shape, density=0.6, random_state=rng, dtype=int)
1078
+ b = random_array(b_shape, density=0.6, random_state=rng, dtype=int)
1079
+ with sup:
1080
+ res = a.maximum(b)
1081
+ exp = np.maximum(a.toarray(), b.toarray())
1082
+ assert_equal(res.toarray(), exp)
1083
+
1084
+ @pytest.mark.parametrize(('a_shape', 'b_shape'), bitwise_op_and_compare_shapes)
1085
+ def test_minimum(a_shape, b_shape):
1086
+ rng = np.random.default_rng(23409823)
1087
+ sup = suppress_warnings()
1088
+ sup.filter(SparseEfficiencyWarning)
1089
+ a = random_array(a_shape, density=0.6, random_state=rng, dtype=int)
1090
+ b = random_array(b_shape, density=0.6, random_state=rng, dtype=int)
1091
+ with sup:
1092
+ res = a.minimum(b)
1093
+ exp = np.minimum(a.toarray(), b.toarray())
1094
+ assert_equal(res.toarray(), exp)
1095
+
1096
+
1097
+ def test_maximum_with_scalar():
1098
+ sup = suppress_warnings()
1099
+ sup.filter(SparseEfficiencyWarning)
1100
+ a = coo_array([0,1,6])
1101
+ b = coo_array([[15, 0], [14, 5], [0, -12]])
1102
+ c = coo_array([[[[3,0], [2,4]], [[8,9], [-3,12]]],
1103
+ [[[5,2], [3,0]], [[0,7], [0,-6]]]])
1104
+ with sup:
1105
+ assert_equal(a.maximum(5).toarray(), np.maximum(a.toarray(), 5))
1106
+ assert_equal(b.maximum(9).toarray(), np.maximum(b.toarray(), 9))
1107
+ assert_equal(c.maximum(5).toarray(), np.maximum(c.toarray(), 5))
1108
+
1109
+ def test_minimum_with_scalar():
1110
+ sup = suppress_warnings()
1111
+ sup.filter(SparseEfficiencyWarning)
1112
+ a = coo_array([0,1,6])
1113
+ b = coo_array([[15, 0], [14, 5], [0, -12]])
1114
+ c = coo_array([[[[3,0], [2,4]], [[8,9], [-3,12]]],
1115
+ [[[5,2], [3,0]], [[0,7], [0,-6]]]])
1116
+ with sup:
1117
+ assert_equal(a.minimum(5).toarray(), np.minimum(a.toarray(), 5))
1118
+ assert_equal(b.minimum(9).toarray(), np.minimum(b.toarray(), 9))
1119
+ assert_equal(c.minimum(5).toarray(), np.minimum(c.toarray(), 5))
@@ -21,6 +21,7 @@ def int_to_int8(n):
21
21
  return (n + 128) % 256 - 128
22
22
 
23
23
 
24
+ @pytest.mark.thread_unsafe # Exception handling in CPython 3.13 has races
24
25
  def test_exception():
25
26
  assert_raises(MemoryError, _sparsetools.test_throw_error)
26
27
 
@@ -68,6 +69,7 @@ def test_regression_std_vector_dtypes():
68
69
 
69
70
 
70
71
  @pytest.mark.slow
72
+ @pytest.mark.thread_unsafe
71
73
  @pytest.mark.xfail_on_32bit("Can't create large array for test")
72
74
  def test_nnz_overflow():
73
75
  # Regression test for gh-7230 / gh-7871, checking that coo_toarray
@@ -88,6 +90,7 @@ def test_nnz_overflow():
88
90
  assert_allclose(d, [[4]])
89
91
 
90
92
 
93
+ @pytest.mark.thread_unsafe
91
94
  @pytest.mark.skipif(
92
95
  not (sys.platform.startswith('linux') and np.dtype(np.intp).itemsize >= 8),
93
96
  reason="test requires 64-bit Linux"
@@ -117,6 +120,7 @@ class TestInt32Overflow:
117
120
  def teardown_method(self):
118
121
  gc.collect()
119
122
 
123
+ @pytest.mark.fail_slow(2) # keep in fast set, only non-slow test
120
124
  def test_coo_todense(self):
121
125
  # Check *_todense routines (cf. gh-2179)
122
126
  #
@@ -270,6 +274,7 @@ class TestInt32Overflow:
270
274
  m2.dot(m) # shouldn't SIGSEGV
271
275
 
272
276
 
277
+ @pytest.mark.thread_unsafe
273
278
  @pytest.mark.skip(reason="64-bit indices in sparse matrices not available")
274
279
  def test_csr_matmat_int64_overflow():
275
280
  n = 3037000500
@@ -107,13 +107,42 @@ class TestSparseUtils:
107
107
  assert_equal(sputils.isdense(matrix([1])), True)
108
108
 
109
109
  def test_validateaxis(self):
110
- assert_raises(TypeError, sputils.validateaxis, (0, 1))
111
- assert_raises(TypeError, sputils.validateaxis, 1.5)
112
- assert_raises(ValueError, sputils.validateaxis, 3)
113
-
114
- # These function calls should not raise errors
115
- for axis in (-2, -1, 0, 1, None):
116
- sputils.validateaxis(axis)
110
+ with assert_raises(ValueError, match="does not accept 0D axis"):
111
+ sputils.validateaxis(())
112
+
113
+ for ax in [1.5, (0, 1.5), (1.5, 0)]:
114
+ with assert_raises(TypeError, match="must be an integer"):
115
+ sputils.validateaxis(ax)
116
+ for ax in [(1, 1), (1, -1), (0, -2)]:
117
+ with assert_raises(ValueError, match="duplicate value in axis"):
118
+ sputils.validateaxis(ax)
119
+
120
+ # ndim 1
121
+ for ax in [1, -2, (0, 1), (1, -1)]:
122
+ with assert_raises(ValueError, match="out of range"):
123
+ sputils.validateaxis(ax, ndim=1)
124
+ with assert_raises(ValueError, match="duplicate value in axis"):
125
+ sputils.validateaxis((0, -1), ndim=1)
126
+ # all valid axis values lead to None when canonical
127
+ for axis in (0, -1, None, (0,), (-1,)):
128
+ assert sputils.validateaxis(axis, ndim=1) is None
129
+
130
+ # ndim 2
131
+ for ax in [5, -5, (0, 5), (-5, 0)]:
132
+ with assert_raises(ValueError, match="out of range"):
133
+ sputils.validateaxis(ax, ndim=2)
134
+ for axis in ((0,), (1,), None):
135
+ assert sputils.validateaxis(axis, ndim=2) == axis
136
+ axis_2d = {-2: (0,), -1: (1,), 0: (0,), 1: (1,), (0, 1): None, (0, -1): None}
137
+ for axis, canonical_axis in axis_2d.items():
138
+ assert sputils.validateaxis(axis, ndim=2) == canonical_axis
139
+
140
+ # ndim 4
141
+ for axis in ((2,), (3,), (2, 3), (2, 1), (0, 3)):
142
+ assert sputils.validateaxis(axis, ndim=4) == axis
143
+ axis_4d = {-4: (0,), -3: (1,), 2: (2,), 3: (3,), (3, -4): (3, 0)}
144
+ for axis, canonical_axis in axis_4d.items():
145
+ sputils.validateaxis(axis, ndim=4) == canonical_axis
117
146
 
118
147
  @pytest.mark.parametrize("container", [csr_array, bsr_array])
119
148
  def test_safely_cast_index_compressed(self, container):
scipy/spatial/distance.py CHANGED
@@ -107,20 +107,19 @@ __all__ = [
107
107
 
108
108
  import math
109
109
  import warnings
110
- import numpy as np
111
110
  import dataclasses
112
-
113
111
  from collections.abc import Callable
114
112
  from functools import partial
115
- from scipy._lib._util import _asarray_validated, _transition_to_rng
116
- from scipy._lib.deprecation import _deprecated
117
113
 
118
- from . import _distance_wrap
119
- from . import _hausdorff
120
- from ..linalg import norm
121
- from ..special import rel_entr
114
+ import numpy as np
122
115
 
123
- from . import _distance_pybind
116
+ from scipy._lib._array_api import _asarray
117
+ from scipy._lib._util import _asarray_validated, _transition_to_rng
118
+ from scipy._lib import array_api_extra as xpx
119
+ from scipy._lib.deprecation import _deprecated
120
+ from scipy.linalg import norm
121
+ from scipy.special import rel_entr
122
+ from . import _hausdorff, _distance_pybind, _distance_wrap
124
123
 
125
124
 
126
125
  def _copy_array_if_base_present(a):
@@ -222,9 +221,8 @@ def _validate_hamming_kwargs(X, m, n, **kwargs):
222
221
  w = kwargs.get('w', np.ones((n,), dtype='double'))
223
222
 
224
223
  if w.ndim != 1 or w.shape[0] != n:
225
- raise ValueError(
226
- "Weights must have same size as input vector. %d vs. %d" % (w.shape[0], n)
227
- )
224
+ raise ValueError(f"Weights must have same size as input vector. "
225
+ f"{w.shape[0]} vs. {n}")
228
226
 
229
227
  kwargs['w'] = _validate_weights(w)
230
228
  return kwargs
@@ -236,11 +234,10 @@ def _validate_mahalanobis_kwargs(X, m, n, **kwargs):
236
234
  if m <= n:
237
235
  # There are fewer observations than the dimension of
238
236
  # the observations.
239
- raise ValueError("The number of observations (%d) is too "
240
- "small; the covariance matrix is "
241
- "singular. For observations with %d "
242
- "dimensions, at least %d observations "
243
- "are required." % (m, n, n + 1))
237
+ raise ValueError(
238
+ f"The number of observations ({m}) is too small; "
239
+ f"the covariance matrix is singular. For observations "
240
+ f"with {n} dimensions, at least {n + 1} observations are required.")
244
241
  if isinstance(X, tuple):
245
242
  X = np.vstack(X)
246
243
  CV = np.atleast_2d(np.cov(X.astype(np.float64, copy=False).T))
@@ -2295,14 +2292,33 @@ def pdist(X, metric='euclidean', *, out=None, **kwargs):
2295
2292
  # between all pairs of vectors in X using the distance metric 'abc' but
2296
2293
  # with a more succinct, verifiable, but less efficient implementation.
2297
2294
 
2295
+ X = _asarray(X)
2296
+ if X.ndim != 2:
2297
+ raise ValueError(f'A 2-dimensional array must be passed. (Shape was {X.shape}).')
2298
+
2299
+ n = X.shape[0]
2300
+ return xpx.lazy_apply(_np_pdist, X, out,
2301
+ # lazy_apply doesn't support Array kwargs
2302
+ kwargs.pop('w', None),
2303
+ kwargs.pop('V', None),
2304
+ kwargs.pop('VI', None),
2305
+ # See src/distance_pybind.cpp::pdist
2306
+ shape=((n * (n - 1)) // 2, ), dtype=X.dtype,
2307
+ as_numpy=True, metric=metric, **kwargs)
2308
+
2309
+
2310
+ def _np_pdist(X, out, w, V, VI, metric='euclidean', **kwargs):
2311
+
2298
2312
  X = _asarray_validated(X, sparse_ok=False, objects_ok=True, mask_ok=True,
2299
2313
  check_finite=False)
2314
+ m, n = X.shape
2300
2315
 
2301
- s = X.shape
2302
- if len(s) != 2:
2303
- raise ValueError('A 2-dimensional array must be passed.')
2304
-
2305
- m, n = s
2316
+ if w is not None:
2317
+ kwargs["w"] = w
2318
+ if V is not None:
2319
+ kwargs["V"] = V
2320
+ if VI is not None:
2321
+ kwargs["VI"] = VI
2306
2322
 
2307
2323
  if callable(metric):
2308
2324
  mstr = getattr(metric, '__name__', 'UnknownCustomMetric')
@@ -2622,7 +2638,7 @@ def is_valid_y(y, warning=False, throw=False, name=None):
2622
2638
  throw : bool, optional
2623
2639
  Throws an exception if the variable passed is not a valid
2624
2640
  condensed distance matrix.
2625
- name : bool, optional
2641
+ name : str, optional
2626
2642
  Used when referencing the offending variable in the
2627
2643
  warning or exception message.
2628
2644
 
@@ -2650,34 +2666,25 @@ def is_valid_y(y, warning=False, throw=False, name=None):
2650
2666
  False
2651
2667
 
2652
2668
  """
2653
- y = np.asarray(y, order='c')
2654
- valid = True
2669
+ y = _asarray(y)
2670
+ name_str = f"'{name}' " if name else ""
2655
2671
  try:
2656
2672
  if len(y.shape) != 1:
2657
- if name:
2658
- raise ValueError(f"Condensed distance matrix '{name}' must "
2659
- "have shape=1 (i.e. be one-dimensional).")
2660
- else:
2661
- raise ValueError('Condensed distance matrix must have shape=1 '
2662
- '(i.e. be one-dimensional).')
2673
+ raise ValueError(f"Condensed distance matrix {name_str}must "
2674
+ "have shape=1 (i.e. be one-dimensional).")
2663
2675
  n = y.shape[0]
2664
2676
  d = int(np.ceil(np.sqrt(n * 2)))
2665
2677
  if (d * (d - 1) / 2) != n:
2666
- if name:
2667
- raise ValueError(f"Length n of condensed distance matrix '{name}' "
2668
- "must be a binomial coefficient, i.e."
2669
- "there must be a k such that (k \\choose 2)=n)!")
2670
- else:
2671
- raise ValueError('Length n of condensed distance matrix must '
2672
- 'be a binomial coefficient, i.e. there must '
2673
- 'be a k such that (k \\choose 2)=n)!')
2678
+ raise ValueError(f"Length n of condensed distance matrix {name_str}"
2679
+ "must be a binomial coefficient, i.e. "
2680
+ "there must be a k such that (k \\choose 2)=n)!")
2674
2681
  except Exception as e:
2675
2682
  if throw:
2676
2683
  raise
2677
2684
  if warning:
2678
2685
  warnings.warn(str(e), stacklevel=2)
2679
- valid = False
2680
- return valid
2686
+ return False
2687
+ return True
2681
2688
 
2682
2689
 
2683
2690
  def num_obs_dm(d):
@@ -2735,7 +2742,7 @@ def num_obs_y(Y):
2735
2742
  >>> num_obs_y(Y)
2736
2743
  4
2737
2744
  """
2738
- Y = np.asarray(Y, order='c')
2745
+ Y = _asarray(Y)
2739
2746
  is_valid_y(Y, throw=True, name='Y')
2740
2747
  k = Y.shape[0]
2741
2748
  if k == 0:
@@ -63,6 +63,7 @@ from scipy.spatial.distance import (braycurtis, canberra, chebyshev, cityblock,
63
63
  russellrao, seuclidean, sokalmichener, # noqa: F401
64
64
  sokalsneath, sqeuclidean, yule)
65
65
  from scipy._lib._util import np_long, np_ulong
66
+ from scipy.conftest import skip_xp_invalid_arg
66
67
 
67
68
 
68
69
  @pytest.fixture(params=_METRICS_NAMES, scope="session")
@@ -1370,6 +1371,7 @@ class TestPdist:
1370
1371
  right_y = 0.01492537
1371
1372
  assert_allclose(pdist_y, right_y, atol=eps, verbose=verbose > 2)
1372
1373
 
1374
+ @skip_xp_invalid_arg
1373
1375
  def test_pdist_custom_notdouble(self):
1374
1376
  # tests that when using a custom metric the data type is not altered
1375
1377
  class myclass:
@@ -2106,7 +2108,7 @@ def test_Xdist_deprecated_args(metric):
2106
2108
  pdist(X1, metric, 2.)
2107
2109
 
2108
2110
  for arg in ["p", "V", "VI"]:
2109
- kwargs = {arg: "foo"}
2111
+ kwargs = {arg: np.asarray(1.)}
2110
2112
 
2111
2113
  if ((arg == "V" and metric == "seuclidean")
2112
2114
  or (arg == "VI" and metric == "mahalanobis")
@@ -2229,6 +2231,18 @@ def test_immutable_input(metric):
2229
2231
  getattr(scipy.spatial.distance, metric)(x, x, w=x)
2230
2232
 
2231
2233
 
2234
+ def test_gh_23109():
2235
+ a = np.array([0, 0, 1, 1])
2236
+ b = np.array([0, 1, 1, 0])
2237
+ w = np.asarray([1.5, 1.2, 0.7, 1.3])
2238
+ expected = yule(a, b, w=w)
2239
+ assert_allclose(expected, 1.1954022988505748)
2240
+ actual = cdist(np.atleast_2d(a),
2241
+ np.atleast_2d(b),
2242
+ metric='yule', w=w)
2243
+ assert_allclose(actual, expected)
2244
+
2245
+
2232
2246
  class TestJaccard:
2233
2247
 
2234
2248
  def test_pdist_jaccard_random(self):
@@ -426,6 +426,7 @@ def test_random_ball_vectorized(kdtree_type):
426
426
  assert_(isinstance(r[0, 0], list))
427
427
 
428
428
 
429
+ @pytest.mark.fail_slow(5)
429
430
  def test_query_ball_point_multithreading(kdtree_type):
430
431
  np.random.seed(0)
431
432
  n = 5000