scipy 1.15.3__cp313-cp313t-macosx_14_0_arm64.whl → 1.16.0rc2__cp313-cp313t-macosx_14_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (627) hide show
  1. scipy/__config__.py +3 -3
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cpython-313t-darwin.so +0 -0
  4. scipy/_lib/_array_api.py +486 -161
  5. scipy/_lib/_array_api_compat_vendor.py +9 -0
  6. scipy/_lib/_bunch.py +4 -0
  7. scipy/_lib/_ccallback_c.cpython-313t-darwin.so +0 -0
  8. scipy/_lib/_docscrape.py +1 -1
  9. scipy/_lib/_elementwise_iterative_method.py +15 -26
  10. scipy/_lib/_sparse.py +41 -0
  11. scipy/_lib/_test_deprecation_call.cpython-313t-darwin.so +0 -0
  12. scipy/_lib/_testutils.py +6 -2
  13. scipy/_lib/_util.py +222 -125
  14. scipy/_lib/array_api_compat/__init__.py +4 -4
  15. scipy/_lib/array_api_compat/_internal.py +19 -6
  16. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  17. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  18. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  19. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  20. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  21. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  22. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  23. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  24. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  25. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  26. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  27. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  28. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  29. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  30. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  31. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  32. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  33. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  34. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  35. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  36. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  37. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  38. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  39. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  40. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  41. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  42. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  43. scipy/_lib/array_api_extra/__init__.py +26 -3
  44. scipy/_lib/array_api_extra/_delegation.py +171 -0
  45. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  46. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  47. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  48. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  49. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  50. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  51. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  52. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  53. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  54. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  57. scipy/_lib/array_api_extra/testing.py +359 -0
  58. scipy/_lib/decorator.py +2 -2
  59. scipy/_lib/doccer.py +1 -7
  60. scipy/_lib/messagestream.cpython-313t-darwin.so +0 -0
  61. scipy/_lib/pyprima/__init__.py +212 -0
  62. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  63. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  64. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  65. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  66. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  67. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  68. scipy/_lib/pyprima/cobyla/update.py +289 -0
  69. scipy/_lib/pyprima/common/__init__.py +0 -0
  70. scipy/_lib/pyprima/common/_bounds.py +34 -0
  71. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  72. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  73. scipy/_lib/pyprima/common/_project.py +173 -0
  74. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  75. scipy/_lib/pyprima/common/consts.py +47 -0
  76. scipy/_lib/pyprima/common/evaluate.py +99 -0
  77. scipy/_lib/pyprima/common/history.py +38 -0
  78. scipy/_lib/pyprima/common/infos.py +30 -0
  79. scipy/_lib/pyprima/common/linalg.py +435 -0
  80. scipy/_lib/pyprima/common/message.py +290 -0
  81. scipy/_lib/pyprima/common/powalg.py +131 -0
  82. scipy/_lib/pyprima/common/preproc.py +277 -0
  83. scipy/_lib/pyprima/common/present.py +5 -0
  84. scipy/_lib/pyprima/common/ratio.py +54 -0
  85. scipy/_lib/pyprima/common/redrho.py +47 -0
  86. scipy/_lib/pyprima/common/selectx.py +296 -0
  87. scipy/_lib/tests/test__util.py +105 -121
  88. scipy/_lib/tests/test_array_api.py +166 -35
  89. scipy/_lib/tests/test_bunch.py +7 -0
  90. scipy/_lib/tests/test_ccallback.py +2 -10
  91. scipy/_lib/tests/test_public_api.py +13 -0
  92. scipy/cluster/_hierarchy.cpython-313t-darwin.so +0 -0
  93. scipy/cluster/_optimal_leaf_ordering.cpython-313t-darwin.so +0 -0
  94. scipy/cluster/_vq.cpython-313t-darwin.so +0 -0
  95. scipy/cluster/hierarchy.py +393 -223
  96. scipy/cluster/tests/test_hierarchy.py +273 -335
  97. scipy/cluster/tests/test_vq.py +45 -61
  98. scipy/cluster/vq.py +39 -35
  99. scipy/conftest.py +263 -157
  100. scipy/constants/_constants.py +4 -1
  101. scipy/constants/tests/test_codata.py +2 -2
  102. scipy/constants/tests/test_constants.py +11 -18
  103. scipy/datasets/_download_all.py +15 -1
  104. scipy/datasets/_fetchers.py +7 -1
  105. scipy/datasets/_utils.py +1 -1
  106. scipy/differentiate/_differentiate.py +25 -25
  107. scipy/differentiate/tests/test_differentiate.py +24 -25
  108. scipy/fft/_basic.py +20 -0
  109. scipy/fft/_helper.py +3 -34
  110. scipy/fft/_pocketfft/helper.py +29 -1
  111. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  112. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  113. scipy/fft/_realtransforms.py +13 -0
  114. scipy/fft/tests/test_basic.py +27 -25
  115. scipy/fft/tests/test_fftlog.py +16 -7
  116. scipy/fft/tests/test_helper.py +18 -34
  117. scipy/fft/tests/test_real_transforms.py +8 -10
  118. scipy/fftpack/convolve.cpython-313t-darwin.so +0 -0
  119. scipy/fftpack/tests/test_basic.py +2 -4
  120. scipy/fftpack/tests/test_real_transforms.py +8 -9
  121. scipy/integrate/_bvp.py +9 -3
  122. scipy/integrate/_cubature.py +3 -2
  123. scipy/integrate/_dop.cpython-313t-darwin.so +0 -0
  124. scipy/integrate/_lsoda.cpython-313t-darwin.so +0 -0
  125. scipy/integrate/_ode.py +9 -2
  126. scipy/integrate/_odepack.cpython-313t-darwin.so +0 -0
  127. scipy/integrate/_quad_vec.py +21 -29
  128. scipy/integrate/_quadpack.cpython-313t-darwin.so +0 -0
  129. scipy/integrate/_quadpack_py.py +11 -7
  130. scipy/integrate/_quadrature.py +3 -3
  131. scipy/integrate/_rules/_base.py +2 -2
  132. scipy/integrate/_tanhsinh.py +48 -47
  133. scipy/integrate/_test_odeint_banded.cpython-313t-darwin.so +0 -0
  134. scipy/integrate/_vode.cpython-313t-darwin.so +0 -0
  135. scipy/integrate/tests/test__quad_vec.py +0 -6
  136. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  137. scipy/integrate/tests/test_cubature.py +21 -35
  138. scipy/integrate/tests/test_quadrature.py +6 -8
  139. scipy/integrate/tests/test_tanhsinh.py +56 -48
  140. scipy/interpolate/__init__.py +70 -58
  141. scipy/interpolate/_bary_rational.py +22 -22
  142. scipy/interpolate/_bsplines.py +119 -66
  143. scipy/interpolate/_cubic.py +65 -50
  144. scipy/interpolate/_dfitpack.cpython-313t-darwin.so +0 -0
  145. scipy/interpolate/_dierckx.cpython-313t-darwin.so +0 -0
  146. scipy/interpolate/_fitpack.cpython-313t-darwin.so +0 -0
  147. scipy/interpolate/_fitpack2.py +9 -6
  148. scipy/interpolate/_fitpack_impl.py +32 -26
  149. scipy/interpolate/_fitpack_repro.py +23 -19
  150. scipy/interpolate/_interpnd.cpython-313t-darwin.so +0 -0
  151. scipy/interpolate/_interpolate.py +30 -12
  152. scipy/interpolate/_ndbspline.py +13 -18
  153. scipy/interpolate/_ndgriddata.py +5 -8
  154. scipy/interpolate/_polyint.py +95 -31
  155. scipy/interpolate/_ppoly.cpython-313t-darwin.so +0 -0
  156. scipy/interpolate/_rbf.py +2 -2
  157. scipy/interpolate/_rbfinterp.py +1 -1
  158. scipy/interpolate/_rbfinterp_pythran.cpython-313t-darwin.so +0 -0
  159. scipy/interpolate/_rgi.py +31 -26
  160. scipy/interpolate/_rgi_cython.cpython-313t-darwin.so +0 -0
  161. scipy/interpolate/dfitpack.py +0 -20
  162. scipy/interpolate/interpnd.py +1 -2
  163. scipy/interpolate/tests/test_bary_rational.py +2 -2
  164. scipy/interpolate/tests/test_bsplines.py +97 -1
  165. scipy/interpolate/tests/test_fitpack2.py +39 -1
  166. scipy/interpolate/tests/test_interpnd.py +32 -20
  167. scipy/interpolate/tests/test_interpolate.py +48 -4
  168. scipy/interpolate/tests/test_rgi.py +2 -1
  169. scipy/io/_fast_matrix_market/__init__.py +2 -0
  170. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  171. scipy/io/_harwell_boeing/hb.py +7 -11
  172. scipy/io/_idl.py +5 -7
  173. scipy/io/_netcdf.py +15 -5
  174. scipy/io/_test_fortran.cpython-313t-darwin.so +0 -0
  175. scipy/io/arff/tests/test_arffread.py +3 -3
  176. scipy/io/matlab/__init__.py +5 -3
  177. scipy/io/matlab/_mio.py +4 -1
  178. scipy/io/matlab/_mio5.py +19 -13
  179. scipy/io/matlab/_mio5_utils.cpython-313t-darwin.so +0 -0
  180. scipy/io/matlab/_mio_utils.cpython-313t-darwin.so +0 -0
  181. scipy/io/matlab/_miobase.py +4 -1
  182. scipy/io/matlab/_streams.cpython-313t-darwin.so +0 -0
  183. scipy/io/matlab/tests/test_mio.py +46 -18
  184. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  185. scipy/io/tests/test_mmio.py +7 -1
  186. scipy/io/tests/test_wavfile.py +41 -0
  187. scipy/io/wavfile.py +57 -10
  188. scipy/linalg/_basic.py +113 -86
  189. scipy/linalg/_cythonized_array_utils.cpython-313t-darwin.so +0 -0
  190. scipy/linalg/_decomp.py +22 -9
  191. scipy/linalg/_decomp_cholesky.py +28 -13
  192. scipy/linalg/_decomp_cossin.py +45 -30
  193. scipy/linalg/_decomp_interpolative.cpython-313t-darwin.so +0 -0
  194. scipy/linalg/_decomp_ldl.py +4 -1
  195. scipy/linalg/_decomp_lu.py +18 -6
  196. scipy/linalg/_decomp_lu_cython.cpython-313t-darwin.so +0 -0
  197. scipy/linalg/_decomp_polar.py +2 -0
  198. scipy/linalg/_decomp_qr.py +6 -2
  199. scipy/linalg/_decomp_qz.py +3 -0
  200. scipy/linalg/_decomp_schur.py +3 -1
  201. scipy/linalg/_decomp_svd.py +13 -2
  202. scipy/linalg/_decomp_update.cpython-313t-darwin.so +0 -0
  203. scipy/linalg/_expm_frechet.py +4 -0
  204. scipy/linalg/_fblas.cpython-313t-darwin.so +0 -0
  205. scipy/linalg/_flapack.cpython-313t-darwin.so +0 -0
  206. scipy/linalg/_linalg_pythran.cpython-313t-darwin.so +0 -0
  207. scipy/linalg/_matfuncs.py +187 -4
  208. scipy/linalg/_matfuncs_expm.cpython-313t-darwin.so +0 -0
  209. scipy/linalg/_matfuncs_schur_sqrtm.cpython-313t-darwin.so +0 -0
  210. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  211. scipy/linalg/_matfuncs_sqrtm_triu.cpython-313t-darwin.so +0 -0
  212. scipy/linalg/_procrustes.py +2 -0
  213. scipy/linalg/_sketches.py +17 -6
  214. scipy/linalg/_solve_toeplitz.cpython-313t-darwin.so +0 -0
  215. scipy/linalg/_solvers.py +7 -2
  216. scipy/linalg/_special_matrices.py +26 -36
  217. scipy/linalg/cython_blas.cpython-313t-darwin.so +0 -0
  218. scipy/linalg/cython_lapack.cpython-313t-darwin.so +0 -0
  219. scipy/linalg/lapack.py +22 -2
  220. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  221. scipy/linalg/tests/test_basic.py +31 -16
  222. scipy/linalg/tests/test_batch.py +588 -0
  223. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  224. scipy/linalg/tests/test_decomp.py +40 -3
  225. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  226. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  227. scipy/linalg/tests/test_lapack.py +115 -7
  228. scipy/linalg/tests/test_matfuncs.py +157 -102
  229. scipy/linalg/tests/test_procrustes.py +0 -7
  230. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  231. scipy/linalg/tests/test_special_matrices.py +1 -5
  232. scipy/ndimage/__init__.py +1 -0
  233. scipy/ndimage/_cytest.cpython-313t-darwin.so +0 -0
  234. scipy/ndimage/_delegators.py +8 -2
  235. scipy/ndimage/_filters.py +453 -5
  236. scipy/ndimage/_interpolation.py +36 -6
  237. scipy/ndimage/_measurements.py +4 -2
  238. scipy/ndimage/_morphology.py +5 -0
  239. scipy/ndimage/_nd_image.cpython-313t-darwin.so +0 -0
  240. scipy/ndimage/_ni_docstrings.py +5 -1
  241. scipy/ndimage/_ni_label.cpython-313t-darwin.so +0 -0
  242. scipy/ndimage/_ni_support.py +1 -5
  243. scipy/ndimage/_rank_filter_1d.cpython-313t-darwin.so +0 -0
  244. scipy/ndimage/_support_alternative_backends.py +18 -6
  245. scipy/ndimage/tests/test_filters.py +370 -259
  246. scipy/ndimage/tests/test_fourier.py +7 -9
  247. scipy/ndimage/tests/test_interpolation.py +68 -61
  248. scipy/ndimage/tests/test_measurements.py +18 -35
  249. scipy/ndimage/tests/test_morphology.py +143 -131
  250. scipy/ndimage/tests/test_splines.py +1 -3
  251. scipy/odr/__odrpack.cpython-313t-darwin.so +0 -0
  252. scipy/optimize/_basinhopping.py +13 -7
  253. scipy/optimize/_bglu_dense.cpython-313t-darwin.so +0 -0
  254. scipy/optimize/_bracket.py +17 -24
  255. scipy/optimize/_chandrupatla.py +9 -10
  256. scipy/optimize/_cobyla_py.py +104 -123
  257. scipy/optimize/_constraints.py +14 -10
  258. scipy/optimize/_differentiable_functions.py +371 -230
  259. scipy/optimize/_differentialevolution.py +4 -3
  260. scipy/optimize/_direct.cpython-313t-darwin.so +0 -0
  261. scipy/optimize/_dual_annealing.py +1 -1
  262. scipy/optimize/_elementwise.py +1 -4
  263. scipy/optimize/_group_columns.cpython-313t-darwin.so +0 -0
  264. scipy/optimize/_lbfgsb.cpython-313t-darwin.so +0 -0
  265. scipy/optimize/_lbfgsb_py.py +57 -16
  266. scipy/optimize/_linprog_doc.py +2 -2
  267. scipy/optimize/_linprog_highs.py +2 -2
  268. scipy/optimize/_linprog_ip.py +25 -10
  269. scipy/optimize/_linprog_util.py +14 -16
  270. scipy/optimize/_lsap.cpython-313t-darwin.so +0 -0
  271. scipy/optimize/_lsq/common.py +3 -3
  272. scipy/optimize/_lsq/dogbox.py +16 -2
  273. scipy/optimize/_lsq/givens_elimination.cpython-313t-darwin.so +0 -0
  274. scipy/optimize/_lsq/least_squares.py +198 -126
  275. scipy/optimize/_lsq/lsq_linear.py +6 -6
  276. scipy/optimize/_lsq/trf.py +35 -8
  277. scipy/optimize/_milp.py +3 -1
  278. scipy/optimize/_minimize.py +105 -36
  279. scipy/optimize/_minpack.cpython-313t-darwin.so +0 -0
  280. scipy/optimize/_minpack_py.py +21 -14
  281. scipy/optimize/_moduleTNC.cpython-313t-darwin.so +0 -0
  282. scipy/optimize/_nnls.py +20 -21
  283. scipy/optimize/_nonlin.py +34 -3
  284. scipy/optimize/_numdiff.py +288 -110
  285. scipy/optimize/_optimize.py +86 -48
  286. scipy/optimize/_pava_pybind.cpython-313t-darwin.so +0 -0
  287. scipy/optimize/_remove_redundancy.py +5 -5
  288. scipy/optimize/_root_scalar.py +1 -1
  289. scipy/optimize/_shgo.py +6 -0
  290. scipy/optimize/_shgo_lib/_complex.py +1 -1
  291. scipy/optimize/_slsqp_py.py +216 -124
  292. scipy/optimize/_slsqplib.cpython-313t-darwin.so +0 -0
  293. scipy/optimize/_spectral.py +1 -1
  294. scipy/optimize/_tnc.py +8 -1
  295. scipy/optimize/_trlib/_trlib.cpython-313t-darwin.so +0 -0
  296. scipy/optimize/_trustregion.py +20 -6
  297. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  298. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  299. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  300. scipy/optimize/_trustregion_constr/projections.py +12 -8
  301. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  302. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  303. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  304. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  305. scipy/optimize/_trustregion_exact.py +0 -1
  306. scipy/optimize/_zeros.cpython-313t-darwin.so +0 -0
  307. scipy/optimize/_zeros_py.py +97 -17
  308. scipy/optimize/cython_optimize/_zeros.cpython-313t-darwin.so +0 -0
  309. scipy/optimize/slsqp.py +0 -1
  310. scipy/optimize/tests/test__basinhopping.py +1 -1
  311. scipy/optimize/tests/test__differential_evolution.py +4 -4
  312. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  313. scipy/optimize/tests/test__numdiff.py +66 -22
  314. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  315. scipy/optimize/tests/test__shgo.py +9 -1
  316. scipy/optimize/tests/test_bracket.py +36 -46
  317. scipy/optimize/tests/test_chandrupatla.py +133 -135
  318. scipy/optimize/tests/test_cobyla.py +74 -45
  319. scipy/optimize/tests/test_constraints.py +1 -1
  320. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  321. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  322. scipy/optimize/tests/test_least_squares.py +125 -13
  323. scipy/optimize/tests/test_linear_assignment.py +3 -3
  324. scipy/optimize/tests/test_linprog.py +3 -3
  325. scipy/optimize/tests/test_lsq_linear.py +6 -6
  326. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  327. scipy/optimize/tests/test_minpack.py +4 -4
  328. scipy/optimize/tests/test_nnls.py +43 -3
  329. scipy/optimize/tests/test_nonlin.py +36 -0
  330. scipy/optimize/tests/test_optimize.py +95 -17
  331. scipy/optimize/tests/test_slsqp.py +36 -4
  332. scipy/optimize/tests/test_zeros.py +34 -1
  333. scipy/signal/__init__.py +12 -23
  334. scipy/signal/_delegators.py +568 -0
  335. scipy/signal/_filter_design.py +459 -241
  336. scipy/signal/_fir_filter_design.py +262 -90
  337. scipy/signal/_lti_conversion.py +3 -2
  338. scipy/signal/_ltisys.py +118 -91
  339. scipy/signal/_max_len_seq_inner.cpython-313t-darwin.so +0 -0
  340. scipy/signal/_peak_finding_utils.cpython-313t-darwin.so +0 -0
  341. scipy/signal/_polyutils.py +172 -0
  342. scipy/signal/_short_time_fft.py +519 -70
  343. scipy/signal/_signal_api.py +30 -0
  344. scipy/signal/_signaltools.py +719 -399
  345. scipy/signal/_sigtools.cpython-313t-darwin.so +0 -0
  346. scipy/signal/_sosfilt.cpython-313t-darwin.so +0 -0
  347. scipy/signal/_spectral_py.py +230 -50
  348. scipy/signal/_spline.cpython-313t-darwin.so +0 -0
  349. scipy/signal/_spline_filters.py +108 -68
  350. scipy/signal/_support_alternative_backends.py +73 -0
  351. scipy/signal/_upfirdn.py +4 -1
  352. scipy/signal/_upfirdn_apply.cpython-313t-darwin.so +0 -0
  353. scipy/signal/_waveforms.py +2 -11
  354. scipy/signal/_wavelets.py +1 -1
  355. scipy/signal/fir_filter_design.py +1 -0
  356. scipy/signal/spline.py +4 -11
  357. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  358. scipy/signal/tests/test_bsplines.py +114 -79
  359. scipy/signal/tests/test_cont2discrete.py +9 -2
  360. scipy/signal/tests/test_filter_design.py +721 -481
  361. scipy/signal/tests/test_fir_filter_design.py +332 -140
  362. scipy/signal/tests/test_savitzky_golay.py +4 -3
  363. scipy/signal/tests/test_short_time_fft.py +221 -3
  364. scipy/signal/tests/test_signaltools.py +2144 -1348
  365. scipy/signal/tests/test_spectral.py +50 -6
  366. scipy/signal/tests/test_splines.py +161 -96
  367. scipy/signal/tests/test_upfirdn.py +84 -50
  368. scipy/signal/tests/test_waveforms.py +20 -0
  369. scipy/signal/tests/test_windows.py +607 -466
  370. scipy/signal/windows/_windows.py +287 -148
  371. scipy/sparse/__init__.py +23 -4
  372. scipy/sparse/_base.py +270 -108
  373. scipy/sparse/_bsr.py +7 -4
  374. scipy/sparse/_compressed.py +59 -231
  375. scipy/sparse/_construct.py +90 -38
  376. scipy/sparse/_coo.py +115 -181
  377. scipy/sparse/_csc.py +4 -4
  378. scipy/sparse/_csparsetools.cpython-313t-darwin.so +0 -0
  379. scipy/sparse/_csr.py +2 -2
  380. scipy/sparse/_data.py +48 -48
  381. scipy/sparse/_dia.py +105 -18
  382. scipy/sparse/_dok.py +0 -23
  383. scipy/sparse/_index.py +4 -4
  384. scipy/sparse/_matrix.py +23 -0
  385. scipy/sparse/_sparsetools.cpython-313t-darwin.so +0 -0
  386. scipy/sparse/_sputils.py +37 -22
  387. scipy/sparse/base.py +0 -9
  388. scipy/sparse/bsr.py +0 -14
  389. scipy/sparse/compressed.py +0 -23
  390. scipy/sparse/construct.py +0 -6
  391. scipy/sparse/coo.py +0 -14
  392. scipy/sparse/csc.py +0 -3
  393. scipy/sparse/csgraph/_flow.cpython-313t-darwin.so +0 -0
  394. scipy/sparse/csgraph/_matching.cpython-313t-darwin.so +0 -0
  395. scipy/sparse/csgraph/_min_spanning_tree.cpython-313t-darwin.so +0 -0
  396. scipy/sparse/csgraph/_reordering.cpython-313t-darwin.so +0 -0
  397. scipy/sparse/csgraph/_shortest_path.cpython-313t-darwin.so +0 -0
  398. scipy/sparse/csgraph/_tools.cpython-313t-darwin.so +0 -0
  399. scipy/sparse/csgraph/_traversal.cpython-313t-darwin.so +0 -0
  400. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  401. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  402. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  403. scipy/sparse/csr.py +0 -5
  404. scipy/sparse/data.py +1 -6
  405. scipy/sparse/dia.py +0 -7
  406. scipy/sparse/dok.py +0 -10
  407. scipy/sparse/linalg/_dsolve/_superlu.cpython-313t-darwin.so +0 -0
  408. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  409. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  410. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313t-darwin.so +0 -0
  411. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  412. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  413. scipy/sparse/linalg/_interface.py +17 -18
  414. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  415. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  416. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  417. scipy/sparse/linalg/_isolve/minres.py +5 -5
  418. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  419. scipy/sparse/linalg/_isolve/utils.py +2 -8
  420. scipy/sparse/linalg/_matfuncs.py +1 -1
  421. scipy/sparse/linalg/_norm.py +1 -1
  422. scipy/sparse/linalg/_propack/_cpropack.cpython-313t-darwin.so +0 -0
  423. scipy/sparse/linalg/_propack/_dpropack.cpython-313t-darwin.so +0 -0
  424. scipy/sparse/linalg/_propack/_spropack.cpython-313t-darwin.so +0 -0
  425. scipy/sparse/linalg/_propack/_zpropack.cpython-313t-darwin.so +0 -0
  426. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  427. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  428. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  429. scipy/sparse/tests/test_base.py +214 -42
  430. scipy/sparse/tests/test_common1d.py +7 -7
  431. scipy/sparse/tests/test_construct.py +1 -1
  432. scipy/sparse/tests/test_coo.py +272 -4
  433. scipy/sparse/tests/test_sparsetools.py +5 -0
  434. scipy/sparse/tests/test_sputils.py +36 -7
  435. scipy/spatial/_ckdtree.cpython-313t-darwin.so +0 -0
  436. scipy/spatial/_distance_pybind.cpython-313t-darwin.so +0 -0
  437. scipy/spatial/_distance_wrap.cpython-313t-darwin.so +0 -0
  438. scipy/spatial/_hausdorff.cpython-313t-darwin.so +0 -0
  439. scipy/spatial/_qhull.cpython-313t-darwin.so +0 -0
  440. scipy/spatial/_voronoi.cpython-313t-darwin.so +0 -0
  441. scipy/spatial/distance.py +49 -42
  442. scipy/spatial/tests/test_distance.py +15 -1
  443. scipy/spatial/tests/test_kdtree.py +1 -0
  444. scipy/spatial/tests/test_qhull.py +7 -2
  445. scipy/spatial/transform/__init__.py +5 -3
  446. scipy/spatial/transform/_rigid_transform.cpython-313t-darwin.so +0 -0
  447. scipy/spatial/transform/_rotation.cpython-313t-darwin.so +0 -0
  448. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  449. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  450. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  451. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  452. scipy/special/__init__.py +1 -47
  453. scipy/special/_add_newdocs.py +34 -772
  454. scipy/special/_basic.py +22 -25
  455. scipy/special/_comb.cpython-313t-darwin.so +0 -0
  456. scipy/special/_ellip_harm_2.cpython-313t-darwin.so +0 -0
  457. scipy/special/_gufuncs.cpython-313t-darwin.so +0 -0
  458. scipy/special/_logsumexp.py +67 -58
  459. scipy/special/_orthogonal.pyi +1 -1
  460. scipy/special/_specfun.cpython-313t-darwin.so +0 -0
  461. scipy/special/_special_ufuncs.cpython-313t-darwin.so +0 -0
  462. scipy/special/_spherical_bessel.py +4 -4
  463. scipy/special/_support_alternative_backends.py +212 -119
  464. scipy/special/_test_internal.cpython-313t-darwin.so +0 -0
  465. scipy/special/_testutils.py +4 -4
  466. scipy/special/_ufuncs.cpython-313t-darwin.so +0 -0
  467. scipy/special/_ufuncs.pyi +1 -0
  468. scipy/special/_ufuncs.pyx +215 -1400
  469. scipy/special/_ufuncs_cxx.cpython-313t-darwin.so +0 -0
  470. scipy/special/_ufuncs_cxx.pxd +2 -15
  471. scipy/special/_ufuncs_cxx.pyx +5 -44
  472. scipy/special/_ufuncs_cxx_defs.h +2 -16
  473. scipy/special/_ufuncs_defs.h +0 -8
  474. scipy/special/cython_special.cpython-313t-darwin.so +0 -0
  475. scipy/special/cython_special.pxd +1 -1
  476. scipy/special/tests/_cython_examples/meson.build +10 -1
  477. scipy/special/tests/test_basic.py +153 -20
  478. scipy/special/tests/test_boost_ufuncs.py +3 -0
  479. scipy/special/tests/test_cdflib.py +35 -11
  480. scipy/special/tests/test_gammainc.py +16 -0
  481. scipy/special/tests/test_hyp2f1.py +2 -2
  482. scipy/special/tests/test_log1mexp.py +85 -0
  483. scipy/special/tests/test_logsumexp.py +206 -64
  484. scipy/special/tests/test_mpmath.py +1 -0
  485. scipy/special/tests/test_nan_inputs.py +1 -1
  486. scipy/special/tests/test_orthogonal.py +17 -18
  487. scipy/special/tests/test_sf_error.py +3 -2
  488. scipy/special/tests/test_sph_harm.py +6 -7
  489. scipy/special/tests/test_support_alternative_backends.py +211 -76
  490. scipy/stats/__init__.py +4 -1
  491. scipy/stats/_ansari_swilk_statistics.cpython-313t-darwin.so +0 -0
  492. scipy/stats/_axis_nan_policy.py +5 -12
  493. scipy/stats/_biasedurn.cpython-313t-darwin.so +0 -0
  494. scipy/stats/_continued_fraction.py +387 -0
  495. scipy/stats/_continuous_distns.py +277 -310
  496. scipy/stats/_correlation.py +1 -1
  497. scipy/stats/_covariance.py +6 -3
  498. scipy/stats/_discrete_distns.py +39 -32
  499. scipy/stats/_distn_infrastructure.py +39 -12
  500. scipy/stats/_distribution_infrastructure.py +900 -238
  501. scipy/stats/_entropy.py +9 -10
  502. scipy/{_lib → stats}/_finite_differences.py +1 -1
  503. scipy/stats/_hypotests.py +83 -50
  504. scipy/stats/_kde.py +53 -49
  505. scipy/stats/_ksstats.py +1 -1
  506. scipy/stats/_levy_stable/__init__.py +7 -15
  507. scipy/stats/_levy_stable/levyst.cpython-313t-darwin.so +0 -0
  508. scipy/stats/_morestats.py +118 -73
  509. scipy/stats/_mstats_basic.py +13 -17
  510. scipy/stats/_mstats_extras.py +8 -8
  511. scipy/stats/_multivariate.py +89 -113
  512. scipy/stats/_new_distributions.py +97 -20
  513. scipy/stats/_page_trend_test.py +12 -5
  514. scipy/stats/_probability_distribution.py +265 -43
  515. scipy/stats/_qmc.py +14 -9
  516. scipy/stats/_qmc_cy.cpython-313t-darwin.so +0 -0
  517. scipy/stats/_qmvnt.py +16 -95
  518. scipy/stats/_qmvnt_cy.cpython-313t-darwin.so +0 -0
  519. scipy/stats/_quantile.py +335 -0
  520. scipy/stats/_rcont/rcont.cpython-313t-darwin.so +0 -0
  521. scipy/stats/_resampling.py +4 -29
  522. scipy/stats/_sampling.py +1 -1
  523. scipy/stats/_sobol.cpython-313t-darwin.so +0 -0
  524. scipy/stats/_stats.cpython-313t-darwin.so +0 -0
  525. scipy/stats/_stats_mstats_common.py +21 -2
  526. scipy/stats/_stats_py.py +550 -476
  527. scipy/stats/_stats_pythran.cpython-313t-darwin.so +0 -0
  528. scipy/stats/_unuran/unuran_wrapper.cpython-313t-darwin.so +0 -0
  529. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  530. scipy/stats/_variation.py +6 -8
  531. scipy/stats/_wilcoxon.py +13 -7
  532. scipy/stats/tests/common_tests.py +6 -4
  533. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  534. scipy/stats/tests/test_continued_fraction.py +173 -0
  535. scipy/stats/tests/test_continuous.py +379 -60
  536. scipy/stats/tests/test_continuous_basic.py +18 -12
  537. scipy/stats/tests/test_discrete_basic.py +14 -8
  538. scipy/stats/tests/test_discrete_distns.py +16 -16
  539. scipy/stats/tests/test_distributions.py +95 -75
  540. scipy/stats/tests/test_entropy.py +40 -48
  541. scipy/stats/tests/test_fit.py +4 -3
  542. scipy/stats/tests/test_hypotests.py +153 -24
  543. scipy/stats/tests/test_kdeoth.py +109 -41
  544. scipy/stats/tests/test_marray.py +289 -0
  545. scipy/stats/tests/test_morestats.py +79 -47
  546. scipy/stats/tests/test_mstats_basic.py +3 -3
  547. scipy/stats/tests/test_multivariate.py +434 -83
  548. scipy/stats/tests/test_qmc.py +13 -10
  549. scipy/stats/tests/test_quantile.py +199 -0
  550. scipy/stats/tests/test_rank.py +119 -112
  551. scipy/stats/tests/test_resampling.py +47 -56
  552. scipy/stats/tests/test_sampling.py +9 -4
  553. scipy/stats/tests/test_stats.py +799 -939
  554. scipy/stats/tests/test_variation.py +8 -6
  555. scipy/version.py +2 -2
  556. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  557. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  558. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +559 -566
  559. scipy-1.16.0rc2.dist-info/WHEEL +6 -0
  560. scipy/_lib/array_api_extra/_funcs.py +0 -484
  561. scipy/_lib/array_api_extra/_typing.py +0 -8
  562. scipy/interpolate/_bspl.cpython-313t-darwin.so +0 -0
  563. scipy/optimize/_cobyla.cpython-313t-darwin.so +0 -0
  564. scipy/optimize/_cython_nnls.cpython-313t-darwin.so +0 -0
  565. scipy/optimize/_slsqp.cpython-313t-darwin.so +0 -0
  566. scipy/spatial/qhull_src/COPYING.txt +0 -38
  567. scipy/special/libsf_error_state.dylib +0 -0
  568. scipy/special/tests/test_log_softmax.py +0 -109
  569. scipy/special/tests/test_xsf_cuda.py +0 -114
  570. scipy/special/xsf/binom.h +0 -89
  571. scipy/special/xsf/cdflib.h +0 -100
  572. scipy/special/xsf/cephes/airy.h +0 -307
  573. scipy/special/xsf/cephes/besselpoly.h +0 -51
  574. scipy/special/xsf/cephes/beta.h +0 -257
  575. scipy/special/xsf/cephes/cbrt.h +0 -131
  576. scipy/special/xsf/cephes/chbevl.h +0 -85
  577. scipy/special/xsf/cephes/chdtr.h +0 -193
  578. scipy/special/xsf/cephes/const.h +0 -87
  579. scipy/special/xsf/cephes/ellie.h +0 -293
  580. scipy/special/xsf/cephes/ellik.h +0 -251
  581. scipy/special/xsf/cephes/ellpe.h +0 -107
  582. scipy/special/xsf/cephes/ellpk.h +0 -117
  583. scipy/special/xsf/cephes/expn.h +0 -260
  584. scipy/special/xsf/cephes/gamma.h +0 -398
  585. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  586. scipy/special/xsf/cephes/hyperg.h +0 -361
  587. scipy/special/xsf/cephes/i0.h +0 -149
  588. scipy/special/xsf/cephes/i1.h +0 -158
  589. scipy/special/xsf/cephes/igam.h +0 -421
  590. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  591. scipy/special/xsf/cephes/igami.h +0 -313
  592. scipy/special/xsf/cephes/j0.h +0 -225
  593. scipy/special/xsf/cephes/j1.h +0 -198
  594. scipy/special/xsf/cephes/jv.h +0 -715
  595. scipy/special/xsf/cephes/k0.h +0 -164
  596. scipy/special/xsf/cephes/k1.h +0 -163
  597. scipy/special/xsf/cephes/kn.h +0 -243
  598. scipy/special/xsf/cephes/lanczos.h +0 -112
  599. scipy/special/xsf/cephes/ndtr.h +0 -275
  600. scipy/special/xsf/cephes/poch.h +0 -85
  601. scipy/special/xsf/cephes/polevl.h +0 -167
  602. scipy/special/xsf/cephes/psi.h +0 -194
  603. scipy/special/xsf/cephes/rgamma.h +0 -111
  604. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  605. scipy/special/xsf/cephes/shichi.h +0 -248
  606. scipy/special/xsf/cephes/sici.h +0 -224
  607. scipy/special/xsf/cephes/sindg.h +0 -221
  608. scipy/special/xsf/cephes/tandg.h +0 -139
  609. scipy/special/xsf/cephes/trig.h +0 -58
  610. scipy/special/xsf/cephes/unity.h +0 -186
  611. scipy/special/xsf/cephes/zeta.h +0 -172
  612. scipy/special/xsf/config.h +0 -304
  613. scipy/special/xsf/digamma.h +0 -205
  614. scipy/special/xsf/error.h +0 -57
  615. scipy/special/xsf/evalpoly.h +0 -47
  616. scipy/special/xsf/expint.h +0 -266
  617. scipy/special/xsf/hyp2f1.h +0 -694
  618. scipy/special/xsf/iv_ratio.h +0 -173
  619. scipy/special/xsf/lambertw.h +0 -150
  620. scipy/special/xsf/loggamma.h +0 -163
  621. scipy/special/xsf/sici.h +0 -200
  622. scipy/special/xsf/tools.h +0 -427
  623. scipy/special/xsf/trig.h +0 -164
  624. scipy/special/xsf/wright_bessel.h +0 -843
  625. scipy/special/xsf/zlog1.h +0 -35
  626. scipy/stats/_mvn.cpython-313t-darwin.so +0 -0
  627. scipy-1.15.3.dist-info/WHEEL +0 -4
