scipy 1.15.3__cp311-cp311-musllinux_1_2_aarch64.whl → 1.16.0rc1__cp311-cp311-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 (640) hide show
  1. scipy/__config__.py +9 -9
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cpython-311-aarch64-linux-musl.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-311-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-311-aarch64-linux-musl.so +0 -0
  11. scipy/_lib/_sparse.py +41 -0
  12. scipy/_lib/_test_ccallback.cpython-311-aarch64-linux-musl.so +0 -0
  13. scipy/_lib/_test_deprecation_call.cpython-311-aarch64-linux-musl.so +0 -0
  14. scipy/_lib/_test_deprecation_def.cpython-311-aarch64-linux-musl.so +0 -0
  15. scipy/_lib/_testutils.py +6 -2
  16. scipy/_lib/_uarray/_uarray.cpython-311-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-311-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 +166 -35
  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-311-aarch64-linux-musl.so +0 -0
  97. scipy/cluster/_optimal_leaf_ordering.cpython-311-aarch64-linux-musl.so +0 -0
  98. scipy/cluster/_vq.cpython-311-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 +263 -157
  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-311-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-311-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-311-aarch64-linux-musl.so +0 -0
  129. scipy/integrate/_lsoda.cpython-311-aarch64-linux-musl.so +0 -0
  130. scipy/integrate/_ode.py +9 -2
  131. scipy/integrate/_odepack.cpython-311-aarch64-linux-musl.so +0 -0
  132. scipy/integrate/_quad_vec.py +21 -29
  133. scipy/integrate/_quadpack.cpython-311-aarch64-linux-musl.so +0 -0
  134. scipy/integrate/_quadpack_py.py +11 -7
  135. scipy/integrate/_quadrature.py +3 -3
  136. scipy/integrate/_rules/_base.py +2 -2
  137. scipy/integrate/_tanhsinh.py +48 -47
  138. scipy/integrate/_test_multivariate.cpython-311-aarch64-linux-musl.so +0 -0
  139. scipy/integrate/_test_odeint_banded.cpython-311-aarch64-linux-musl.so +0 -0
  140. scipy/integrate/_vode.cpython-311-aarch64-linux-musl.so +0 -0
  141. scipy/integrate/tests/test__quad_vec.py +0 -6
  142. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  143. scipy/integrate/tests/test_cubature.py +21 -35
  144. scipy/integrate/tests/test_quadrature.py +6 -8
  145. scipy/integrate/tests/test_tanhsinh.py +56 -48
  146. scipy/interpolate/__init__.py +70 -58
  147. scipy/interpolate/_bary_rational.py +22 -22
  148. scipy/interpolate/_bsplines.py +119 -66
  149. scipy/interpolate/_cubic.py +65 -50
  150. scipy/interpolate/_dfitpack.cpython-311-aarch64-linux-musl.so +0 -0
  151. scipy/interpolate/_dierckx.cpython-311-aarch64-linux-musl.so +0 -0
  152. scipy/interpolate/_fitpack.cpython-311-aarch64-linux-musl.so +0 -0
  153. scipy/interpolate/_fitpack2.py +9 -6
  154. scipy/interpolate/_fitpack_impl.py +32 -26
  155. scipy/interpolate/_fitpack_repro.py +23 -19
  156. scipy/interpolate/_interpnd.cpython-311-aarch64-linux-musl.so +0 -0
  157. scipy/interpolate/_interpolate.py +30 -12
  158. scipy/interpolate/_ndbspline.py +13 -18
  159. scipy/interpolate/_ndgriddata.py +5 -8
  160. scipy/interpolate/_polyint.py +95 -31
  161. scipy/interpolate/_ppoly.cpython-311-aarch64-linux-musl.so +0 -0
  162. scipy/interpolate/_rbf.py +2 -2
  163. scipy/interpolate/_rbfinterp.py +1 -1
  164. scipy/interpolate/_rbfinterp_pythran.cpython-311-aarch64-linux-musl.so +0 -0
  165. scipy/interpolate/_rgi.py +31 -26
  166. scipy/interpolate/_rgi_cython.cpython-311-aarch64-linux-musl.so +0 -0
  167. scipy/interpolate/dfitpack.py +0 -20
  168. scipy/interpolate/interpnd.py +1 -2
  169. scipy/interpolate/tests/test_bary_rational.py +2 -2
  170. scipy/interpolate/tests/test_bsplines.py +97 -1
  171. scipy/interpolate/tests/test_fitpack2.py +39 -1
  172. scipy/interpolate/tests/test_interpnd.py +32 -20
  173. scipy/interpolate/tests/test_interpolate.py +48 -4
  174. scipy/interpolate/tests/test_rgi.py +2 -1
  175. scipy/io/_fast_matrix_market/__init__.py +2 -0
  176. scipy/io/_fast_matrix_market/_fmm_core.cpython-311-aarch64-linux-musl.so +0 -0
  177. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  178. scipy/io/_harwell_boeing/hb.py +7 -11
  179. scipy/io/_idl.py +5 -7
  180. scipy/io/_netcdf.py +15 -5
  181. scipy/io/_test_fortran.cpython-311-aarch64-linux-musl.so +0 -0
  182. scipy/io/arff/tests/test_arffread.py +3 -3
  183. scipy/io/matlab/__init__.py +5 -3
  184. scipy/io/matlab/_mio.py +4 -1
  185. scipy/io/matlab/_mio5.py +19 -13
  186. scipy/io/matlab/_mio5_utils.cpython-311-aarch64-linux-musl.so +0 -0
  187. scipy/io/matlab/_mio_utils.cpython-311-aarch64-linux-musl.so +0 -0
  188. scipy/io/matlab/_miobase.py +4 -1
  189. scipy/io/matlab/_streams.cpython-311-aarch64-linux-musl.so +0 -0
  190. scipy/io/matlab/tests/test_mio.py +46 -18
  191. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  192. scipy/io/tests/test_mmio.py +7 -1
  193. scipy/io/tests/test_wavfile.py +41 -0
  194. scipy/io/wavfile.py +57 -10
  195. scipy/linalg/_basic.py +113 -86
  196. scipy/linalg/_cythonized_array_utils.cpython-311-aarch64-linux-musl.so +0 -0
  197. scipy/linalg/_decomp.py +22 -9
  198. scipy/linalg/_decomp_cholesky.py +28 -13
  199. scipy/linalg/_decomp_cossin.py +45 -30
  200. scipy/linalg/_decomp_interpolative.cpython-311-aarch64-linux-musl.so +0 -0
  201. scipy/linalg/_decomp_ldl.py +4 -1
  202. scipy/linalg/_decomp_lu.py +18 -6
  203. scipy/linalg/_decomp_lu_cython.cpython-311-aarch64-linux-musl.so +0 -0
  204. scipy/linalg/_decomp_polar.py +2 -0
  205. scipy/linalg/_decomp_qr.py +6 -2
  206. scipy/linalg/_decomp_qz.py +3 -0
  207. scipy/linalg/_decomp_schur.py +3 -1
  208. scipy/linalg/_decomp_svd.py +13 -2
  209. scipy/linalg/_decomp_update.cpython-311-aarch64-linux-musl.so +0 -0
  210. scipy/linalg/_expm_frechet.py +4 -0
  211. scipy/linalg/_fblas.cpython-311-aarch64-linux-musl.so +0 -0
  212. scipy/linalg/_flapack.cpython-311-aarch64-linux-musl.so +0 -0
  213. scipy/linalg/_linalg_pythran.cpython-311-aarch64-linux-musl.so +0 -0
  214. scipy/linalg/_matfuncs.py +187 -4
  215. scipy/linalg/_matfuncs_expm.cpython-311-aarch64-linux-musl.so +0 -0
  216. scipy/linalg/_matfuncs_schur_sqrtm.cpython-311-aarch64-linux-musl.so +0 -0
  217. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  218. scipy/linalg/_matfuncs_sqrtm_triu.cpython-311-aarch64-linux-musl.so +0 -0
  219. scipy/linalg/_procrustes.py +2 -0
  220. scipy/linalg/_sketches.py +17 -6
  221. scipy/linalg/_solve_toeplitz.cpython-311-aarch64-linux-musl.so +0 -0
  222. scipy/linalg/_solvers.py +7 -2
  223. scipy/linalg/_special_matrices.py +26 -36
  224. scipy/linalg/cython_blas.cpython-311-aarch64-linux-musl.so +0 -0
  225. scipy/linalg/cython_lapack.cpython-311-aarch64-linux-musl.so +0 -0
  226. scipy/linalg/lapack.py +22 -2
  227. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  228. scipy/linalg/tests/test_basic.py +31 -16
  229. scipy/linalg/tests/test_batch.py +588 -0
  230. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  231. scipy/linalg/tests/test_decomp.py +40 -3
  232. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  233. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  234. scipy/linalg/tests/test_lapack.py +115 -7
  235. scipy/linalg/tests/test_matfuncs.py +157 -102
  236. scipy/linalg/tests/test_procrustes.py +0 -7
  237. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  238. scipy/linalg/tests/test_special_matrices.py +1 -5
  239. scipy/ndimage/__init__.py +1 -0
  240. scipy/ndimage/_ctest.cpython-311-aarch64-linux-musl.so +0 -0
  241. scipy/ndimage/_cytest.cpython-311-aarch64-linux-musl.so +0 -0
  242. scipy/ndimage/_delegators.py +8 -2
  243. scipy/ndimage/_filters.py +433 -5
  244. scipy/ndimage/_interpolation.py +36 -6
  245. scipy/ndimage/_measurements.py +4 -2
  246. scipy/ndimage/_morphology.py +5 -0
  247. scipy/ndimage/_nd_image.cpython-311-aarch64-linux-musl.so +0 -0
  248. scipy/ndimage/_ni_docstrings.py +5 -1
  249. scipy/ndimage/_ni_label.cpython-311-aarch64-linux-musl.so +0 -0
  250. scipy/ndimage/_ni_support.py +1 -5
  251. scipy/ndimage/_rank_filter_1d.cpython-311-aarch64-linux-musl.so +0 -0
  252. scipy/ndimage/_support_alternative_backends.py +18 -6
  253. scipy/ndimage/tests/test_filters.py +337 -259
  254. scipy/ndimage/tests/test_fourier.py +7 -9
  255. scipy/ndimage/tests/test_interpolation.py +68 -61
  256. scipy/ndimage/tests/test_measurements.py +18 -35
  257. scipy/ndimage/tests/test_morphology.py +143 -131
  258. scipy/ndimage/tests/test_splines.py +1 -3
  259. scipy/odr/__odrpack.cpython-311-aarch64-linux-musl.so +0 -0
  260. scipy/optimize/_basinhopping.py +13 -7
  261. scipy/optimize/_bglu_dense.cpython-311-aarch64-linux-musl.so +0 -0
  262. scipy/optimize/_bracket.py +17 -24
  263. scipy/optimize/_chandrupatla.py +9 -10
  264. scipy/optimize/_cobyla_py.py +104 -123
  265. scipy/optimize/_constraints.py +14 -10
  266. scipy/optimize/_differentiable_functions.py +371 -230
  267. scipy/optimize/_differentialevolution.py +4 -3
  268. scipy/optimize/_direct.cpython-311-aarch64-linux-musl.so +0 -0
  269. scipy/optimize/_dual_annealing.py +1 -1
  270. scipy/optimize/_elementwise.py +1 -4
  271. scipy/optimize/_group_columns.cpython-311-aarch64-linux-musl.so +0 -0
  272. scipy/optimize/_highspy/_core.cpython-311-aarch64-linux-musl.so +0 -0
  273. scipy/optimize/_highspy/_highs_options.cpython-311-aarch64-linux-musl.so +0 -0
  274. scipy/optimize/_lbfgsb.cpython-311-aarch64-linux-musl.so +0 -0
  275. scipy/optimize/_lbfgsb_py.py +57 -16
  276. scipy/optimize/_linprog_doc.py +2 -2
  277. scipy/optimize/_linprog_highs.py +2 -2
  278. scipy/optimize/_linprog_ip.py +25 -10
  279. scipy/optimize/_linprog_util.py +14 -16
  280. scipy/optimize/_lsap.cpython-311-aarch64-linux-musl.so +0 -0
  281. scipy/optimize/_lsq/common.py +3 -3
  282. scipy/optimize/_lsq/dogbox.py +16 -2
  283. scipy/optimize/_lsq/givens_elimination.cpython-311-aarch64-linux-musl.so +0 -0
  284. scipy/optimize/_lsq/least_squares.py +198 -126
  285. scipy/optimize/_lsq/lsq_linear.py +6 -6
  286. scipy/optimize/_lsq/trf.py +35 -8
  287. scipy/optimize/_milp.py +3 -1
  288. scipy/optimize/_minimize.py +105 -36
  289. scipy/optimize/_minpack.cpython-311-aarch64-linux-musl.so +0 -0
  290. scipy/optimize/_minpack_py.py +21 -14
  291. scipy/optimize/_moduleTNC.cpython-311-aarch64-linux-musl.so +0 -0
  292. scipy/optimize/_nnls.py +20 -21
  293. scipy/optimize/_nonlin.py +34 -3
  294. scipy/optimize/_numdiff.py +288 -110
  295. scipy/optimize/_optimize.py +86 -48
  296. scipy/optimize/_pava_pybind.cpython-311-aarch64-linux-musl.so +0 -0
  297. scipy/optimize/_remove_redundancy.py +5 -5
  298. scipy/optimize/_root_scalar.py +1 -1
  299. scipy/optimize/_shgo.py +6 -0
  300. scipy/optimize/_shgo_lib/_complex.py +1 -1
  301. scipy/optimize/_slsqp_py.py +216 -124
  302. scipy/optimize/_slsqplib.cpython-311-aarch64-linux-musl.so +0 -0
  303. scipy/optimize/_spectral.py +1 -1
  304. scipy/optimize/_tnc.py +8 -1
  305. scipy/optimize/_trlib/_trlib.cpython-311-aarch64-linux-musl.so +0 -0
  306. scipy/optimize/_trustregion.py +20 -6
  307. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  308. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  309. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  310. scipy/optimize/_trustregion_constr/projections.py +12 -8
  311. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  312. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  313. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  314. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  315. scipy/optimize/_trustregion_exact.py +0 -1
  316. scipy/optimize/_zeros.cpython-311-aarch64-linux-musl.so +0 -0
  317. scipy/optimize/_zeros_py.py +97 -17
  318. scipy/optimize/cython_optimize/_zeros.cpython-311-aarch64-linux-musl.so +0 -0
  319. scipy/optimize/slsqp.py +0 -1
  320. scipy/optimize/tests/test__basinhopping.py +1 -1
  321. scipy/optimize/tests/test__differential_evolution.py +4 -4
  322. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  323. scipy/optimize/tests/test__numdiff.py +66 -22
  324. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  325. scipy/optimize/tests/test__shgo.py +9 -1
  326. scipy/optimize/tests/test_bracket.py +36 -46
  327. scipy/optimize/tests/test_chandrupatla.py +133 -135
  328. scipy/optimize/tests/test_cobyla.py +74 -45
  329. scipy/optimize/tests/test_constraints.py +1 -1
  330. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  331. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  332. scipy/optimize/tests/test_least_squares.py +125 -13
  333. scipy/optimize/tests/test_linear_assignment.py +3 -3
  334. scipy/optimize/tests/test_linprog.py +3 -3
  335. scipy/optimize/tests/test_lsq_linear.py +5 -5
  336. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  337. scipy/optimize/tests/test_minpack.py +4 -4
  338. scipy/optimize/tests/test_nnls.py +43 -3
  339. scipy/optimize/tests/test_nonlin.py +36 -0
  340. scipy/optimize/tests/test_optimize.py +95 -17
  341. scipy/optimize/tests/test_slsqp.py +36 -4
  342. scipy/optimize/tests/test_zeros.py +34 -1
  343. scipy/signal/__init__.py +12 -23
  344. scipy/signal/_delegators.py +568 -0
  345. scipy/signal/_filter_design.py +459 -241
  346. scipy/signal/_fir_filter_design.py +262 -90
  347. scipy/signal/_lti_conversion.py +3 -2
  348. scipy/signal/_ltisys.py +118 -91
  349. scipy/signal/_max_len_seq_inner.cpython-311-aarch64-linux-musl.so +0 -0
  350. scipy/signal/_peak_finding_utils.cpython-311-aarch64-linux-musl.so +0 -0
  351. scipy/signal/_polyutils.py +172 -0
  352. scipy/signal/_short_time_fft.py +519 -70
  353. scipy/signal/_signal_api.py +30 -0
  354. scipy/signal/_signaltools.py +719 -399
  355. scipy/signal/_sigtools.cpython-311-aarch64-linux-musl.so +0 -0
  356. scipy/signal/_sosfilt.cpython-311-aarch64-linux-musl.so +0 -0
  357. scipy/signal/_spectral_py.py +221 -50
  358. scipy/signal/_spline.cpython-311-aarch64-linux-musl.so +0 -0
  359. scipy/signal/_spline_filters.py +108 -68
  360. scipy/signal/_support_alternative_backends.py +73 -0
  361. scipy/signal/_upfirdn.py +4 -1
  362. scipy/signal/_upfirdn_apply.cpython-311-aarch64-linux-musl.so +0 -0
  363. scipy/signal/_waveforms.py +2 -11
  364. scipy/signal/_wavelets.py +1 -1
  365. scipy/signal/fir_filter_design.py +1 -0
  366. scipy/signal/spline.py +4 -11
  367. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  368. scipy/signal/tests/test_bsplines.py +114 -79
  369. scipy/signal/tests/test_cont2discrete.py +9 -2
  370. scipy/signal/tests/test_filter_design.py +721 -481
  371. scipy/signal/tests/test_fir_filter_design.py +332 -140
  372. scipy/signal/tests/test_savitzky_golay.py +4 -3
  373. scipy/signal/tests/test_short_time_fft.py +221 -3
  374. scipy/signal/tests/test_signaltools.py +2144 -1348
  375. scipy/signal/tests/test_spectral.py +19 -6
  376. scipy/signal/tests/test_splines.py +161 -96
  377. scipy/signal/tests/test_upfirdn.py +84 -50
  378. scipy/signal/tests/test_waveforms.py +20 -0
  379. scipy/signal/tests/test_windows.py +607 -466
  380. scipy/signal/windows/_windows.py +287 -148
  381. scipy/sparse/__init__.py +23 -4
  382. scipy/sparse/_base.py +270 -108
  383. scipy/sparse/_bsr.py +7 -4
  384. scipy/sparse/_compressed.py +59 -231
  385. scipy/sparse/_construct.py +90 -38
  386. scipy/sparse/_coo.py +115 -181
  387. scipy/sparse/_csc.py +4 -4
  388. scipy/sparse/_csparsetools.cpython-311-aarch64-linux-musl.so +0 -0
  389. scipy/sparse/_csr.py +2 -2
  390. scipy/sparse/_data.py +48 -48
  391. scipy/sparse/_dia.py +105 -18
  392. scipy/sparse/_dok.py +0 -23
  393. scipy/sparse/_index.py +4 -4
  394. scipy/sparse/_matrix.py +23 -0
  395. scipy/sparse/_sparsetools.cpython-311-aarch64-linux-musl.so +0 -0
  396. scipy/sparse/_sputils.py +37 -22
  397. scipy/sparse/base.py +0 -9
  398. scipy/sparse/bsr.py +0 -14
  399. scipy/sparse/compressed.py +0 -23
  400. scipy/sparse/construct.py +0 -6
  401. scipy/sparse/coo.py +0 -14
  402. scipy/sparse/csc.py +0 -3
  403. scipy/sparse/csgraph/_flow.cpython-311-aarch64-linux-musl.so +0 -0
  404. scipy/sparse/csgraph/_matching.cpython-311-aarch64-linux-musl.so +0 -0
  405. scipy/sparse/csgraph/_min_spanning_tree.cpython-311-aarch64-linux-musl.so +0 -0
  406. scipy/sparse/csgraph/_reordering.cpython-311-aarch64-linux-musl.so +0 -0
  407. scipy/sparse/csgraph/_shortest_path.cpython-311-aarch64-linux-musl.so +0 -0
  408. scipy/sparse/csgraph/_tools.cpython-311-aarch64-linux-musl.so +0 -0
  409. scipy/sparse/csgraph/_traversal.cpython-311-aarch64-linux-musl.so +0 -0
  410. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  411. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  412. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  413. scipy/sparse/csr.py +0 -5
  414. scipy/sparse/data.py +1 -6
  415. scipy/sparse/dia.py +0 -7
  416. scipy/sparse/dok.py +0 -10
  417. scipy/sparse/linalg/_dsolve/_superlu.cpython-311-aarch64-linux-musl.so +0 -0
  418. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  419. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  420. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-311-aarch64-linux-musl.so +0 -0
  421. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  422. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  423. scipy/sparse/linalg/_interface.py +17 -18
  424. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  425. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  426. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  427. scipy/sparse/linalg/_isolve/minres.py +5 -5
  428. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  429. scipy/sparse/linalg/_isolve/utils.py +2 -8
  430. scipy/sparse/linalg/_matfuncs.py +1 -1
  431. scipy/sparse/linalg/_norm.py +1 -1
  432. scipy/sparse/linalg/_propack/_cpropack.cpython-311-aarch64-linux-musl.so +0 -0
  433. scipy/sparse/linalg/_propack/_dpropack.cpython-311-aarch64-linux-musl.so +0 -0
  434. scipy/sparse/linalg/_propack/_spropack.cpython-311-aarch64-linux-musl.so +0 -0
  435. scipy/sparse/linalg/_propack/_zpropack.cpython-311-aarch64-linux-musl.so +0 -0
  436. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  437. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  438. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  439. scipy/sparse/tests/test_base.py +207 -42
  440. scipy/sparse/tests/test_common1d.py +7 -7
  441. scipy/sparse/tests/test_construct.py +1 -1
  442. scipy/sparse/tests/test_coo.py +272 -4
  443. scipy/sparse/tests/test_sparsetools.py +5 -0
  444. scipy/sparse/tests/test_sputils.py +36 -7
  445. scipy/spatial/_ckdtree.cpython-311-aarch64-linux-musl.so +0 -0
  446. scipy/spatial/_distance_pybind.cpython-311-aarch64-linux-musl.so +0 -0
  447. scipy/spatial/_distance_wrap.cpython-311-aarch64-linux-musl.so +0 -0
  448. scipy/spatial/_hausdorff.cpython-311-aarch64-linux-musl.so +0 -0
  449. scipy/spatial/_qhull.cpython-311-aarch64-linux-musl.so +0 -0
  450. scipy/spatial/_voronoi.cpython-311-aarch64-linux-musl.so +0 -0
  451. scipy/spatial/distance.py +49 -42
  452. scipy/spatial/tests/test_distance.py +3 -1
  453. scipy/spatial/tests/test_kdtree.py +1 -0
  454. scipy/spatial/tests/test_qhull.py +7 -2
  455. scipy/spatial/transform/__init__.py +5 -3
  456. scipy/spatial/transform/_rigid_transform.cpython-311-aarch64-linux-musl.so +0 -0
  457. scipy/spatial/transform/_rotation.cpython-311-aarch64-linux-musl.so +0 -0
  458. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  459. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  460. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  461. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  462. scipy/special/__init__.py +1 -47
  463. scipy/special/_add_newdocs.py +34 -772
  464. scipy/special/_basic.py +22 -25
  465. scipy/special/_comb.cpython-311-aarch64-linux-musl.so +0 -0
  466. scipy/special/_ellip_harm_2.cpython-311-aarch64-linux-musl.so +0 -0
  467. scipy/special/_gufuncs.cpython-311-aarch64-linux-musl.so +0 -0
  468. scipy/special/_logsumexp.py +67 -58
  469. scipy/special/_orthogonal.pyi +1 -1
  470. scipy/special/_specfun.cpython-311-aarch64-linux-musl.so +0 -0
  471. scipy/special/_special_ufuncs.cpython-311-aarch64-linux-musl.so +0 -0
  472. scipy/special/_spherical_bessel.py +4 -4
  473. scipy/special/_support_alternative_backends.py +212 -119
  474. scipy/special/_test_internal.cpython-311-aarch64-linux-musl.so +0 -0
  475. scipy/special/_testutils.py +4 -4
  476. scipy/special/_ufuncs.cpython-311-aarch64-linux-musl.so +0 -0
  477. scipy/special/_ufuncs.pyi +1 -0
  478. scipy/special/_ufuncs.pyx +215 -1400
  479. scipy/special/_ufuncs_cxx.cpython-311-aarch64-linux-musl.so +0 -0
  480. scipy/special/_ufuncs_cxx.pxd +2 -15
  481. scipy/special/_ufuncs_cxx.pyx +5 -44
  482. scipy/special/_ufuncs_cxx_defs.h +2 -16
  483. scipy/special/_ufuncs_defs.h +0 -8
  484. scipy/special/cython_special.cpython-311-aarch64-linux-musl.so +0 -0
  485. scipy/special/cython_special.pxd +1 -1
  486. scipy/special/tests/_cython_examples/meson.build +10 -1
  487. scipy/special/tests/test_basic.py +153 -20
  488. scipy/special/tests/test_boost_ufuncs.py +3 -0
  489. scipy/special/tests/test_cdflib.py +35 -11
  490. scipy/special/tests/test_gammainc.py +16 -0
  491. scipy/special/tests/test_hyp2f1.py +2 -2
  492. scipy/special/tests/test_log1mexp.py +85 -0
  493. scipy/special/tests/test_logsumexp.py +206 -64
  494. scipy/special/tests/test_mpmath.py +1 -0
  495. scipy/special/tests/test_nan_inputs.py +1 -1
  496. scipy/special/tests/test_orthogonal.py +17 -18
  497. scipy/special/tests/test_sf_error.py +3 -2
  498. scipy/special/tests/test_sph_harm.py +6 -7
  499. scipy/special/tests/test_support_alternative_backends.py +211 -76
  500. scipy/stats/__init__.py +4 -1
  501. scipy/stats/_ansari_swilk_statistics.cpython-311-aarch64-linux-musl.so +0 -0
  502. scipy/stats/_axis_nan_policy.py +4 -3
  503. scipy/stats/_biasedurn.cpython-311-aarch64-linux-musl.so +0 -0
  504. scipy/stats/_continued_fraction.py +387 -0
  505. scipy/stats/_continuous_distns.py +277 -310
  506. scipy/stats/_covariance.py +6 -3
  507. scipy/stats/_discrete_distns.py +39 -32
  508. scipy/stats/_distn_infrastructure.py +39 -12
  509. scipy/stats/_distribution_infrastructure.py +900 -238
  510. scipy/stats/_entropy.py +7 -8
  511. scipy/{_lib → stats}/_finite_differences.py +1 -1
  512. scipy/stats/_hypotests.py +82 -49
  513. scipy/stats/_kde.py +53 -49
  514. scipy/stats/_ksstats.py +1 -1
  515. scipy/stats/_levy_stable/__init__.py +7 -15
  516. scipy/stats/_levy_stable/levyst.cpython-311-aarch64-linux-musl.so +0 -0
  517. scipy/stats/_morestats.py +112 -67
  518. scipy/stats/_mstats_basic.py +13 -17
  519. scipy/stats/_mstats_extras.py +8 -8
  520. scipy/stats/_multivariate.py +89 -113
  521. scipy/stats/_new_distributions.py +97 -20
  522. scipy/stats/_page_trend_test.py +12 -5
  523. scipy/stats/_probability_distribution.py +265 -43
  524. scipy/stats/_qmc.py +14 -9
  525. scipy/stats/_qmc_cy.cpython-311-aarch64-linux-musl.so +0 -0
  526. scipy/stats/_qmvnt.py +16 -95
  527. scipy/stats/_qmvnt_cy.cpython-311-aarch64-linux-musl.so +0 -0
  528. scipy/stats/_quantile.py +335 -0
  529. scipy/stats/_rcont/rcont.cpython-311-aarch64-linux-musl.so +0 -0
  530. scipy/stats/_resampling.py +4 -29
  531. scipy/stats/_sampling.py +1 -1
  532. scipy/stats/_sobol.cpython-311-aarch64-linux-musl.so +0 -0
  533. scipy/stats/_stats.cpython-311-aarch64-linux-musl.so +0 -0
  534. scipy/stats/_stats_mstats_common.py +19 -2
  535. scipy/stats/_stats_py.py +534 -460
  536. scipy/stats/_stats_pythran.cpython-311-aarch64-linux-musl.so +0 -0
  537. scipy/stats/_unuran/unuran_wrapper.cpython-311-aarch64-linux-musl.so +0 -0
  538. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  539. scipy/stats/_variation.py +5 -7
  540. scipy/stats/_wilcoxon.py +13 -7
  541. scipy/stats/tests/common_tests.py +6 -4
  542. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  543. scipy/stats/tests/test_continued_fraction.py +173 -0
  544. scipy/stats/tests/test_continuous.py +379 -60
  545. scipy/stats/tests/test_continuous_basic.py +18 -12
  546. scipy/stats/tests/test_discrete_basic.py +14 -8
  547. scipy/stats/tests/test_discrete_distns.py +16 -16
  548. scipy/stats/tests/test_distributions.py +95 -75
  549. scipy/stats/tests/test_entropy.py +40 -48
  550. scipy/stats/tests/test_fit.py +4 -3
  551. scipy/stats/tests/test_hypotests.py +153 -24
  552. scipy/stats/tests/test_kdeoth.py +109 -41
  553. scipy/stats/tests/test_marray.py +289 -0
  554. scipy/stats/tests/test_morestats.py +79 -47
  555. scipy/stats/tests/test_mstats_basic.py +3 -3
  556. scipy/stats/tests/test_multivariate.py +434 -83
  557. scipy/stats/tests/test_qmc.py +13 -10
  558. scipy/stats/tests/test_quantile.py +199 -0
  559. scipy/stats/tests/test_rank.py +119 -112
  560. scipy/stats/tests/test_resampling.py +47 -56
  561. scipy/stats/tests/test_sampling.py +9 -4
  562. scipy/stats/tests/test_stats.py +799 -939
  563. scipy/stats/tests/test_variation.py +8 -6
  564. scipy/version.py +2 -2
  565. {scipy-1.15.3.dist-info → scipy-1.16.0rc1.dist-info}/LICENSE.txt +1 -1
  566. {scipy-1.15.3.dist-info → scipy-1.16.0rc1.dist-info}/METADATA +8 -8
  567. {scipy-1.15.3.dist-info → scipy-1.16.0rc1.dist-info}/RECORD +1262 -1269
  568. scipy.libs/libgcc_s-69c45f16.so.1 +0 -0
  569. scipy.libs/libgfortran-db0b6589.so.5.0.0 +0 -0
  570. scipy.libs/{libstdc++-1b614e01.so.6.0.32 → libstdc++-1f1a71be.so.6.0.33} +0 -0
  571. scipy/_lib/array_api_extra/_funcs.py +0 -484
  572. scipy/_lib/array_api_extra/_typing.py +0 -8
  573. scipy/interpolate/_bspl.cpython-311-aarch64-linux-musl.so +0 -0
  574. scipy/optimize/_cobyla.cpython-311-aarch64-linux-musl.so +0 -0
  575. scipy/optimize/_cython_nnls.cpython-311-aarch64-linux-musl.so +0 -0
  576. scipy/optimize/_slsqp.cpython-311-aarch64-linux-musl.so +0 -0
  577. scipy/spatial/qhull_src/COPYING.txt +0 -38
  578. scipy/special/libsf_error_state.so +0 -0
  579. scipy/special/tests/test_log_softmax.py +0 -109
  580. scipy/special/tests/test_xsf_cuda.py +0 -114
  581. scipy/special/xsf/binom.h +0 -89
  582. scipy/special/xsf/cdflib.h +0 -100
  583. scipy/special/xsf/cephes/airy.h +0 -307
  584. scipy/special/xsf/cephes/besselpoly.h +0 -51
  585. scipy/special/xsf/cephes/beta.h +0 -257
  586. scipy/special/xsf/cephes/cbrt.h +0 -131
  587. scipy/special/xsf/cephes/chbevl.h +0 -85
  588. scipy/special/xsf/cephes/chdtr.h +0 -193
  589. scipy/special/xsf/cephes/const.h +0 -87
  590. scipy/special/xsf/cephes/ellie.h +0 -293
  591. scipy/special/xsf/cephes/ellik.h +0 -251
  592. scipy/special/xsf/cephes/ellpe.h +0 -107
  593. scipy/special/xsf/cephes/ellpk.h +0 -117
  594. scipy/special/xsf/cephes/expn.h +0 -260
  595. scipy/special/xsf/cephes/gamma.h +0 -398
  596. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  597. scipy/special/xsf/cephes/hyperg.h +0 -361
  598. scipy/special/xsf/cephes/i0.h +0 -149
  599. scipy/special/xsf/cephes/i1.h +0 -158
  600. scipy/special/xsf/cephes/igam.h +0 -421
  601. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  602. scipy/special/xsf/cephes/igami.h +0 -313
  603. scipy/special/xsf/cephes/j0.h +0 -225
  604. scipy/special/xsf/cephes/j1.h +0 -198
  605. scipy/special/xsf/cephes/jv.h +0 -715
  606. scipy/special/xsf/cephes/k0.h +0 -164
  607. scipy/special/xsf/cephes/k1.h +0 -163
  608. scipy/special/xsf/cephes/kn.h +0 -243
  609. scipy/special/xsf/cephes/lanczos.h +0 -112
  610. scipy/special/xsf/cephes/ndtr.h +0 -275
  611. scipy/special/xsf/cephes/poch.h +0 -85
  612. scipy/special/xsf/cephes/polevl.h +0 -167
  613. scipy/special/xsf/cephes/psi.h +0 -194
  614. scipy/special/xsf/cephes/rgamma.h +0 -111
  615. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  616. scipy/special/xsf/cephes/shichi.h +0 -248
  617. scipy/special/xsf/cephes/sici.h +0 -224
  618. scipy/special/xsf/cephes/sindg.h +0 -221
  619. scipy/special/xsf/cephes/tandg.h +0 -139
  620. scipy/special/xsf/cephes/trig.h +0 -58
  621. scipy/special/xsf/cephes/unity.h +0 -186
  622. scipy/special/xsf/cephes/zeta.h +0 -172
  623. scipy/special/xsf/config.h +0 -304
  624. scipy/special/xsf/digamma.h +0 -205
  625. scipy/special/xsf/error.h +0 -57
  626. scipy/special/xsf/evalpoly.h +0 -47
  627. scipy/special/xsf/expint.h +0 -266
  628. scipy/special/xsf/hyp2f1.h +0 -694
  629. scipy/special/xsf/iv_ratio.h +0 -173
  630. scipy/special/xsf/lambertw.h +0 -150
  631. scipy/special/xsf/loggamma.h +0 -163
  632. scipy/special/xsf/sici.h +0 -200
  633. scipy/special/xsf/tools.h +0 -427
  634. scipy/special/xsf/trig.h +0 -164
  635. scipy/special/xsf/wright_bessel.h +0 -843
  636. scipy/special/xsf/zlog1.h +0 -35
  637. scipy/stats/_mvn.cpython-311-aarch64-linux-musl.so +0 -0
  638. scipy.libs/libgcc_s-7393e603.so.1 +0 -0
  639. scipy.libs/libgfortran-eb933d8e.so.5.0.0 +0 -0
  640. {scipy-1.15.3.dist-info → scipy-1.16.0rc1.dist-info}/WHEEL +0 -0