@@ -6,13 +6,13 @@ import numpy as np
6
6
 
7
7
  from scipy import stats
8
8
  from scipy.stats import norm, expon # type: ignore[attr-defined]
9
- from scipy.conftest import array_api_compatible
10
- from scipy._lib._array_api import array_namespace, is_array_api_strict, is_jax
11
9
  from scipy._lib._array_api_no_0d import (xp_assert_close, xp_assert_equal,
12
10
  xp_assert_less)
13
11
 
12
+ skip_xp_backends = pytest.mark.skip_xp_backends
13
+
14
+ @pytest.mark.skip_xp_backends("dask.array", reason="boolean index assignment")
14
15
  class TestEntropy:
15
- @array_api_compatible
16
16
  def test_entropy_positive(self, xp):
17
17
  # See ticket #497
18
18
  pk = xp.asarray([0.5, 0.2, 0.3])
@@ -22,33 +22,29 @@ class TestEntropy:
22
22
  xp_assert_equal(eself, xp.asarray(0.))
23
23
  xp_assert_less(-edouble, xp.asarray(0.))
24
24
 
25
- @array_api_compatible
26
25
  def test_entropy_base(self, xp):
27
26
  pk = xp.ones(16)
28
27
  S = stats.entropy(pk, base=2.)
29
28
  xp_assert_less(xp.abs(S - 4.), xp.asarray(1.e-5))
30
29
 
31
30
  qk = xp.ones(16)
32
- qk = xp.where(xp.arange(16) < 8, xp.asarray(2.), qk)
31
+ qk = xp.where(xp.arange(16) < 8, 2., qk)
33
32
  S = stats.entropy(pk, qk)
34
33
  S2 = stats.entropy(pk, qk, base=2.)
35
34
  xp_assert_less(xp.abs(S/S2 - math.log(2.)), xp.asarray(1.e-5))
36
35
 
37
- @array_api_compatible
38
36
  def test_entropy_zero(self, xp):
39
37
  # Test for PR-479
40
38
  x = xp.asarray([0., 1., 2.])
41
39
  xp_assert_close(stats.entropy(x),
42
40
  xp.asarray(0.63651416829481278))
43
41
 
44
- @array_api_compatible
45
42
  def test_entropy_2d(self, xp):
46
43
  pk = xp.asarray([[0.1, 0.2], [0.6, 0.3], [0.3, 0.5]])
47
44
  qk = xp.asarray([[0.2, 0.1], [0.3, 0.6], [0.5, 0.3]])
48
45
  xp_assert_close(stats.entropy(pk, qk),
49
46
  xp.asarray([0.1933259, 0.18609809]))
50
47
 
51
- @array_api_compatible
52
48
  def test_entropy_2d_zero(self, xp):