@@ -1,107 +1,242 @@
1
+ from functools import partial
2
+ import pickle
3
+
1
4
  import pytest
5
+ from hypothesis import given, strategies
6
+ import hypothesis.extra.numpy as npst
7
+ from packaging import version
2
8
 
3
- from scipy.special._support_alternative_backends import (get_array_special_func,
4
- array_special_func_map)
5
- from scipy.conftest import array_api_compatible
6
9
  from scipy import special
10
+ from scipy.special._support_alternative_backends import _special_funcs
7
11
  from scipy._lib._array_api_no_0d import xp_assert_close
8
- from scipy._lib._array_api import is_jax, is_torch, SCIPY_DEVICE
12
+ from scipy._lib._array_api import (is_cupy, is_dask, is_jax, is_torch,
13
+ make_xp_pytest_param, make_xp_test_case,
14
+ xp_default_dtype)
9
15
  from scipy._lib.array_api_compat import numpy as np
10
16
 
11
- try:
12
- import array_api_strict
13
- HAVE_ARRAY_API_STRICT = True
14
- except ImportError:
15
- HAVE_ARRAY_API_STRICT = False
16
-
17
+ # Run all tests in this module in the Array API CI, including those without
18
+ # the xp fixture
19
+ pytestmark = pytest.mark.array_api_backends
17
20
 