53
49
  pk = xp.asarray([[0.1, 0.2], [0.6, 0.3], [0.3, 0.5]])
54
50
  qk = xp.asarray([[0.0, 0.1], [0.3, 0.6], [0.5, 0.3]])
@@ -59,20 +55,17 @@ class TestEntropy:
59
55
  xp_assert_close(stats.entropy(pk, qk),
60
56
  xp.asarray([0.17403988, 0.18609809]))
61
57
 
62
- @array_api_compatible
63
58
  def test_entropy_base_2d_nondefault_axis(self, xp):
64
59
  pk = xp.asarray([[0.1, 0.2], [0.6, 0.3], [0.3, 0.5]])
65
60
  xp_assert_close(stats.entropy(pk, axis=1),
66
61
  xp.asarray([0.63651417, 0.63651417, 0.66156324]))
67
62
 
68
- @array_api_compatible
69
63
  def test_entropy_2d_nondefault_axis(self, xp):
70
64
  pk = xp.asarray([[0.1, 0.2], [0.6, 0.3], [0.3, 0.5]])
71
65
  qk = xp.asarray([[0.2, 0.1], [0.3, 0.6], [0.5, 0.3]])
72
66
  xp_assert_close(stats.entropy(pk, qk, axis=1),
73
67
  xp.asarray([0.23104906, 0.23104906, 0.12770641]))
74
68
 
75
- @array_api_compatible
76
69
  def test_entropy_raises_value_error(self, xp):
77
70
  pk = xp.asarray([[0.1, 0.2], [0.6, 0.3], [0.3, 0.5]])
78
71
  qk = xp.asarray([[0.1, 0.2], [0.6, 0.3]])
@@ -80,33 +73,28 @@ class TestEntropy:
80
73
  with pytest.raises(ValueError, match=message):
81
74
  stats.entropy(pk, qk)
82
75
 
83
- @array_api_compatible
84
76
  def test_base_entropy_with_axis_0_is_equal_to_default(self, xp):
85
77
  pk = xp.asarray([[0.1, 0.2], [0.6, 0.3], [0.3, 0.5]])
86
78
  xp_assert_close(stats.entropy(pk, axis=0),
87
79
  stats.entropy(pk))
88
80
 
89
- @array_api_compatible
90
81
  def test_entropy_with_axis_0_is_equal_to_default(self, xp):
91
82
  pk = xp.asarray([[0.1, 0.2], [0.6, 0.3], [0.3, 0.5]])
92
83
  qk = xp.asarray([[0.2, 0.1], [0.3, 0.6], [0.5, 0.3]])
93
84
  xp_assert_close(stats.entropy(pk, qk, axis=0),
94
85
  stats.entropy(pk, qk))