18
- @pytest.mark.skipif(not HAVE_ARRAY_API_STRICT,
19
- reason="`array_api_strict` not installed")
20
- def test_dispatch_to_unrecognize_library():
21
- xp = array_api_strict
22
- f = get_array_special_func('ndtr', xp=xp, n_array_args=1)
23
- x = [1, 2, 3]
24
- res = f(xp.asarray(x))
25
- ref = xp.asarray(special.ndtr(np.asarray(x)))
26
- xp_assert_close(res, ref, xp=xp)
21
+ lazy_xp_modules = [special]
27
22
 
28
23
 
29
- @pytest.mark.parametrize('dtype', ['float32', 'float64', 'int64'])
30
- @pytest.mark.skipif(not HAVE_ARRAY_API_STRICT,
31
- reason="`array_api_strict` not installed")
32
- def test_rel_entr_generic(dtype):
33
- xp = array_api_strict
34
- f = get_array_special_func('rel_entr', xp=xp, n_array_args=2)
35
- dtype_np = getattr(np, dtype)
36
- dtype_xp = getattr(xp, dtype)
37
- x, y = [-1, 0, 0, 1], [1, 0, 2, 3]
24
+ def _skip_or_tweak_alternative_backends(xp, f_name, dtypes):
25
+ """Skip tests for specific intersections of scipy.special functions
26
+ vs. backends vs. dtypes vs. devices.
27
+ Also suggest bespoke tweaks.
38
28
 
39
- x_xp, y_xp = xp.asarray(x, dtype=dtype_xp), xp.asarray(y, dtype=dtype_xp)
40
- res = f(x_xp, y_xp)
29
+ Returns
30
+ -------
31
+ positive_only : bool
32
+ Whether you should exclusively test positive inputs.
33
+ dtypes_np_ref : list[str]
34
+ The dtypes to use for the reference NumPy arrays.
35
+ """
36
+ if ((is_jax(xp) and f_name == 'gammaincc') # google/jax#20699
37
+ # gh-20972
38
+ or ((is_cupy(xp) or is_jax(xp) or is_torch(xp)) and f_name == 'chdtrc')):
39
+ positive_only = True
40
+ else:
41
+ positive_only = False
41
42
 