95
86
 
96
- @array_api_compatible
97
87
  def test_base_entropy_transposed(self, xp):
98
88
  pk = xp.asarray([[0.1, 0.2], [0.6, 0.3], [0.3, 0.5]])
99
89
  xp_assert_close(stats.entropy(pk.T),
100
90
  stats.entropy(pk, axis=1))
101
91
 
102
- @array_api_compatible
103
92
  def test_entropy_transposed(self, xp):
104
93
  pk = xp.asarray([[0.1, 0.2], [0.6, 0.3], [0.3, 0.5]])
105
94
  qk = xp.asarray([[0.2, 0.1], [0.3, 0.6], [0.5, 0.3]])
106
95
  xp_assert_close(stats.entropy(pk.T, qk.T),
107
96
  stats.entropy(pk, qk, axis=1))
108
97
 
109
- @array_api_compatible
110
98
  def test_entropy_broadcasting(self, xp):
111
99
  rng = np.random.default_rng(74187315492831452)
112
100
  x = xp.asarray(rng.random(3))
@@ -115,7 +103,6 @@ class TestEntropy:
115
103
  xp_assert_equal(res[0], stats.entropy(x, y[0, ...]))
116
104
  xp_assert_equal(res[1], stats.entropy(x, y[1, ...]))
117
105
 
118
- @array_api_compatible
119
106
  def test_entropy_shape_mismatch(self, xp):
120
107
  x = xp.ones((10, 1, 12))
121
108
  y = xp.ones((11, 2))
@@ -123,7 +110,6 @@ class TestEntropy:
123
110
  with pytest.raises(ValueError, match=message):
124
111
  stats.entropy(x, y)
125
112
 
126
- @array_api_compatible
127
113
  def test_input_validation(self, xp):
128
114
  x = xp.ones(10)
129
115
  message = "`base` must be a positive number."
@@ -131,8 +117,7 @@ class TestEntropy:
131
117
  stats.entropy(x, base=-2)
132
118
 
133
119
 
134
- @array_api_compatible
135
- @pytest.mark.usefixtures("skip_xp_backends")
120
+ @pytest.mark.skip_xp_backends("dask.array", reason="boolean index assignment")
136
121
  class TestDifferentialEntropy:
137
122
  """
138
123
  Vasicek results are compared with the R package vsgoftest.
@@ -207,8 +192,6 @@ class TestDifferentialEntropy:
207
192
  axis=1,
208
193
  )
209
194
 
210
- @pytest.mark.skip_xp_backends('jax.numpy',
211
- reason="JAX doesn't support item assignment")
212
195
  def test_base_differential_entropy_with_axis_0_is_equal_to_default(self, xp):
213
196
  random_state = np.random.RandomState(0)
214
197
  values = random_state.standard_normal((100, 3))
@@ -218,8 +201,6 @@ class TestDifferentialEntropy:
218
201
  default_entropy = stats.differential_entropy(values)
219
202
  xp_assert_close(entropy, default_entropy)
220
203
 
221
- @pytest.mark.skip_xp_backends('jax.numpy',
222
- reason="JAX doesn't support item assignment")
223
204
  def test_base_differential_entropy_transposed(self, xp):
224
205
  random_state = np.random.RandomState(0)
225
206
  values = random_state.standard_normal((3, 100))
@@ -242,13 +223,17 @@ class TestDifferentialEntropy:
242
223
  with pytest.raises(ValueError, match=message):
243
224
  stats.differential_entropy(x, method='ekki-ekki')
244
225
 
245
- @pytest.mark.parametrize('method', ['vasicek', 'van es',
246
- 'ebrahimi', 'correa'])
226
+ @pytest.mark.parametrize('method', [
227
+ 'vasicek',
228
+ 'van es',
229
+ 'ebrahimi',
230
+ pytest.param(
231
+ 'correa',
232
+ marks=skip_xp_backends("array_api_strict",
233
+ reason="Needs fancy indexing.")
234
+ )
235
+ ])
247
236
  def test_consistency(self, method, xp):
248
- if is_jax(xp) and method == 'ebrahimi':
249
- pytest.xfail("Needs array assignment.")
250
- elif is_array_api_strict(xp) and method == 'correa':
251
- pytest.xfail("Needs fancy indexing.")
252
237
  # test that method is a consistent estimator
253
238
  n = 10000 if method == 'correa' else 1000000
254
239
  rvs = stats.norm.rvs(size=n, random_state=0)
@@ -276,17 +261,21 @@ class TestDifferentialEntropy:
276
261
  rmse_std_cases = {norm: norm_rmse_std_cases,
277
262
  expon: expon_rmse_std_cases}
278
263
 
279
- @pytest.mark.parametrize('method', ['vasicek', 'van es', 'ebrahimi', 'correa'])
264
+ @pytest.mark.parametrize('method', [
265
+ 'vasicek',
266
+ 'van es',
267
+ 'ebrahimi',
268
+ pytest.param(
269
+ 'correa',
270
+ marks=skip_xp_backends("array_api_strict",
271
+ reason="Needs fancy indexing.")
272
+ )
273
+ ])
280
274
  @pytest.mark.parametrize('dist', [norm, expon])
281
275
  def test_rmse_std(self, method, dist, xp):
282
276
  # test that RMSE and standard deviation of estimators matches values
283
277
  # given in differential_entropy reference [6]. Incidentally, also
284
278
  # tests vectorization.
285
- if is_jax(xp) and method == 'ebrahimi':
286
- pytest.xfail("Needs array assignment.")
287
- elif is_array_api_strict(xp) and method == 'correa':
288
- pytest.xfail("Needs fancy indexing.")
289
-
290
279
  reps, n, m = 10000, 50, 7
291
280
  expected = self.rmse_std_cases[dist][method]
292
281
  rmse_expected, std_expected = xp.asarray(expected[0]), xp.asarray(expected[1])
@@ -297,31 +286,34 @@ class TestDifferentialEntropy:
297
286
  method=method, axis=-1)
298
287
  xp_assert_close(xp.sqrt(xp.mean((res - true_entropy)**2)),
299
288
  rmse_expected, atol=0.005)
300
- xp_test = array_namespace(res)
301
- xp_assert_close(xp_test.std(res, correction=0), std_expected, atol=0.002)
289
+ xp_assert_close(xp.std(res, correction=0), std_expected, atol=0.002)
302
290
 
303
- @pytest.mark.parametrize('n, method', [(8, 'van es'),
304
- (12, 'ebrahimi'),
305
- (1001, 'vasicek')])
291
+ @pytest.mark.parametrize('n, method', [
292
+ (8, 'van es'),
293
+ (12, 'ebrahimi'),
294
+ (1001, 'vasicek')
295
+ ])
306
296
  def test_method_auto(self, n, method, xp):
307
- if is_jax(xp) and method == 'ebrahimi':
308
- pytest.xfail("Needs array assignment.")
309
297
  rvs = stats.norm.rvs(size=(n,), random_state=0)
310
298
  rvs = xp.asarray(rvs.tolist())
311
299
  res1 = stats.differential_entropy(rvs)
312
300
  res2 = stats.differential_entropy(rvs, method=method)
313
301
  xp_assert_equal(res1, res2)
314
302
 
315
- @pytest.mark.skip_xp_backends('jax.numpy',
316
- reason="JAX doesn't support item assignment")
317
- @pytest.mark.parametrize('method', ["vasicek", "van es", "correa", "ebrahimi"])
303
+ @pytest.mark.parametrize('method', [
304
+ "vasicek",
305
+ "van es",
306
+ pytest.param(
307
+ "correa",
308
+ marks=skip_xp_backends("array_api_strict", reason="Needs fancy indexing.")
309
+ ),
310
+ "ebrahimi"
311
+ ])
318
312
  @pytest.mark.parametrize('dtype', [None, 'float32', 'float64'])
319
313
  def test_dtypes_gh21192(self, xp, method, dtype):
320
314
  # gh-21192 noted a change in the output of method='ebrahimi'
321
315
  # with integer input. Check that the output is consistent regardless
322
316
  # of input dtype.
323
- if is_array_api_strict(xp) and method == 'correa':
324
- pytest.xfail("Needs fancy indexing.")
325
317
  x = [1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 8, 9, 10, 11]
326
318
  dtype_in = getattr(xp, str(dtype), None)
327
319
  dtype_out = getattr(xp, str(dtype), xp.asarray(1.).dtype)
@@ -42,7 +42,8 @@ mle_failing_fits = [
42
42
 
43
43
  # these pass but are XSLOW (>1s)
44
44
  mle_Xslow_fits = ['betaprime', 'crystalball', 'exponweib', 'f', 'geninvgauss',
45
- 'jf_skew_t', 'recipinvgauss', 'rel_breitwigner', 'vonmises_line']
45
+ 'jf_skew_t', 'nct', 'recipinvgauss', 'rel_breitwigner',
46
+ 'vonmises_line']
46
47
 
47
48
  # The MLE fit method of these distributions doesn't perform well when all
48
49
  # parameters are fit, so test them with the location fixed at 0.
@@ -129,10 +130,10 @@ def test_cont_fit(distname, arg, method):
129
130
 
130
131
  for fit_size in fit_sizes:
131
132
  # Note that if a fit succeeds, the other fit_sizes are skipped
132
- np.random.seed(1234)
133
+ rng = np.random.default_rng(1234)
133
134
 
134
135
  with np.errstate(all='ignore'):
135
- rvs = distfn.rvs(size=fit_size, *arg)
136
+ rvs = distfn.rvs(size=fit_size, *arg, random_state=rng)
136
137
  if method == 'MLE' and distfn.name in mle_use_floc0:
137
138
  kwds = {'floc': 0}
138
139
  else:
@@ -202,12 +202,12 @@ class TestMannWhitneyU:
202
202
  def test_auto(self):
203
203
  # Test that default method ('auto') chooses intended method
204
204
 
205
- np.random.seed(1)
205
+ rng = np.random.RandomState(1)
206
206
  n = 8 # threshold to switch from exact to asymptotic
207
207
 
208
208
  # both inputs are smaller than threshold; should use exact
209
- x = np.random.rand(n-1)
210
- y = np.random.rand(n-1)
209
+ x = rng.rand(n-1)
210
+ y = rng.rand(n-1)
211
211
  auto = mannwhitneyu(x, y)
212
212
  asymptotic = mannwhitneyu(x, y, method='asymptotic')
213
213
  exact = mannwhitneyu(x, y, method='exact')
@@ -215,8 +215,8 @@ class TestMannWhitneyU:
215
215
  assert auto.pvalue != asymptotic.pvalue
216
216
 
217
217
  # one input is smaller than threshold; should use exact
218
- x = np.random.rand(n-1)
219
- y = np.random.rand(n+1)
218
+ x = rng.rand(n-1)
219
+ y = rng.rand(n+1)
220
220
  auto = mannwhitneyu(x, y)
221
221
  asymptotic = mannwhitneyu(x, y, method='asymptotic')
222
222
  exact = mannwhitneyu(x, y, method='exact')
@@ -231,8 +231,8 @@ class TestMannWhitneyU:
231
231
  assert auto.pvalue != asymptotic.pvalue
232
232
 
233
233
  # both inputs are larger than threshold; should use asymptotic
234
- x = np.random.rand(n+1)
235
- y = np.random.rand(n+1)
234
+ x = rng.rand(n+1)
235
+ y = rng.rand(n+1)
236
236
  auto = mannwhitneyu(x, y)
237
237
  asymptotic = mannwhitneyu(x, y, method='asymptotic')
238
238
  exact = mannwhitneyu(x, y, method='exact')
@@ -241,8 +241,8 @@ class TestMannWhitneyU:
241
241
 
242
242
  # both inputs are smaller than threshold, but there is a tie
243
243
  # should use asymptotic
244
- x = np.random.rand(n-1)
245
- y = np.random.rand(n-1)
244
+ x = rng.rand(n-1)
245
+ y = rng.rand(n-1)
246
246
  y[3] = x[3]
247
247
  auto = mannwhitneyu(x, y)
248
248
  asymptotic = mannwhitneyu(x, y, method='asymptotic')
@@ -394,19 +394,19 @@ class TestMannWhitneyU:
394
394
  assert_allclose(pmf, pmf2)
395
395
 
396
396
  def test_asymptotic_behavior(self):
397
- np.random.seed(0)
397
+ rng = np.random.default_rng(12543)
398
398
 
399
399
  # for small samples, the asymptotic test is not very accurate
400
- x = np.random.rand(5)
401
- y = np.random.rand(5)
400
+ x = rng.random(5)
401
+ y = rng.random(5)
402
402
  res1 = mannwhitneyu(x, y, method="exact")
403
403
  res2 = mannwhitneyu(x, y, method="asymptotic")
404
404
  assert res1.statistic == res2.statistic
405
405
  assert np.abs(res1.pvalue - res2.pvalue) > 1e-2
406
406
 
407
407
  # for large samples, they agree reasonably well
408
- x = np.random.rand(40)
409
- y = np.random.rand(40)
408
+ x = rng.random(40)
409
+ y = rng.random(40)
410
410
  res1 = mannwhitneyu(x, y, method="exact")
411
411
  res2 = mannwhitneyu(x, y, method="asymptotic")
412
412
  assert res1.statistic == res2.statistic
@@ -860,8 +860,9 @@ class TestSomersD(_TestPythranFunc):
860
860
  shape = 4, 6
861
861
  size = np.prod(shape)
862
862
 
863
- np.random.seed(0)
864
- s = stats.multinomial.rvs(N, p=np.ones(size)/size).reshape(shape)
863
+ rng = np.random.RandomState(0)
864
+ s = stats.multinomial.rvs(N, p=np.ones(size)/size,
865
+ random_state=rng).reshape(shape)
865
866
  res = stats.somersd(s)
866
867
 
867
868
  s2 = np.insert(s, 2, np.zeros(shape[1]), axis=0)
@@ -889,9 +890,10 @@ class TestSomersD(_TestPythranFunc):
889
890
  shape = 4, 6
890
891
  size = np.prod(shape)
891
892
 
892
- np.random.seed(0)
893
+ rng = np.random.default_rng(0)
893
894
  # start with a valid contingency table
894
- s = stats.multinomial.rvs(N, p=np.ones(size)/size).reshape(shape)
895
+ s = stats.multinomial.rvs(N, p=np.ones(size)/size,
896
+ random_state=rng).reshape(shape)
895
897
 
896
898
  s5 = s - 2
897
899
  message = "All elements of the contingency table must be non-negative"
@@ -1003,6 +1005,7 @@ class TestSomersD(_TestPythranFunc):
1003
1005
  assert res.statistic == expected_statistic
1004
1006
  assert res.pvalue == (0 if positive_correlation else 1)
1005
1007
 
1008
+ @pytest.mark.thread_unsafe
1006
1009
  def test_somersd_large_inputs_gh18132(self):
1007
1010
  # Test that large inputs where potential overflows could occur give
1008
1011
  # the expected output. This is tested in the case of binary inputs.
@@ -1375,18 +1378,18 @@ class TestCvm_2samp:
1375
1378
  def test_large_sample(self):
1376
1379
  # for large samples, the statistic U gets very large
1377
1380
  # do a sanity check that p-value is not 0, 1 or nan
1378
- np.random.seed(4367)
1379
- x = distributions.norm.rvs(size=1000000)
1380
- y = distributions.norm.rvs(size=900000)
1381
+ rng = np.random.default_rng(4367)
1382
+ x = distributions.norm.rvs(size=1000000, random_state=rng)
1383
+ y = distributions.norm.rvs(size=900000, random_state=rng)
1381
1384
  r = cramervonmises_2samp(x, y)
1382
1385
  assert_(0 < r.pvalue < 1)
1383
1386
  r = cramervonmises_2samp(x, y+0.1)
1384
1387
  assert_(0 < r.pvalue < 1)
1385
1388
 
1386
1389
  def test_exact_vs_asymptotic(self):
1387
- np.random.seed(0)
1388
- x = np.random.rand(7)
1389
- y = np.random.rand(8)
1390
+ rng = np.random.RandomState(0)
1391
+ x = rng.rand(7)
1392
+ y = rng.rand(8)
1390
1393
  r1 = cramervonmises_2samp(x, y, method='exact')
1391
1394
  r2 = cramervonmises_2samp(x, y, method='asymptotic')
1392
1395
  assert_equal(r1.statistic, r2.statistic)
@@ -1640,6 +1643,11 @@ class TestTukeyHSD:
1640
1643
  with assert_raises(ValueError, match="...must be greater than one"):
1641
1644
  stats.tukey_hsd([], [2, 5], [4, 5, 6])
1642
1645
 
1646
+ def test_equal_var_input_validation(self):
1647
+ msg = "Expected a boolean value for 'equal_var'"
1648
+ with assert_raises(TypeError, match=msg):
1649
+ stats.tukey_hsd([1, 2, 3], [2, 5], [6, 7], equal_var="False")
1650
+
1643
1651
  @pytest.mark.parametrize("nargs", (0, 1))
1644
1652
  def test_not_enough_treatments(self, nargs):
1645
1653
  with assert_raises(ValueError, match="...more than 1 treatment."):
@@ -1659,6 +1667,127 @@ class TestTukeyHSD:
1659
1667
  assert_allclose(res_ttest.pvalue, res_tukey.pvalue[1, 0])
1660
1668
 
1661
1669
 
1670
+ class TestGamesHowell:
1671
+ # data with unequal variances
1672
+ data_same_size = ([24., 23., 31., 51.],
1673
+ [34., 18., 18., 26.],
1674
+ [17., 68., 59., 7.])
1675
+
1676
+ data_diff_size = ([30., 23., 51.],
1677
+ [-81., 71., -27., 63.],
1678
+ [42., 11., 29., 19., 50.],
1679
+ [23., 22., 20., 18., 9.])
1680
+
1681
+ spss_same_size = """
1682
+ Mean Diff Lower Bound Upper Bound Sig
1683
+ 0 - 1 8.25000000 -16.5492749527311 33.0492749527311 0.558733632413559
1684
+ 0 - 2 -5.50000000 -63.6702454316458 52.6702454316458 0.941147750599221
1685
+ 1 - 2 -13.7500000 -74.3174374251372 46.8174374251372 0.682983914946841
1686
+ """
1687
+
1688
+ spss_diff_size = """
1689
+ Mean Diff Lower Bound Upper Bound Sig
1690
+ 0 - 1 28.16666667 -141.985416377670 198.318749711003 0.8727542747886180
1691
+ 0 - 2 4.466666667 -37.2830676783904 46.2164010117237 0.9752628408671710
1692
+ 0 - 3 16.26666667 -35.0933112382470 67.6266445715803 0.4262506151302880
1693
+ 1 - 2 -23.70000000 -195.315617201249 147.915617201249 0.9148950609000590
1694
+ 1 - 3 -11.90000000 -188.105478728519 164.305478728519 0.9861432250093960
1695
+ 2 - 3 11.80000000 -16.2894857524254 39.8894857524254 0.4755344436335670
1696
+ """
1697
+
1698
+ @pytest.mark.xslow
1699
+ @pytest.mark.parametrize("data, res_expect_str",
1700
+ ((data_same_size, spss_same_size),
1701
+ (data_diff_size, spss_diff_size)),
1702
+ ids=["equal size sample",
1703
+ "unequal sample size"])
1704
+ def test_compare_spss(self, data, res_expect_str):
1705
+ """
1706
+ DATA LIST LIST /Group (F1.0) Value (F8.2).
1707
+ BEGIN DATA
1708
+ 0 24
1709
+ 0 23
1710
+ 0 31
1711
+ 0 51
1712
+ 1 34
1713
+ 1 18
1714
+ 1 18
1715
+ 1 26
1716
+ 2 17
1717
+ 2 68
1718
+ 2 59
1719
+ 2 7
1720
+ END DATA.
1721
+
1722
+ ONEWAY Value BY Group
1723
+ /MISSING ANALYSIS
1724
+ /POSTHOC=GH ALPHA(0.05).
1725
+ """
1726
+ res_expect = np.asarray(
1727
+ res_expect_str.replace(" - ", " ").split()[7:],
1728
+ dtype=float).reshape(-1, 6)
1729
+ res_games = stats.tukey_hsd(*data, equal_var=False)
1730
+ conf = res_games.confidence_interval()
1731
+ # loop over the comparisons
1732
+ for i, j, s, l, h, p in res_expect:
1733
+ i, j = int(i), int(j)
1734
+ assert_allclose(res_games.statistic[i, j], s, atol=1e-8)
1735
+ assert_allclose(res_games.pvalue[i, j], p, atol=1e-8)
1736
+ assert_allclose(conf.low[i, j], l, atol=1e-6)
1737
+ assert_allclose(conf.high[i, j], h, atol=1e-5)
1738
+
1739
+ r_same_size = """
1740
+ q value Pr(>|q|)
1741
+ 1 - 0 == 0 -1.5467805948856344 0.55873362851759
1742
+ 2 - 0 == 0 0.4726721776628535 0.94114775035993
1743
+ 2 - 1 == 0 1.246837541297872 0.68298393799782
1744
+ """
1745
+
1746
+ r_diff_size = """
1747
+ q value Pr(>|q|)
1748
+ 1 - 0 == 0 -1.0589317485313876 0.87275427357438
1749
+ 2 - 0 == 0 -0.5716222106144833 0.97526284087419
1750
+ 3 - 0 == 0 -2.6209678382077000 0.42625067714691
1751
+ 2 - 1 == 0 0.8971899898179028 0.91489506061850
1752
+ 3 - 1 == 0 0.4579447210555352 0.98614322544695
1753
+ 3 - 2 == 0 -2.198800177874794 0.47553444364614
1754
+ """
1755
+
1756
+ @pytest.mark.parametrize("data, res_expect_str",
1757
+ ((data_same_size, r_same_size),
1758
+ (data_diff_size, r_diff_size)),
1759
+ ids=["equal size sample",
1760
+ "unequal sample size"])
1761
+ def test_compare_r(self, data, res_expect_str):
1762
+ """
1763
+ games-howell is provided by PMCMRplus package
1764
+ https://search.r-project.org/CRAN/refmans/PMCMRplus/html/gamesHowellTest.html
1765
+ > library("PMCMRplus")
1766
+ > options(digits=16)
1767
+ > table = data.frame(
1768
+ values = c(24., 23., 31., 51., 34., 18., 18., 26., 17., 68., 59., 7.),
1769
+ groups = c("0", "0", "0", "0", "1", "1", "1", "1", "2", "2", "2", "2")
1770
+ )
1771
+ > table$groups = as.factor(table$groups)
1772
+ > fit <-aov(values ~ groups, table)
1773
+ > res = gamesHowellTest(fit)
1774
+ > summary(res)
1775
+ """
1776
+ res_expect = np.asarray(
1777
+ res_expect_str.replace(" - ", " ")
1778
+ .replace(" == ", " ").split()[3:],
1779
+ dtype=float).reshape(-1, 5)
1780
+ res_games = stats.tukey_hsd(*data, equal_var=False)
1781
+ # loop over the comparisons
1782
+ # note confidence intervals are not provided by PMCMRplus
1783
+ for j, i, _, _, p in res_expect:
1784
+ i, j = int(i), int(j)
1785
+ assert_allclose(res_games.pvalue[i, j], p, atol=1e-7)
1786
+
1787
+ # Data validation test has been covered by TestTukeyHSD
1788
+ # like empty, 1d, inf, and lack of tretments
1789
+ # because games_howell leverage _tukey_hsd_iv()
1790
+
1662
1791
  class TestPoissonMeansTest:
1663
1792
  @pytest.mark.parametrize("c1, n1, c2, n2, p_expect", (
1664
1793
  # example from [1], 6. Illustrative examples: Example 1