42
- x_np, y_np = np.asarray(x, dtype=dtype_np), np.asarray(y, dtype=dtype_np)
43
- ref = special.rel_entr(x_np[-1], y_np[-1])
44
- ref = np.asarray([np.inf, 0, 0, ref], dtype=ref.dtype)
43
+ if not any('int' in dtype for dtype in dtypes):
44
+ return positive_only, dtypes
45
45
 
46
- xp_assert_close(res, xp.asarray(ref), xp=xp)
46
+ # Integer-specific issues from this point onwards
47
47
 
48
+ if ((is_torch(xp) and f_name in {'gammainc', 'gammaincc'})
49
+ or (is_cupy(xp) and f_name in {'stdtr', 'i0e', 'i1e'})
50
+ or (is_jax(xp) and f_name in {'stdtr', 'ndtr', 'ndtri', 'log_ndtr'})
51
+ ):
52
+ pytest.skip(f"`{f_name}` does not support integer types")
48
53
 
49
- @pytest.mark.fail_slow(5)
50
- @array_api_compatible
51
- # @pytest.mark.skip_xp_backends('numpy', reason='skip while debugging')
52
- # @pytest.mark.usefixtures("skip_xp_backends")
53
- # `reversed` is for developer convenience: test new function first = less waiting
54
- @pytest.mark.parametrize('f_name_n_args', reversed(array_special_func_map.items()))
55
- @pytest.mark.parametrize('dtype', ['float32', 'float64'])
56
- @pytest.mark.parametrize('shapes', [[(0,)]*4, [tuple()]*4, [(10,)]*4,
57
- [(10,), (11, 1), (12, 1, 1), (13, 1, 1, 1)]])
58
- def test_support_alternative_backends(xp, f_name_n_args, dtype, shapes):
59
- f_name, n_args = f_name_n_args
54
+ # int/float mismatched args support is sketchy
55
+ if (any('float' in dtype for dtype in dtypes)
56
+ and ((is_torch(xp) and f_name in ('rel_entr', 'xlogy'))
57
+ or (is_jax(xp) and f_name in ('gammainc', 'gammaincc',
58
+ 'rel_entr', 'xlogy')))
59
+ ):
60
+ pytest.xfail("dtypes do not match")
60
61
 
61
- if (SCIPY_DEVICE != 'cpu'
62
- and is_torch(xp)
63
- and f_name in {'stdtr', 'betaincc', 'betainc'}
62
+ dtypes_np_ref = dtypes
63
+ if (is_torch(xp) and xp_default_dtype(xp) == xp.float32
64
+ and f_name not in {'betainc', 'betaincc', 'stdtr', 'stdtrit'}
64
65
  ):
65
- pytest.skip(f"`{f_name}` does not have an array-agnostic implementation "
66
- f"and cannot delegate to PyTorch.")
66
+ # On PyTorch with float32 default dtype, sometimes ints are promoted
67
+ # to float32, and sometimes to float64.
68
+ # When they are promoted to float32, explicitly convert the reference
69
+ # numpy arrays to float32 to prevent them from being automatically promoted
70
+ # to float64 instead.
71
+ dtypes_np_ref = ['float32' if 'int' in dtype else dtype for dtype in dtypes]
67
72
 
68
- shapes = shapes[:n_args]
69
- f = getattr(special, f_name)
73
+ return positive_only, dtypes_np_ref
70
74
 
75
+
76
+ @pytest.mark.filterwarnings("ignore:invalid value encountered:RuntimeWarning:dask")
77
+ @pytest.mark.parametrize('shapes', [[(0,)]*4, [tuple()]*4, [(10,)]*4,
78
+ [(10,), (11, 1), (12, 1, 1), (13, 1, 1, 1)]])
79
+ @pytest.mark.parametrize('dtype', ['float32', 'float64', 'int64'])
80
+ @pytest.mark.parametrize(
81
+ 'func,nfo', [make_xp_pytest_param(i.wrapper, i) for i in _special_funcs])
82
+ def test_support_alternative_backends(xp, func, nfo, dtype, shapes):
83
+ positive_only, [dtype_np_ref] = _skip_or_tweak_alternative_backends(
84
+ xp, nfo.name, [dtype])
71
85
  dtype_np = getattr(np, dtype)
72
86
  dtype_xp = getattr(xp, dtype)
73
87
 
74
- # # To test the robustness of the alternative backend's implementation,
75
- # # use Hypothesis to generate arguments
76
- # from hypothesis import given, strategies, reproduce_failure, assume
77
- # import hypothesis.extra.numpy as npst
78
- # @given(data=strategies.data())
79
- # mbs = npst.mutually_broadcastable_shapes(num_shapes=n_args)
80
- # shapes, final_shape = data.draw(mbs)
81
- # elements = dict(allow_subnormal=False) # consider min_value, max_value
82
- # args_np = [np.asarray(data.draw(npst.arrays(dtype_np, shape, elements=elements)),
83
- # dtype=dtype_np)
84
- # for shape in shapes]
85
-
86
- # For CI, be a little more forgiving; just generate normally distributed arguments
88
+ shapes = shapes[:nfo.n_args]
89
+ rng = np.random.default_rng(984254252920492019)
90
+ if 'int' in dtype:
91
+ iinfo = np.iinfo(dtype_np)
92
+ rand = partial(rng.integers, iinfo.min, iinfo.max + 1)
93
+ else:
94
+ rand = rng.standard_normal
95
+ args_np = [rand(size=shape, dtype=dtype_np) for shape in shapes]
96
+ if positive_only:
97
+ args_np = [np.abs(arg) for arg in args_np]
98
+
99
+ args_xp = [xp.asarray(arg, dtype=dtype_xp) for arg in args_np]
100
+ args_np = [np.asarray(arg, dtype=dtype_np_ref) for arg in args_np]
101
+
102
+ if is_dask(xp):
103
+ # We're using map_blocks to dispatch the function to Dask.
104
+ # This is the correct thing to do IF all tested functions are elementwise;
105
+ # otherwise the output would change depending on chunking.
106
+ # Try to trigger bugs related to having multiple chunks.
107
+ args_xp = [arg.rechunk(5) for arg in args_xp]
108
+
109
+ res = nfo.wrapper(*args_xp) # Also wrapped by lazy_xp_function
110
+ ref = nfo.func(*args_np) # Unwrapped ufunc
111
+
112
+ # When dtype_np is integer, the output dtype can be float
113
+ atol = 0 if ref.dtype.kind in 'iu' else 10 * np.finfo(ref.dtype).eps
114
+ xp_assert_close(res, xp.asarray(ref), atol=atol)
115
+
116
+
117
+ @pytest.mark.parametrize(
118
+ 'func, nfo',
119
+ [make_xp_pytest_param(i.wrapper, i) for i in _special_funcs if i.n_args >= 2])
120
+ @pytest.mark.filterwarnings("ignore:invalid value encountered:RuntimeWarning:dask")
121
+ def test_support_alternative_backends_mismatched_dtypes(xp, func, nfo):
122
+ """Test mix-n-match of int and float arguments"""
123
+ dtypes = ['int64', 'float32', 'float64'][:nfo.n_args]
124
+ dtypes_xp = [xp.int64, xp.float32, xp.float64][:nfo.n_args]
125
+ positive_only, dtypes_np_ref = _skip_or_tweak_alternative_backends(
126
+ xp, nfo.name, dtypes)
127
+
87
128
  rng = np.random.default_rng(984254252920492019)
88
- args_np = [rng.standard_normal(size=shape, dtype=dtype_np) for shape in shapes]
129
+ iinfo = np.iinfo(np.int64)
130
+ randint = partial(rng.integers, iinfo.min, iinfo.max + 1)
131
+ args_np = [
132
+ randint(size=1, dtype=np.int64),
133
+ rng.standard_normal(size=1, dtype=np.float32),
134
+ rng.standard_normal(size=1, dtype=np.float64),
135
+ ][:nfo.n_args]
136
+ if positive_only:
137
+ args_np = [np.abs(arg) for arg in args_np]
138
+
139
+ args_xp = [xp.asarray(arg, dtype=dtype_xp)
140
+ for arg, dtype_xp in zip(args_np, dtypes_xp)]
141
+ args_np = [np.asarray(arg, dtype=dtype_np_ref)
142
+ for arg, dtype_np_ref in zip(args_np, dtypes_np_ref)]
143
+
144
+ res = nfo.wrapper(*args_xp) # Also wrapped by lazy_xp_function
145
+ ref = nfo.func(*args_np) # Unwrapped ufunc
146
+
147
+ atol = 10 * np.finfo(ref.dtype).eps
148
+ xp_assert_close(res, xp.asarray(ref), atol=atol)
149
+
150
+
151
+ @pytest.mark.xslow
152
+ @given(data=strategies.data())
153
+ @pytest.mark.fail_slow(5)
154
+ @pytest.mark.parametrize(
155
+ 'func,nfo', [make_xp_pytest_param(nfo.wrapper, nfo) for nfo in _special_funcs])
156
+ @pytest.mark.filterwarnings("ignore:invalid value encountered:RuntimeWarning:dask")
157
+ @pytest.mark.filterwarnings("ignore:divide by zero encountered:RuntimeWarning:dask")
158
+ @pytest.mark.filterwarnings("ignore:overflow encountered:RuntimeWarning:dask")
159
+ @pytest.mark.filterwarnings(
160
+ "ignore:overflow encountered:RuntimeWarning:array_api_strict"
161
+ )
162
+ def test_support_alternative_backends_hypothesis(xp, func, nfo, data):
163
+ dtype = data.draw(strategies.sampled_from(['float32', 'float64', 'int64']))
164
+ positive_only, [dtype_np_ref] = _skip_or_tweak_alternative_backends(
165
+ xp, nfo.name, [dtype])
166
+ dtype_np = getattr(np, dtype)
167
+ dtype_xp = getattr(xp, dtype)
168
+
169
+ elements = {'allow_subnormal': False}
170
+ # Most failures are due to NaN or infinity; uncomment to suppress them
171
+ # elements['allow_infinity'] = False
172
+ # elements['allow_nan'] = False
173
+ if positive_only:
174
+ elements['min_value'] = 0
175
+
176
+ shapes, _ = data.draw(
177
+ npst.mutually_broadcastable_shapes(num_shapes=nfo.n_args))
178
+ args_np = [data.draw(npst.arrays(dtype_np, shape, elements=elements))
179
+ for shape in shapes]
180
+
181
+ args_xp = [xp.asarray(arg, dtype=dtype_xp) for arg in args_np]
182
+ args_np = [np.asarray(arg, dtype=dtype_np_ref) for arg in args_np]
183
+
184
+ res = nfo.wrapper(*args_xp) # Also wrapped by lazy_xp_function
185
+ ref = nfo.func(*args_np) # Unwrapped ufunc
186
+
187
+ # When dtype_np is integer, the output dtype can be float
188
+ atol = 0 if ref.dtype.kind in 'iu' else 10 * np.finfo(ref.dtype).eps
189
+ xp_assert_close(res, xp.asarray(ref), atol=atol)
190
+
191
+
192
+ @pytest.mark.parametrize("func", [nfo.wrapper for nfo in _special_funcs])
193
+ def test_pickle(func):
194
+ roundtrip = pickle.loads(pickle.dumps(func))
195
+ assert roundtrip is func
196
+
197
+
198
+ @pytest.mark.parametrize("func", [nfo.wrapper for nfo in _special_funcs])
199
+ def test_repr(func):
200
+ assert func.__name__ in repr(func)
201
+ assert "locals" not in repr(func)
202
+
203
+
204
+ @pytest.mark.skipif(
205
+ version.parse(np.__version__) < version.parse("2.2"),
206
+ reason="Can't update ufunc __doc__ when SciPy is compiled vs. NumPy < 2.2")
207
+ @pytest.mark.parametrize('func', [nfo.wrapper for nfo in _special_funcs])
208
+ def test_doc(func):
209
+ """xp_capabilities updates the docstring in place.
210
+ Make sure it does so exactly once, including when SCIPY_ARRAY_API is not set.
211
+ """
212
+ match = "has experimental support for Python Array API"
213
+ assert func.__doc__.count(match) == 1
214
+
89
215
 
90
- if (is_jax(xp) and f_name == 'gammaincc' # google/jax#20699
91
- or f_name == 'chdtrc'): # gh-20972
92
- args_np[0] = np.abs(args_np[0])
93
- args_np[1] = np.abs(args_np[1])
216
+ @pytest.mark.parametrize('func,n_args',
217
+ [(nfo.wrapper, nfo.n_args) for nfo in _special_funcs])
218
+ def test_ufunc_kwargs(func, n_args):
219
+ """Test that numpy-specific out= and dtype= keyword arguments
220
+ of ufuncs still work when SCIPY_ARRAY_API is set.
221
+ """
222
+ # out=
223
+ args = [np.asarray([.1, .2])] * n_args
224
+ out = np.empty(2)
225
+ y = func(*args, out=out)
226
+ xp_assert_close(y, out)
94
227
 
95
- args_xp = [xp.asarray(arg[()], dtype=dtype_xp) for arg in args_np]
228
+ # out= with out.dtype != args.dtype
229
+ out = np.empty(2, dtype=np.float32)
230
+ y = func(*args, out=out)
231
+ xp_assert_close(y, out)
96
232
 
97
- res = f(*args_xp)
98
- ref = xp.asarray(f(*args_np), dtype=dtype_xp)
233
+ # dtype=
234
+ y = func(*args, dtype=np.float32)
235
+ assert y.dtype == np.float32
99
236
 
100
- eps = np.finfo(dtype_np).eps
101
- xp_assert_close(res, ref, atol=10*eps)
102
237
 
103
238
 
104
- @array_api_compatible
239
+ @make_xp_test_case(special.chdtr)
105
240
  def test_chdtr_gh21311(xp):
106
241
  # the edge case behavior of generic chdtr was not right; see gh-21311
107
242
  # be sure to test at least these cases
scipy/stats/__init__.py CHANGED
@@ -280,6 +280,7 @@ Frequency statistics
280
280
  :toctree: generated/
281
281
 
282
282
  cumfreq
283
+ quantile
283
284
  percentileofscore
284
285
  scoreatpercentile
285
286
  relfreq
@@ -471,6 +472,7 @@ Random Variables
471
472
  make_distribution
472
473
  Normal
473
474
  Uniform
475
+ Binomial
474
476
  Mixture
475
477
  order_statistic
476
478
  truncate
@@ -649,9 +651,10 @@ from ._survival import *
649
651
  from ._distribution_infrastructure import (
650
652
  make_distribution, Mixture, order_statistic, truncate, exp, log, abs
651
653
  )
652
- from ._new_distributions import Normal, Uniform
654
+ from ._new_distributions import Normal, Uniform, Binomial
653
655
  from ._mgc import multiscale_graphcorr
654
656
  from ._correlation import chatterjeexi
657
+ from ._quantile import quantile
655
658
 
656
659
 
657
660
  # Deprecated namespaces, to be removed in v2.0.0
@@ -42,6 +42,7 @@ def _broadcast_arrays(arrays, axis=None, xp=None):
42
42
  """
43
43
  Broadcast shapes of arrays, ignoring incompatibility of specified axes
44
44
  """
45
+ arrays = tuple(arrays)
45
46
  if not arrays:
46
47
  return arrays
47
48
  xp = array_namespace(*arrays) if xp is None else xp
@@ -554,11 +555,11 @@ def _axis_nan_policy_factory(tuple_to_result, default_axis=0,
554
555
  if np.all(ndims <= 1):
555
556
  # Addresses nan_policy == "raise"
556
557
  if nan_policy != 'propagate' or override['nan_propagation']:
557
- contains_nan = [_contains_nan(sample, nan_policy)[0]
558
+ contains_nan = [_contains_nan(sample, nan_policy)
558
559
  for sample in samples]
559
560
  else:
560
561
  # Behave as though there are no NaNs (even if there are)
561
- contains_nan = [False]*len(samples)
562
+ contains_nan = [False] * len(samples)
562
563
 
563
564
  # Addresses nan_policy == "propagate"
564
565
  if any(contains_nan) and (nan_policy == 'propagate'
@@ -610,7 +611,7 @@ def _axis_nan_policy_factory(tuple_to_result, default_axis=0,
610
611
 
611
612
  # Addresses nan_policy == "raise"
612
613
  if nan_policy != 'propagate' or override['nan_propagation']:
613
- contains_nan, _ = _contains_nan(x, nan_policy)
614
+ contains_nan = _contains_nan(x, nan_policy)
614
615
  else:
615
616
  contains_nan = False # behave like there are no NaNs
616
617