scipy 1.15.3__cp313-cp313-win_amd64.whl → 1.16.0rc2__cp313-cp313-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (759) hide show
  1. scipy/__config__.py +8 -8
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cp313-win_amd64.dll.a +0 -0
  4. scipy/_cyutility.cp313-win_amd64.pyd +0 -0
  5. scipy/_lib/_array_api.py +486 -161
  6. scipy/_lib/_array_api_compat_vendor.py +9 -0
  7. scipy/_lib/_bunch.py +4 -0
  8. scipy/_lib/_ccallback_c.cp313-win_amd64.dll.a +0 -0
  9. scipy/_lib/_ccallback_c.cp313-win_amd64.pyd +0 -0
  10. scipy/_lib/_docscrape.py +1 -1
  11. scipy/_lib/_elementwise_iterative_method.py +15 -26
  12. scipy/_lib/_fpumode.cp313-win_amd64.dll.a +0 -0
  13. scipy/_lib/_fpumode.cp313-win_amd64.pyd +0 -0
  14. scipy/_lib/_sparse.py +41 -0
  15. scipy/_lib/_test_ccallback.cp313-win_amd64.dll.a +0 -0
  16. scipy/_lib/_test_ccallback.cp313-win_amd64.pyd +0 -0
  17. scipy/_lib/_test_deprecation_call.cp313-win_amd64.dll.a +0 -0
  18. scipy/_lib/_test_deprecation_call.cp313-win_amd64.pyd +0 -0
  19. scipy/_lib/_test_deprecation_def.cp313-win_amd64.dll.a +0 -0
  20. scipy/_lib/_test_deprecation_def.cp313-win_amd64.pyd +0 -0
  21. scipy/_lib/_testutils.py +6 -2
  22. scipy/_lib/_uarray/_uarray.cp313-win_amd64.dll.a +0 -0
  23. scipy/_lib/_uarray/_uarray.cp313-win_amd64.pyd +0 -0
  24. scipy/_lib/_util.py +222 -125
  25. scipy/_lib/array_api_compat/__init__.py +4 -4
  26. scipy/_lib/array_api_compat/_internal.py +19 -6
  27. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  28. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  29. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  30. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  31. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  32. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  33. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  34. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  35. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  36. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  37. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  38. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  39. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  40. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  41. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  42. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  43. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  44. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  45. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  46. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  47. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  48. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  49. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  50. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  51. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  52. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  53. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  54. scipy/_lib/array_api_extra/__init__.py +26 -3
  55. scipy/_lib/array_api_extra/_delegation.py +171 -0
  56. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  57. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  58. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  59. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  60. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  61. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  62. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  63. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  64. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  65. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  66. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  67. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  68. scipy/_lib/array_api_extra/testing.py +359 -0
  69. scipy/_lib/decorator.py +2 -2
  70. scipy/_lib/doccer.py +1 -7
  71. scipy/_lib/messagestream.cp313-win_amd64.dll.a +0 -0
  72. scipy/_lib/messagestream.cp313-win_amd64.pyd +0 -0
  73. scipy/_lib/pyprima/__init__.py +212 -0
  74. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  75. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  76. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  77. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  78. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  79. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  80. scipy/_lib/pyprima/cobyla/update.py +289 -0
  81. scipy/_lib/pyprima/common/__init__.py +0 -0
  82. scipy/_lib/pyprima/common/_bounds.py +34 -0
  83. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  84. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  85. scipy/_lib/pyprima/common/_project.py +173 -0
  86. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  87. scipy/_lib/pyprima/common/consts.py +47 -0
  88. scipy/_lib/pyprima/common/evaluate.py +99 -0
  89. scipy/_lib/pyprima/common/history.py +38 -0
  90. scipy/_lib/pyprima/common/infos.py +30 -0
  91. scipy/_lib/pyprima/common/linalg.py +435 -0
  92. scipy/_lib/pyprima/common/message.py +290 -0
  93. scipy/_lib/pyprima/common/powalg.py +131 -0
  94. scipy/_lib/pyprima/common/preproc.py +277 -0
  95. scipy/_lib/pyprima/common/present.py +5 -0
  96. scipy/_lib/pyprima/common/ratio.py +54 -0
  97. scipy/_lib/pyprima/common/redrho.py +47 -0
  98. scipy/_lib/pyprima/common/selectx.py +296 -0
  99. scipy/_lib/tests/test__util.py +105 -121
  100. scipy/_lib/tests/test_array_api.py +166 -35
  101. scipy/_lib/tests/test_bunch.py +7 -0
  102. scipy/_lib/tests/test_ccallback.py +2 -10
  103. scipy/_lib/tests/test_public_api.py +13 -0
  104. scipy/cluster/_hierarchy.cp313-win_amd64.dll.a +0 -0
  105. scipy/cluster/_hierarchy.cp313-win_amd64.pyd +0 -0
  106. scipy/cluster/_optimal_leaf_ordering.cp313-win_amd64.dll.a +0 -0
  107. scipy/cluster/_optimal_leaf_ordering.cp313-win_amd64.pyd +0 -0
  108. scipy/cluster/_vq.cp313-win_amd64.dll.a +0 -0
  109. scipy/cluster/_vq.cp313-win_amd64.pyd +0 -0
  110. scipy/cluster/hierarchy.py +393 -223
  111. scipy/cluster/tests/test_hierarchy.py +273 -335
  112. scipy/cluster/tests/test_vq.py +45 -61
  113. scipy/cluster/vq.py +39 -35
  114. scipy/conftest.py +263 -157
  115. scipy/constants/_constants.py +4 -1
  116. scipy/constants/tests/test_codata.py +2 -2
  117. scipy/constants/tests/test_constants.py +11 -18
  118. scipy/datasets/_download_all.py +15 -1
  119. scipy/datasets/_fetchers.py +7 -1
  120. scipy/datasets/_utils.py +1 -1
  121. scipy/differentiate/_differentiate.py +25 -25
  122. scipy/differentiate/tests/test_differentiate.py +24 -25
  123. scipy/fft/_basic.py +20 -0
  124. scipy/fft/_helper.py +3 -34
  125. scipy/fft/_pocketfft/helper.py +29 -1
  126. scipy/fft/_pocketfft/pypocketfft.cp313-win_amd64.dll.a +0 -0
  127. scipy/fft/_pocketfft/pypocketfft.cp313-win_amd64.pyd +0 -0
  128. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  129. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  130. scipy/fft/_realtransforms.py +13 -0
  131. scipy/fft/tests/test_basic.py +27 -25
  132. scipy/fft/tests/test_fftlog.py +16 -7
  133. scipy/fft/tests/test_helper.py +18 -34
  134. scipy/fft/tests/test_real_transforms.py +8 -10
  135. scipy/fftpack/convolve.cp313-win_amd64.dll.a +0 -0
  136. scipy/fftpack/convolve.cp313-win_amd64.pyd +0 -0
  137. scipy/fftpack/tests/test_basic.py +2 -4
  138. scipy/fftpack/tests/test_real_transforms.py +8 -9
  139. scipy/integrate/_bvp.py +9 -3
  140. scipy/integrate/_cubature.py +3 -2
  141. scipy/integrate/_dop.cp313-win_amd64.dll.a +0 -0
  142. scipy/integrate/_dop.cp313-win_amd64.pyd +0 -0
  143. scipy/integrate/_lsoda.cp313-win_amd64.dll.a +0 -0
  144. scipy/integrate/_lsoda.cp313-win_amd64.pyd +0 -0
  145. scipy/integrate/_ode.py +9 -2
  146. scipy/integrate/_odepack.cp313-win_amd64.dll.a +0 -0
  147. scipy/integrate/_odepack.cp313-win_amd64.pyd +0 -0
  148. scipy/integrate/_quad_vec.py +21 -29
  149. scipy/integrate/_quadpack.cp313-win_amd64.dll.a +0 -0
  150. scipy/integrate/_quadpack.cp313-win_amd64.pyd +0 -0
  151. scipy/integrate/_quadpack_py.py +11 -7
  152. scipy/integrate/_quadrature.py +3 -3
  153. scipy/integrate/_rules/_base.py +2 -2
  154. scipy/integrate/_tanhsinh.py +48 -47
  155. scipy/integrate/_test_multivariate.cp313-win_amd64.dll.a +0 -0
  156. scipy/integrate/_test_multivariate.cp313-win_amd64.pyd +0 -0
  157. scipy/integrate/_test_odeint_banded.cp313-win_amd64.dll.a +0 -0
  158. scipy/integrate/_test_odeint_banded.cp313-win_amd64.pyd +0 -0
  159. scipy/integrate/_vode.cp313-win_amd64.dll.a +0 -0
  160. scipy/integrate/_vode.cp313-win_amd64.pyd +0 -0
  161. scipy/integrate/tests/test__quad_vec.py +0 -6
  162. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  163. scipy/integrate/tests/test_cubature.py +21 -35
  164. scipy/integrate/tests/test_quadrature.py +6 -8
  165. scipy/integrate/tests/test_tanhsinh.py +56 -48
  166. scipy/interpolate/__init__.py +70 -58
  167. scipy/interpolate/_bary_rational.py +22 -22
  168. scipy/interpolate/_bsplines.py +119 -66
  169. scipy/interpolate/_cubic.py +65 -50
  170. scipy/interpolate/_dfitpack.cp313-win_amd64.dll.a +0 -0
  171. scipy/interpolate/_dfitpack.cp313-win_amd64.pyd +0 -0
  172. scipy/interpolate/_dierckx.cp313-win_amd64.dll.a +0 -0
  173. scipy/interpolate/_dierckx.cp313-win_amd64.pyd +0 -0
  174. scipy/interpolate/_fitpack.cp313-win_amd64.dll.a +0 -0
  175. scipy/interpolate/_fitpack.cp313-win_amd64.pyd +0 -0
  176. scipy/interpolate/_fitpack2.py +9 -6
  177. scipy/interpolate/_fitpack_impl.py +32 -26
  178. scipy/interpolate/_fitpack_repro.py +23 -19
  179. scipy/interpolate/_interpnd.cp313-win_amd64.dll.a +0 -0
  180. scipy/interpolate/_interpnd.cp313-win_amd64.pyd +0 -0
  181. scipy/interpolate/_interpolate.py +30 -12
  182. scipy/interpolate/_ndbspline.py +13 -18
  183. scipy/interpolate/_ndgriddata.py +5 -8
  184. scipy/interpolate/_polyint.py +95 -31
  185. scipy/interpolate/_ppoly.cp313-win_amd64.dll.a +0 -0
  186. scipy/interpolate/_ppoly.cp313-win_amd64.pyd +0 -0
  187. scipy/interpolate/_rbf.py +2 -2
  188. scipy/interpolate/_rbfinterp.py +1 -1
  189. scipy/interpolate/_rbfinterp_pythran.cp313-win_amd64.dll.a +0 -0
  190. scipy/interpolate/_rbfinterp_pythran.cp313-win_amd64.pyd +0 -0
  191. scipy/interpolate/_rgi.py +31 -26
  192. scipy/interpolate/_rgi_cython.cp313-win_amd64.dll.a +0 -0
  193. scipy/interpolate/_rgi_cython.cp313-win_amd64.pyd +0 -0
  194. scipy/interpolate/dfitpack.py +0 -20
  195. scipy/interpolate/interpnd.py +1 -2
  196. scipy/interpolate/tests/test_bary_rational.py +2 -2
  197. scipy/interpolate/tests/test_bsplines.py +97 -1
  198. scipy/interpolate/tests/test_fitpack2.py +39 -1
  199. scipy/interpolate/tests/test_interpnd.py +32 -20
  200. scipy/interpolate/tests/test_interpolate.py +48 -4
  201. scipy/interpolate/tests/test_rgi.py +2 -1
  202. scipy/io/_fast_matrix_market/__init__.py +2 -0
  203. scipy/io/_fast_matrix_market/_fmm_core.cp313-win_amd64.dll.a +0 -0
  204. scipy/io/_fast_matrix_market/_fmm_core.cp313-win_amd64.pyd +0 -0
  205. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  206. scipy/io/_harwell_boeing/hb.py +7 -11
  207. scipy/io/_idl.py +5 -7
  208. scipy/io/_netcdf.py +15 -5
  209. scipy/io/_test_fortran.cp313-win_amd64.dll.a +0 -0
  210. scipy/io/_test_fortran.cp313-win_amd64.pyd +0 -0
  211. scipy/io/arff/tests/test_arffread.py +3 -3
  212. scipy/io/matlab/__init__.py +5 -3
  213. scipy/io/matlab/_mio.py +4 -1
  214. scipy/io/matlab/_mio5.py +19 -13
  215. scipy/io/matlab/_mio5_utils.cp313-win_amd64.dll.a +0 -0
  216. scipy/io/matlab/_mio5_utils.cp313-win_amd64.pyd +0 -0
  217. scipy/io/matlab/_mio_utils.cp313-win_amd64.dll.a +0 -0
  218. scipy/io/matlab/_mio_utils.cp313-win_amd64.pyd +0 -0
  219. scipy/io/matlab/_miobase.py +4 -1
  220. scipy/io/matlab/_streams.cp313-win_amd64.dll.a +0 -0
  221. scipy/io/matlab/_streams.cp313-win_amd64.pyd +0 -0
  222. scipy/io/matlab/tests/test_mio.py +46 -18
  223. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  224. scipy/io/tests/test_mmio.py +7 -1
  225. scipy/io/tests/test_wavfile.py +41 -0
  226. scipy/io/wavfile.py +57 -10
  227. scipy/linalg/_basic.py +113 -86
  228. scipy/linalg/_cythonized_array_utils.cp313-win_amd64.dll.a +0 -0
  229. scipy/linalg/_cythonized_array_utils.cp313-win_amd64.pyd +0 -0
  230. scipy/linalg/_decomp.py +22 -9
  231. scipy/linalg/_decomp_cholesky.py +28 -13
  232. scipy/linalg/_decomp_cossin.py +45 -30
  233. scipy/linalg/_decomp_interpolative.cp313-win_amd64.dll.a +0 -0
  234. scipy/linalg/_decomp_interpolative.cp313-win_amd64.pyd +0 -0
  235. scipy/linalg/_decomp_ldl.py +4 -1
  236. scipy/linalg/_decomp_lu.py +18 -6
  237. scipy/linalg/_decomp_lu_cython.cp313-win_amd64.dll.a +0 -0
  238. scipy/linalg/_decomp_lu_cython.cp313-win_amd64.pyd +0 -0
  239. scipy/linalg/_decomp_polar.py +2 -0
  240. scipy/linalg/_decomp_qr.py +6 -2
  241. scipy/linalg/_decomp_qz.py +3 -0
  242. scipy/linalg/_decomp_schur.py +3 -1
  243. scipy/linalg/_decomp_svd.py +13 -2
  244. scipy/linalg/_decomp_update.cp313-win_amd64.dll.a +0 -0
  245. scipy/linalg/_decomp_update.cp313-win_amd64.pyd +0 -0
  246. scipy/linalg/_expm_frechet.py +4 -0
  247. scipy/linalg/_fblas.cp313-win_amd64.dll.a +0 -0
  248. scipy/linalg/_fblas.cp313-win_amd64.pyd +0 -0
  249. scipy/linalg/_flapack.cp313-win_amd64.dll.a +0 -0
  250. scipy/linalg/_flapack.cp313-win_amd64.pyd +0 -0
  251. scipy/linalg/_linalg_pythran.cp313-win_amd64.dll.a +0 -0
  252. scipy/linalg/_linalg_pythran.cp313-win_amd64.pyd +0 -0
  253. scipy/linalg/_matfuncs.py +187 -4
  254. scipy/linalg/_matfuncs_expm.cp313-win_amd64.dll.a +0 -0
  255. scipy/linalg/_matfuncs_expm.cp313-win_amd64.pyd +0 -0
  256. scipy/linalg/_matfuncs_schur_sqrtm.cp313-win_amd64.dll.a +0 -0
  257. scipy/linalg/_matfuncs_schur_sqrtm.cp313-win_amd64.pyd +0 -0
  258. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  259. scipy/linalg/_matfuncs_sqrtm_triu.cp313-win_amd64.dll.a +0 -0
  260. scipy/linalg/_matfuncs_sqrtm_triu.cp313-win_amd64.pyd +0 -0
  261. scipy/linalg/_procrustes.py +2 -0
  262. scipy/linalg/_sketches.py +17 -6
  263. scipy/linalg/_solve_toeplitz.cp313-win_amd64.dll.a +0 -0
  264. scipy/linalg/_solve_toeplitz.cp313-win_amd64.pyd +0 -0
  265. scipy/linalg/_solvers.py +7 -2
  266. scipy/linalg/_special_matrices.py +26 -36
  267. scipy/linalg/cython_blas.cp313-win_amd64.dll.a +0 -0
  268. scipy/linalg/cython_blas.cp313-win_amd64.pyd +0 -0
  269. scipy/linalg/cython_lapack.cp313-win_amd64.dll.a +0 -0
  270. scipy/linalg/cython_lapack.cp313-win_amd64.pyd +0 -0
  271. scipy/linalg/lapack.py +22 -2
  272. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  273. scipy/linalg/tests/test_basic.py +31 -16
  274. scipy/linalg/tests/test_batch.py +588 -0
  275. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  276. scipy/linalg/tests/test_decomp.py +40 -3
  277. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  278. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  279. scipy/linalg/tests/test_lapack.py +115 -7
  280. scipy/linalg/tests/test_matfuncs.py +157 -102
  281. scipy/linalg/tests/test_procrustes.py +0 -7
  282. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  283. scipy/linalg/tests/test_special_matrices.py +1 -5
  284. scipy/ndimage/__init__.py +1 -0
  285. scipy/ndimage/_ctest.cp313-win_amd64.dll.a +0 -0
  286. scipy/ndimage/_ctest.cp313-win_amd64.pyd +0 -0
  287. scipy/ndimage/_cytest.cp313-win_amd64.dll.a +0 -0
  288. scipy/ndimage/_cytest.cp313-win_amd64.pyd +0 -0
  289. scipy/ndimage/_delegators.py +8 -2
  290. scipy/ndimage/_filters.py +453 -5
  291. scipy/ndimage/_interpolation.py +36 -6
  292. scipy/ndimage/_measurements.py +4 -2
  293. scipy/ndimage/_morphology.py +5 -0
  294. scipy/ndimage/_nd_image.cp313-win_amd64.dll.a +0 -0
  295. scipy/ndimage/_nd_image.cp313-win_amd64.pyd +0 -0
  296. scipy/ndimage/_ni_docstrings.py +5 -1
  297. scipy/ndimage/_ni_label.cp313-win_amd64.dll.a +0 -0
  298. scipy/ndimage/_ni_label.cp313-win_amd64.pyd +0 -0
  299. scipy/ndimage/_ni_support.py +1 -5
  300. scipy/ndimage/_rank_filter_1d.cp313-win_amd64.dll.a +0 -0
  301. scipy/ndimage/_rank_filter_1d.cp313-win_amd64.pyd +0 -0
  302. scipy/ndimage/_support_alternative_backends.py +18 -6
  303. scipy/ndimage/tests/test_filters.py +370 -259
  304. scipy/ndimage/tests/test_fourier.py +7 -9
  305. scipy/ndimage/tests/test_interpolation.py +68 -61
  306. scipy/ndimage/tests/test_measurements.py +18 -35
  307. scipy/ndimage/tests/test_morphology.py +143 -131
  308. scipy/ndimage/tests/test_splines.py +1 -3
  309. scipy/odr/__odrpack.cp313-win_amd64.dll.a +0 -0
  310. scipy/odr/__odrpack.cp313-win_amd64.pyd +0 -0
  311. scipy/optimize/_basinhopping.py +13 -7
  312. scipy/optimize/_bglu_dense.cp313-win_amd64.dll.a +0 -0
  313. scipy/optimize/_bglu_dense.cp313-win_amd64.pyd +0 -0
  314. scipy/optimize/_bracket.py +17 -24
  315. scipy/optimize/_chandrupatla.py +9 -10
  316. scipy/optimize/_cobyla_py.py +104 -123
  317. scipy/optimize/_constraints.py +14 -10
  318. scipy/optimize/_differentiable_functions.py +371 -230
  319. scipy/optimize/_differentialevolution.py +4 -3
  320. scipy/optimize/_direct.cp313-win_amd64.dll.a +0 -0
  321. scipy/optimize/_direct.cp313-win_amd64.pyd +0 -0
  322. scipy/optimize/_dual_annealing.py +1 -1
  323. scipy/optimize/_elementwise.py +1 -4
  324. scipy/optimize/_group_columns.cp313-win_amd64.dll.a +0 -0
  325. scipy/optimize/_group_columns.cp313-win_amd64.pyd +0 -0
  326. scipy/optimize/_highspy/_core.cp313-win_amd64.dll.a +0 -0
  327. scipy/optimize/_highspy/_core.cp313-win_amd64.pyd +0 -0
  328. scipy/optimize/_highspy/_highs_options.cp313-win_amd64.dll.a +0 -0
  329. scipy/optimize/_highspy/_highs_options.cp313-win_amd64.pyd +0 -0
  330. scipy/optimize/_lbfgsb.cp313-win_amd64.dll.a +0 -0
  331. scipy/optimize/_lbfgsb.cp313-win_amd64.pyd +0 -0
  332. scipy/optimize/_lbfgsb_py.py +57 -16
  333. scipy/optimize/_linprog_doc.py +2 -2
  334. scipy/optimize/_linprog_highs.py +2 -2
  335. scipy/optimize/_linprog_ip.py +25 -10
  336. scipy/optimize/_linprog_util.py +14 -16
  337. scipy/optimize/_lsap.cp313-win_amd64.dll.a +0 -0
  338. scipy/optimize/_lsap.cp313-win_amd64.pyd +0 -0
  339. scipy/optimize/_lsq/common.py +3 -3
  340. scipy/optimize/_lsq/dogbox.py +16 -2
  341. scipy/optimize/_lsq/givens_elimination.cp313-win_amd64.dll.a +0 -0
  342. scipy/optimize/_lsq/givens_elimination.cp313-win_amd64.pyd +0 -0
  343. scipy/optimize/_lsq/least_squares.py +198 -126
  344. scipy/optimize/_lsq/lsq_linear.py +6 -6
  345. scipy/optimize/_lsq/trf.py +35 -8
  346. scipy/optimize/_milp.py +3 -1
  347. scipy/optimize/_minimize.py +105 -36
  348. scipy/optimize/_minpack.cp313-win_amd64.dll.a +0 -0
  349. scipy/optimize/_minpack.cp313-win_amd64.pyd +0 -0
  350. scipy/optimize/_minpack_py.py +21 -14
  351. scipy/optimize/_moduleTNC.cp313-win_amd64.dll.a +0 -0
  352. scipy/optimize/_moduleTNC.cp313-win_amd64.pyd +0 -0
  353. scipy/optimize/_nnls.py +20 -21
  354. scipy/optimize/_nonlin.py +34 -3
  355. scipy/optimize/_numdiff.py +288 -110
  356. scipy/optimize/_optimize.py +86 -48
  357. scipy/optimize/_pava_pybind.cp313-win_amd64.dll.a +0 -0
  358. scipy/optimize/_pava_pybind.cp313-win_amd64.pyd +0 -0
  359. scipy/optimize/_remove_redundancy.py +5 -5
  360. scipy/optimize/_root_scalar.py +1 -1
  361. scipy/optimize/_shgo.py +6 -0
  362. scipy/optimize/_shgo_lib/_complex.py +1 -1
  363. scipy/optimize/_slsqp_py.py +216 -124
  364. scipy/optimize/_slsqplib.cp313-win_amd64.dll.a +0 -0
  365. scipy/optimize/_slsqplib.cp313-win_amd64.pyd +0 -0
  366. scipy/optimize/_spectral.py +1 -1
  367. scipy/optimize/_tnc.py +8 -1
  368. scipy/optimize/_trlib/_trlib.cp313-win_amd64.dll.a +0 -0
  369. scipy/optimize/_trlib/_trlib.cp313-win_amd64.pyd +0 -0
  370. scipy/optimize/_trustregion.py +20 -6
  371. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  372. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  373. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  374. scipy/optimize/_trustregion_constr/projections.py +12 -8
  375. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  376. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  377. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  378. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  379. scipy/optimize/_trustregion_exact.py +0 -1
  380. scipy/optimize/_zeros.cp313-win_amd64.dll.a +0 -0
  381. scipy/optimize/_zeros.cp313-win_amd64.pyd +0 -0
  382. scipy/optimize/_zeros_py.py +97 -17
  383. scipy/optimize/cython_optimize/_zeros.cp313-win_amd64.dll.a +0 -0
  384. scipy/optimize/cython_optimize/_zeros.cp313-win_amd64.pyd +0 -0
  385. scipy/optimize/slsqp.py +0 -1
  386. scipy/optimize/tests/test__basinhopping.py +1 -1
  387. scipy/optimize/tests/test__differential_evolution.py +4 -4
  388. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  389. scipy/optimize/tests/test__numdiff.py +66 -22
  390. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  391. scipy/optimize/tests/test__shgo.py +9 -1
  392. scipy/optimize/tests/test_bracket.py +36 -46
  393. scipy/optimize/tests/test_chandrupatla.py +133 -135
  394. scipy/optimize/tests/test_cobyla.py +74 -45
  395. scipy/optimize/tests/test_constraints.py +1 -1
  396. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  397. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  398. scipy/optimize/tests/test_least_squares.py +125 -13
  399. scipy/optimize/tests/test_linear_assignment.py +3 -3
  400. scipy/optimize/tests/test_linprog.py +3 -3
  401. scipy/optimize/tests/test_lsq_linear.py +6 -6
  402. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  403. scipy/optimize/tests/test_minpack.py +4 -4
  404. scipy/optimize/tests/test_nnls.py +43 -3
  405. scipy/optimize/tests/test_nonlin.py +36 -0
  406. scipy/optimize/tests/test_optimize.py +95 -17
  407. scipy/optimize/tests/test_slsqp.py +36 -4
  408. scipy/optimize/tests/test_zeros.py +34 -1
  409. scipy/signal/__init__.py +12 -23
  410. scipy/signal/_delegators.py +568 -0
  411. scipy/signal/_filter_design.py +459 -241
  412. scipy/signal/_fir_filter_design.py +262 -90
  413. scipy/signal/_lti_conversion.py +3 -2
  414. scipy/signal/_ltisys.py +118 -91
  415. scipy/signal/_max_len_seq_inner.cp313-win_amd64.dll.a +0 -0
  416. scipy/signal/_max_len_seq_inner.cp313-win_amd64.pyd +0 -0
  417. scipy/signal/_peak_finding_utils.cp313-win_amd64.dll.a +0 -0
  418. scipy/signal/_peak_finding_utils.cp313-win_amd64.pyd +0 -0
  419. scipy/signal/_polyutils.py +172 -0
  420. scipy/signal/_short_time_fft.py +519 -70
  421. scipy/signal/_signal_api.py +30 -0
  422. scipy/signal/_signaltools.py +719 -399
  423. scipy/signal/_sigtools.cp313-win_amd64.dll.a +0 -0
  424. scipy/signal/_sigtools.cp313-win_amd64.pyd +0 -0
  425. scipy/signal/_sosfilt.cp313-win_amd64.dll.a +0 -0
  426. scipy/signal/_sosfilt.cp313-win_amd64.pyd +0 -0
  427. scipy/signal/_spectral_py.py +230 -50
  428. scipy/signal/_spline.cp313-win_amd64.dll.a +0 -0
  429. scipy/signal/_spline.cp313-win_amd64.pyd +0 -0
  430. scipy/signal/_spline_filters.py +108 -68
  431. scipy/signal/_support_alternative_backends.py +73 -0
  432. scipy/signal/_upfirdn.py +4 -1
  433. scipy/signal/_upfirdn_apply.cp313-win_amd64.dll.a +0 -0
  434. scipy/signal/_upfirdn_apply.cp313-win_amd64.pyd +0 -0
  435. scipy/signal/_waveforms.py +2 -11
  436. scipy/signal/_wavelets.py +1 -1
  437. scipy/signal/fir_filter_design.py +1 -0
  438. scipy/signal/spline.py +4 -11
  439. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  440. scipy/signal/tests/test_bsplines.py +114 -79
  441. scipy/signal/tests/test_cont2discrete.py +9 -2
  442. scipy/signal/tests/test_filter_design.py +721 -481
  443. scipy/signal/tests/test_fir_filter_design.py +332 -140
  444. scipy/signal/tests/test_savitzky_golay.py +4 -3
  445. scipy/signal/tests/test_short_time_fft.py +221 -3
  446. scipy/signal/tests/test_signaltools.py +2144 -1348
  447. scipy/signal/tests/test_spectral.py +50 -6
  448. scipy/signal/tests/test_splines.py +161 -96
  449. scipy/signal/tests/test_upfirdn.py +84 -50
  450. scipy/signal/tests/test_waveforms.py +20 -0
  451. scipy/signal/tests/test_windows.py +607 -466
  452. scipy/signal/windows/_windows.py +287 -148
  453. scipy/sparse/__init__.py +23 -4
  454. scipy/sparse/_base.py +270 -108
  455. scipy/sparse/_bsr.py +7 -4
  456. scipy/sparse/_compressed.py +59 -231
  457. scipy/sparse/_construct.py +90 -38
  458. scipy/sparse/_coo.py +115 -181
  459. scipy/sparse/_csc.py +4 -4
  460. scipy/sparse/_csparsetools.cp313-win_amd64.dll.a +0 -0
  461. scipy/sparse/_csparsetools.cp313-win_amd64.pyd +0 -0
  462. scipy/sparse/_csr.py +2 -2
  463. scipy/sparse/_data.py +48 -48
  464. scipy/sparse/_dia.py +105 -18
  465. scipy/sparse/_dok.py +0 -23
  466. scipy/sparse/_index.py +4 -4
  467. scipy/sparse/_matrix.py +23 -0
  468. scipy/sparse/_sparsetools.cp313-win_amd64.dll.a +0 -0
  469. scipy/sparse/_sparsetools.cp313-win_amd64.pyd +0 -0
  470. scipy/sparse/_sputils.py +37 -22
  471. scipy/sparse/base.py +0 -9
  472. scipy/sparse/bsr.py +0 -14
  473. scipy/sparse/compressed.py +0 -23
  474. scipy/sparse/construct.py +0 -6
  475. scipy/sparse/coo.py +0 -14
  476. scipy/sparse/csc.py +0 -3
  477. scipy/sparse/csgraph/_flow.cp313-win_amd64.dll.a +0 -0
  478. scipy/sparse/csgraph/_flow.cp313-win_amd64.pyd +0 -0
  479. scipy/sparse/csgraph/_matching.cp313-win_amd64.dll.a +0 -0
  480. scipy/sparse/csgraph/_matching.cp313-win_amd64.pyd +0 -0
  481. scipy/sparse/csgraph/_min_spanning_tree.cp313-win_amd64.dll.a +0 -0
  482. scipy/sparse/csgraph/_min_spanning_tree.cp313-win_amd64.pyd +0 -0
  483. scipy/sparse/csgraph/_reordering.cp313-win_amd64.dll.a +0 -0
  484. scipy/sparse/csgraph/_reordering.cp313-win_amd64.pyd +0 -0
  485. scipy/sparse/csgraph/_shortest_path.cp313-win_amd64.dll.a +0 -0
  486. scipy/sparse/csgraph/_shortest_path.cp313-win_amd64.pyd +0 -0
  487. scipy/sparse/csgraph/_tools.cp313-win_amd64.dll.a +0 -0
  488. scipy/sparse/csgraph/_tools.cp313-win_amd64.pyd +0 -0
  489. scipy/sparse/csgraph/_traversal.cp313-win_amd64.dll.a +0 -0
  490. scipy/sparse/csgraph/_traversal.cp313-win_amd64.pyd +0 -0
  491. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  492. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  493. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  494. scipy/sparse/csr.py +0 -5
  495. scipy/sparse/data.py +1 -6
  496. scipy/sparse/dia.py +0 -7
  497. scipy/sparse/dok.py +0 -10
  498. scipy/sparse/linalg/_dsolve/_superlu.cp313-win_amd64.dll.a +0 -0
  499. scipy/sparse/linalg/_dsolve/_superlu.cp313-win_amd64.pyd +0 -0
  500. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  501. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  502. scipy/sparse/linalg/_eigen/arpack/_arpack.cp313-win_amd64.dll.a +0 -0
  503. scipy/sparse/linalg/_eigen/arpack/_arpack.cp313-win_amd64.pyd +0 -0
  504. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  505. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  506. scipy/sparse/linalg/_interface.py +17 -18
  507. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  508. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  509. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  510. scipy/sparse/linalg/_isolve/minres.py +5 -5
  511. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  512. scipy/sparse/linalg/_isolve/utils.py +2 -8
  513. scipy/sparse/linalg/_matfuncs.py +1 -1
  514. scipy/sparse/linalg/_norm.py +1 -1
  515. scipy/sparse/linalg/_propack/_cpropack.cp313-win_amd64.dll.a +0 -0
  516. scipy/sparse/linalg/_propack/_cpropack.cp313-win_amd64.pyd +0 -0
  517. scipy/sparse/linalg/_propack/_dpropack.cp313-win_amd64.dll.a +0 -0
  518. scipy/sparse/linalg/_propack/_dpropack.cp313-win_amd64.pyd +0 -0
  519. scipy/sparse/linalg/_propack/_spropack.cp313-win_amd64.dll.a +0 -0
  520. scipy/sparse/linalg/_propack/_spropack.cp313-win_amd64.pyd +0 -0
  521. scipy/sparse/linalg/_propack/_zpropack.cp313-win_amd64.dll.a +0 -0
  522. scipy/sparse/linalg/_propack/_zpropack.cp313-win_amd64.pyd +0 -0
  523. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  524. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  525. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  526. scipy/sparse/tests/test_base.py +214 -42
  527. scipy/sparse/tests/test_common1d.py +7 -7
  528. scipy/sparse/tests/test_construct.py +1 -1
  529. scipy/sparse/tests/test_coo.py +272 -4
  530. scipy/sparse/tests/test_sparsetools.py +5 -0
  531. scipy/sparse/tests/test_sputils.py +36 -7
  532. scipy/spatial/_ckdtree.cp313-win_amd64.dll.a +0 -0
  533. scipy/spatial/_ckdtree.cp313-win_amd64.pyd +0 -0
  534. scipy/spatial/_distance_pybind.cp313-win_amd64.dll.a +0 -0
  535. scipy/spatial/_distance_pybind.cp313-win_amd64.pyd +0 -0
  536. scipy/spatial/_distance_wrap.cp313-win_amd64.dll.a +0 -0
  537. scipy/spatial/_distance_wrap.cp313-win_amd64.pyd +0 -0
  538. scipy/spatial/_hausdorff.cp313-win_amd64.dll.a +0 -0
  539. scipy/spatial/_hausdorff.cp313-win_amd64.pyd +0 -0
  540. scipy/spatial/_qhull.cp313-win_amd64.dll.a +0 -0
  541. scipy/spatial/_qhull.cp313-win_amd64.pyd +0 -0
  542. scipy/spatial/_voronoi.cp313-win_amd64.dll.a +0 -0
  543. scipy/spatial/_voronoi.cp313-win_amd64.pyd +0 -0
  544. scipy/spatial/distance.py +49 -42
  545. scipy/spatial/tests/test_distance.py +15 -1
  546. scipy/spatial/tests/test_kdtree.py +1 -0
  547. scipy/spatial/tests/test_qhull.py +7 -2
  548. scipy/spatial/transform/__init__.py +5 -3
  549. scipy/spatial/transform/_rigid_transform.cp313-win_amd64.dll.a +0 -0
  550. scipy/spatial/transform/_rigid_transform.cp313-win_amd64.pyd +0 -0
  551. scipy/spatial/transform/_rotation.cp313-win_amd64.dll.a +0 -0
  552. scipy/spatial/transform/_rotation.cp313-win_amd64.pyd +0 -0
  553. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  554. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  555. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  556. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  557. scipy/special/__init__.py +1 -47
  558. scipy/special/_add_newdocs.py +34 -772
  559. scipy/special/_basic.py +22 -25
  560. scipy/special/_comb.cp313-win_amd64.dll.a +0 -0
  561. scipy/special/_comb.cp313-win_amd64.pyd +0 -0
  562. scipy/special/_ellip_harm_2.cp313-win_amd64.dll.a +0 -0
  563. scipy/special/_ellip_harm_2.cp313-win_amd64.pyd +0 -0
  564. scipy/special/_gufuncs.cp313-win_amd64.dll.a +0 -0
  565. scipy/special/_gufuncs.cp313-win_amd64.pyd +0 -0
  566. scipy/special/_logsumexp.py +67 -58
  567. scipy/special/_orthogonal.pyi +1 -1
  568. scipy/special/_specfun.cp313-win_amd64.dll.a +0 -0
  569. scipy/special/_specfun.cp313-win_amd64.pyd +0 -0
  570. scipy/special/_special_ufuncs.cp313-win_amd64.dll.a +0 -0
  571. scipy/special/_special_ufuncs.cp313-win_amd64.pyd +0 -0
  572. scipy/special/_spherical_bessel.py +4 -4
  573. scipy/special/_support_alternative_backends.py +212 -119
  574. scipy/special/_test_internal.cp313-win_amd64.dll.a +0 -0
  575. scipy/special/_test_internal.cp313-win_amd64.pyd +0 -0
  576. scipy/special/_testutils.py +4 -4
  577. scipy/special/_ufuncs.cp313-win_amd64.dll.a +0 -0
  578. scipy/special/_ufuncs.cp313-win_amd64.pyd +0 -0
  579. scipy/special/_ufuncs.pyi +1 -0
  580. scipy/special/_ufuncs.pyx +215 -1400
  581. scipy/special/_ufuncs_cxx.cp313-win_amd64.dll.a +0 -0
  582. scipy/special/_ufuncs_cxx.cp313-win_amd64.pyd +0 -0
  583. scipy/special/_ufuncs_cxx.pxd +2 -15
  584. scipy/special/_ufuncs_cxx.pyx +5 -44
  585. scipy/special/_ufuncs_cxx_defs.h +2 -16
  586. scipy/special/_ufuncs_defs.h +0 -8
  587. scipy/special/cython_special.cp313-win_amd64.dll.a +0 -0
  588. scipy/special/cython_special.cp313-win_amd64.pyd +0 -0
  589. scipy/special/cython_special.pxd +1 -1
  590. scipy/special/tests/_cython_examples/meson.build +10 -1
  591. scipy/special/tests/test_basic.py +153 -20
  592. scipy/special/tests/test_boost_ufuncs.py +3 -0
  593. scipy/special/tests/test_cdflib.py +35 -11
  594. scipy/special/tests/test_gammainc.py +16 -0
  595. scipy/special/tests/test_hyp2f1.py +2 -2
  596. scipy/special/tests/test_log1mexp.py +85 -0
  597. scipy/special/tests/test_logsumexp.py +206 -64
  598. scipy/special/tests/test_mpmath.py +1 -0
  599. scipy/special/tests/test_nan_inputs.py +1 -1
  600. scipy/special/tests/test_orthogonal.py +17 -18
  601. scipy/special/tests/test_sf_error.py +3 -2
  602. scipy/special/tests/test_sph_harm.py +6 -7
  603. scipy/special/tests/test_support_alternative_backends.py +211 -76
  604. scipy/stats/__init__.py +4 -1
  605. scipy/stats/_ansari_swilk_statistics.cp313-win_amd64.dll.a +0 -0
  606. scipy/stats/_ansari_swilk_statistics.cp313-win_amd64.pyd +0 -0
  607. scipy/stats/_axis_nan_policy.py +5 -12
  608. scipy/stats/_biasedurn.cp313-win_amd64.dll.a +0 -0
  609. scipy/stats/_biasedurn.cp313-win_amd64.pyd +0 -0
  610. scipy/stats/_continued_fraction.py +387 -0
  611. scipy/stats/_continuous_distns.py +277 -310
  612. scipy/stats/_correlation.py +1 -1
  613. scipy/stats/_covariance.py +6 -3
  614. scipy/stats/_discrete_distns.py +39 -32
  615. scipy/stats/_distn_infrastructure.py +39 -12
  616. scipy/stats/_distribution_infrastructure.py +900 -238
  617. scipy/stats/_entropy.py +9 -10
  618. scipy/{_lib → stats}/_finite_differences.py +1 -1
  619. scipy/stats/_hypotests.py +83 -50
  620. scipy/stats/_kde.py +53 -49
  621. scipy/stats/_ksstats.py +1 -1
  622. scipy/stats/_levy_stable/__init__.py +7 -15
  623. scipy/stats/_levy_stable/levyst.cp313-win_amd64.dll.a +0 -0
  624. scipy/stats/_levy_stable/levyst.cp313-win_amd64.pyd +0 -0
  625. scipy/stats/_morestats.py +118 -73
  626. scipy/stats/_mstats_basic.py +13 -17
  627. scipy/stats/_mstats_extras.py +8 -8
  628. scipy/stats/_multivariate.py +89 -113
  629. scipy/stats/_new_distributions.py +97 -20
  630. scipy/stats/_page_trend_test.py +12 -5
  631. scipy/stats/_probability_distribution.py +265 -43
  632. scipy/stats/_qmc.py +14 -9
  633. scipy/stats/_qmc_cy.cp313-win_amd64.dll.a +0 -0
  634. scipy/stats/_qmc_cy.cp313-win_amd64.pyd +0 -0
  635. scipy/stats/_qmvnt.py +16 -95
  636. scipy/stats/_qmvnt_cy.cp313-win_amd64.dll.a +0 -0
  637. scipy/stats/_qmvnt_cy.cp313-win_amd64.pyd +0 -0
  638. scipy/stats/_quantile.py +335 -0
  639. scipy/stats/_rcont/rcont.cp313-win_amd64.dll.a +0 -0
  640. scipy/stats/_rcont/rcont.cp313-win_amd64.pyd +0 -0
  641. scipy/stats/_resampling.py +4 -29
  642. scipy/stats/_sampling.py +1 -1
  643. scipy/stats/_sobol.cp313-win_amd64.dll.a +0 -0
  644. scipy/stats/_sobol.cp313-win_amd64.pyd +0 -0
  645. scipy/stats/_stats.cp313-win_amd64.dll.a +0 -0
  646. scipy/stats/_stats.cp313-win_amd64.pyd +0 -0
  647. scipy/stats/_stats_mstats_common.py +21 -2
  648. scipy/stats/_stats_py.py +550 -476
  649. scipy/stats/_stats_pythran.cp313-win_amd64.dll.a +0 -0
  650. scipy/stats/_stats_pythran.cp313-win_amd64.pyd +0 -0
  651. scipy/stats/_unuran/unuran_wrapper.cp313-win_amd64.dll.a +0 -0
  652. scipy/stats/_unuran/unuran_wrapper.cp313-win_amd64.pyd +0 -0
  653. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  654. scipy/stats/_variation.py +6 -8
  655. scipy/stats/_wilcoxon.py +13 -7
  656. scipy/stats/tests/common_tests.py +6 -4
  657. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  658. scipy/stats/tests/test_continued_fraction.py +173 -0
  659. scipy/stats/tests/test_continuous.py +379 -60
  660. scipy/stats/tests/test_continuous_basic.py +18 -12
  661. scipy/stats/tests/test_discrete_basic.py +14 -8
  662. scipy/stats/tests/test_discrete_distns.py +16 -16
  663. scipy/stats/tests/test_distributions.py +95 -75
  664. scipy/stats/tests/test_entropy.py +40 -48
  665. scipy/stats/tests/test_fit.py +4 -3
  666. scipy/stats/tests/test_hypotests.py +153 -24
  667. scipy/stats/tests/test_kdeoth.py +109 -41
  668. scipy/stats/tests/test_marray.py +289 -0
  669. scipy/stats/tests/test_morestats.py +79 -47
  670. scipy/stats/tests/test_mstats_basic.py +3 -3
  671. scipy/stats/tests/test_multivariate.py +434 -83
  672. scipy/stats/tests/test_qmc.py +13 -10
  673. scipy/stats/tests/test_quantile.py +199 -0
  674. scipy/stats/tests/test_rank.py +119 -112
  675. scipy/stats/tests/test_resampling.py +47 -56
  676. scipy/stats/tests/test_sampling.py +9 -4
  677. scipy/stats/tests/test_stats.py +799 -939
  678. scipy/stats/tests/test_variation.py +8 -6
  679. scipy/version.py +2 -2
  680. scipy-1.16.0rc2.dist-info/DELVEWHEEL +2 -0
  681. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  682. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  683. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +685 -693
  684. scipy/_lib/array_api_extra/_funcs.py +0 -484
  685. scipy/_lib/array_api_extra/_typing.py +0 -8
  686. scipy/interpolate/_bspl.cp313-win_amd64.dll.a +0 -0
  687. scipy/interpolate/_bspl.cp313-win_amd64.pyd +0 -0
  688. scipy/optimize/_cobyla.cp313-win_amd64.dll.a +0 -0
  689. scipy/optimize/_cobyla.cp313-win_amd64.pyd +0 -0
  690. scipy/optimize/_cython_nnls.cp313-win_amd64.dll.a +0 -0
  691. scipy/optimize/_cython_nnls.cp313-win_amd64.pyd +0 -0
  692. scipy/optimize/_slsqp.cp313-win_amd64.dll.a +0 -0
  693. scipy/optimize/_slsqp.cp313-win_amd64.pyd +0 -0
  694. scipy/spatial/qhull_src/COPYING.txt +0 -38
  695. scipy/special/libsf_error_state.dll +0 -0
  696. scipy/special/libsf_error_state.dll.a +0 -0
  697. scipy/special/tests/test_log_softmax.py +0 -109
  698. scipy/special/tests/test_xsf_cuda.py +0 -114
  699. scipy/special/xsf/binom.h +0 -89
  700. scipy/special/xsf/cdflib.h +0 -100
  701. scipy/special/xsf/cephes/airy.h +0 -307
  702. scipy/special/xsf/cephes/besselpoly.h +0 -51
  703. scipy/special/xsf/cephes/beta.h +0 -257
  704. scipy/special/xsf/cephes/cbrt.h +0 -131
  705. scipy/special/xsf/cephes/chbevl.h +0 -85
  706. scipy/special/xsf/cephes/chdtr.h +0 -193
  707. scipy/special/xsf/cephes/const.h +0 -87
  708. scipy/special/xsf/cephes/ellie.h +0 -293
  709. scipy/special/xsf/cephes/ellik.h +0 -251
  710. scipy/special/xsf/cephes/ellpe.h +0 -107
  711. scipy/special/xsf/cephes/ellpk.h +0 -117
  712. scipy/special/xsf/cephes/expn.h +0 -260
  713. scipy/special/xsf/cephes/gamma.h +0 -398
  714. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  715. scipy/special/xsf/cephes/hyperg.h +0 -361
  716. scipy/special/xsf/cephes/i0.h +0 -149
  717. scipy/special/xsf/cephes/i1.h +0 -158
  718. scipy/special/xsf/cephes/igam.h +0 -421
  719. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  720. scipy/special/xsf/cephes/igami.h +0 -313
  721. scipy/special/xsf/cephes/j0.h +0 -225
  722. scipy/special/xsf/cephes/j1.h +0 -198
  723. scipy/special/xsf/cephes/jv.h +0 -715
  724. scipy/special/xsf/cephes/k0.h +0 -164
  725. scipy/special/xsf/cephes/k1.h +0 -163
  726. scipy/special/xsf/cephes/kn.h +0 -243
  727. scipy/special/xsf/cephes/lanczos.h +0 -112
  728. scipy/special/xsf/cephes/ndtr.h +0 -275
  729. scipy/special/xsf/cephes/poch.h +0 -85
  730. scipy/special/xsf/cephes/polevl.h +0 -167
  731. scipy/special/xsf/cephes/psi.h +0 -194
  732. scipy/special/xsf/cephes/rgamma.h +0 -111
  733. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  734. scipy/special/xsf/cephes/shichi.h +0 -248
  735. scipy/special/xsf/cephes/sici.h +0 -224
  736. scipy/special/xsf/cephes/sindg.h +0 -221
  737. scipy/special/xsf/cephes/tandg.h +0 -139
  738. scipy/special/xsf/cephes/trig.h +0 -58
  739. scipy/special/xsf/cephes/unity.h +0 -186
  740. scipy/special/xsf/cephes/zeta.h +0 -172
  741. scipy/special/xsf/config.h +0 -304
  742. scipy/special/xsf/digamma.h +0 -205
  743. scipy/special/xsf/error.h +0 -57
  744. scipy/special/xsf/evalpoly.h +0 -47
  745. scipy/special/xsf/expint.h +0 -266
  746. scipy/special/xsf/hyp2f1.h +0 -694
  747. scipy/special/xsf/iv_ratio.h +0 -173
  748. scipy/special/xsf/lambertw.h +0 -150
  749. scipy/special/xsf/loggamma.h +0 -163
  750. scipy/special/xsf/sici.h +0 -200
  751. scipy/special/xsf/tools.h +0 -427
  752. scipy/special/xsf/trig.h +0 -164
  753. scipy/special/xsf/wright_bessel.h +0 -843
  754. scipy/special/xsf/zlog1.h +0 -35
  755. scipy/stats/_mvn.cp313-win_amd64.dll.a +0 -0
  756. scipy/stats/_mvn.cp313-win_amd64.pyd +0 -0
  757. scipy-1.15.3.dist-info/DELVEWHEEL +0 -2
  758. /scipy-1.15.3-cp313-cp313-win_amd64.whl → /scipy-1.16.0rc2-cp313-cp313-win_amd64.whl +0 -0
  759. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
@@ -463,8 +463,8 @@ def _split_subregion(a, b, xp, split_at=None):
463
463
  if split_at is None:
464
464
  split_at = (a + b) / 2
465
465
 
466
- left = [xp.asarray([a[i], split_at[i]]) for i in range(a.shape[0])]
467
- right = [xp.asarray([split_at[i], b[i]]) for i in range(b.shape[0])]
466
+ left = [xp.stack((a[i], split_at[i])) for i in range(a.shape[0])]
467
+ right = [xp.stack((split_at[i], b[i])) for i in range(b.shape[0])]
468
468
 
469
469
  a_sub = _cartesian_product(left)
470
470
  b_sub = _cartesian_product(right)
@@ -5,7 +5,7 @@ from scipy import special
5
5
  import scipy._lib._elementwise_iterative_method as eim
6
6
  from scipy._lib._util import _RichResult
7
7
  from scipy._lib._array_api import (array_namespace, xp_copy, xp_ravel,
8
- xp_real, xp_take_along_axis)
8
+ xp_promote)
9
9
 
10
10
 
11
11
  __all__ = ['nsum']
@@ -97,13 +97,10 @@ def tanhsinh(f, a, b, *, args=(), log=False, maxlevel=None, minlevel=2,
97
97
  atol, rtol : float, optional
98
98
  Absolute termination tolerance (default: 0) and relative termination
99
99
  tolerance (default: ``eps**0.75``, where ``eps`` is the precision of
100
- the result dtype), respectively. Iteration will stop when
101
- ``res.error < atol`` or ``res.error < res.integral * rtol``. The error
102
- estimate is as described in [1]_ Section 5 but with a lower bound of
103
- ``eps * res.integral``. While not theoretically rigorous or
104
- conservative, it is said to work well in practice. Must be non-negative
105
- and finite if `log` is False, and must be expressed as the log of a
106
- non-negative and finite number if `log` is True.
100
+ the result dtype), respectively. Must be non-negative and finite if
101
+ `log` is False, and must be expressed as the log of a non-negative and
102
+ finite number if `log` is True. Iteration will stop when
103
+ ``res.error < atol`` or ``res.error < res.integral * rtol``.
107
104
  preserve_shape : bool, default: False
108
105
  In the following, "arguments of `f`" refers to the array ``xi`` and
109
106
  any arrays within ``argsi``. Let ``shape`` be the broadcasted shape
@@ -128,7 +125,7 @@ def tanhsinh(f, a, b, *, args=(), log=False, maxlevel=None, minlevel=2,
128
125
  An optional user-supplied function to be called before the first
129
126
  iteration and after each iteration.
130
127
  Called as ``callback(res)``, where ``res`` is a ``_RichResult``
131
- similar to that returned by `_differentiate` (but containing the
128
+ similar to that returned by `tanhsinh` (but containing the
132
129
  current iterate's values of all variables). If `callback` raises a
133
130
  ``StopIteration``, the algorithm will terminate immediately and
134
131
  `tanhsinh` will return a result object. `callback` must not mutate
@@ -175,6 +172,12 @@ def tanhsinh(f, a, b, *, args=(), log=False, maxlevel=None, minlevel=2,
175
172
  finite-precision arithmetic, including some described by [2]_ and [3]_. The
176
173
  tanh-sinh scheme was originally introduced in [4]_.
177
174
 
175
+ Two error estimation schemes are described in [1]_ Section 5: one attempts to
176
+ detect and exploit quadratic convergence; the other simply compares the integral
177
+ estimates at successive levels. While neither is theoretically rigorous or
178
+ conservative, both work well in practice. Our error estimate uses the minimum of
179
+ these two schemes with a lower bound of ``eps * res.integral``.
180
+
178
181
  Due to floating-point error in the abscissae, the function may be evaluated
179
182
  at the endpoints of the interval during iterations, but the values returned by
180
183
  the function at the endpoints will be ignored.
@@ -364,7 +367,7 @@ def tanhsinh(f, a, b, *, args=(), log=False, maxlevel=None, minlevel=2,
364
367
  aerr = xp_ravel(xp.full(shape, xp.nan, dtype=dtype)) # absolute error
365
368
  status = xp_ravel(xp.full(shape, eim._EINPROGRESS, dtype=xp.int32))
366
369
  h0 = _get_base_step(dtype, xp)
367
- h0 = xp_real(h0) # base step
370
+ h0 = xp.real(h0) # base step
368
371
 
369
372
  # For term `d4` of error estimate ([1] Section 5), we need to keep the
370
373
  # most extreme abscissae and corresponding `fj`s, `wj`s in Euler-Maclaurin
@@ -403,8 +406,7 @@ def tanhsinh(f, a, b, *, args=(), log=False, maxlevel=None, minlevel=2,
403
406
 
404
407
  # Perform abscissae substitutions for infinite limits of integration
405
408
  xj = xp_copy(work.xj)
406
- # use xp_real here to avoid cupy/cupy#8434
407
- xj[work.abinf] = xj[work.abinf] / (1 - xp_real(xj[work.abinf])**2)
409
+ xj[work.abinf] = xj[work.abinf] / (1 - xp.real(xj[work.abinf])**2)
408
410
  xj[work.binf] = 1/xj[work.binf] - 1 + work.a0[work.binf]
409
411
  xj[work.ainf] *= -1
410
412
  return xj
@@ -454,7 +456,7 @@ def tanhsinh(f, a, b, *, args=(), log=False, maxlevel=None, minlevel=2,
454
456
 
455
457
  # Terminate if integral estimate becomes invalid
456
458
  if log:
457
- Sn_real = xp_real(work.Sn)
459
+ Sn_real = xp.real(work.Sn)
458
460
  Sn_pos_inf = xp.isinf(Sn_real) & (Sn_real > 0)
459
461
  i = (Sn_pos_inf | xp.isnan(work.Sn)) & ~stop
460
462
  else:
@@ -473,10 +475,7 @@ def tanhsinh(f, a, b, *, args=(), log=False, maxlevel=None, minlevel=2,
473
475
  # If the integration limits were such that b < a, we reversed them
474
476
  # to perform the calculation, and the final result needs to be negated.
475
477
  if log and xp.any(negative):
476
- dtype = res['integral'].dtype
477
- pi = xp.asarray(xp.pi, dtype=dtype)[()]
478
- j = xp.asarray(1j, dtype=xp.complex64)[()] # minimum complex type
479
- res['integral'] = res['integral'] + negative*pi*j
478
+ res['integral'] = res['integral'] + negative * xp.pi * 1.0j
480
479
  else:
481
480
  res['integral'][negative] *= -1
482
481
 
@@ -615,7 +614,7 @@ def _transform_to_limits(xjc, wj, a, b, xp):
615
614
  # these points; however, we can't easily filter out points since this
616
615
  # function is vectorized. Instead, zero the weights.
617
616
  # Note: values may have complex dtype, but have zero imaginary part
618
- xj_real, a_real, b_real = xp_real(xj), xp_real(a), xp_real(b)
617
+ xj_real, a_real, b_real = xp.real(xj), xp.real(a), xp.real(b)
619
618
  invalid = (xj_real <= a_real) | (xj_real >= b_real)
620
619
  wj[invalid] = 0
621
620
  return xj, wj
@@ -646,16 +645,16 @@ def _euler_maclaurin_sum(fj, work, xp):
646
645
 
647
646
  # integer index of the maximum abscissa at this level
648
647
  xr[invalid_r] = -xp.inf
649
- ir = xp.argmax(xp_real(xr), axis=0, keepdims=True)
648
+ ir = xp.argmax(xp.real(xr), axis=0, keepdims=True)
650
649
  # abscissa, function value, and weight at this index
651
650
  ### Not Array API Compatible... yet ###
652
- xr_max = xp_take_along_axis(xr, ir, axis=0)[0]
653
- fr_max = xp_take_along_axis(fr, ir, axis=0)[0]
654
- wr_max = xp_take_along_axis(wr, ir, axis=0)[0]
651
+ xr_max = xp.take_along_axis(xr, ir, axis=0)[0]
652
+ fr_max = xp.take_along_axis(fr, ir, axis=0)[0]
653
+ wr_max = xp.take_along_axis(wr, ir, axis=0)[0]
655
654
  # boolean indices at which maximum abscissa at this level exceeds
656
655
  # the incumbent maximum abscissa (from all previous levels)
657
656
  # note: abscissa may have complex dtype, but will have zero imaginary part
658
- j = xp_real(xr_max) > xp_real(xr0)
657
+ j = xp.real(xr_max) > xp.real(xr0)
659
658
  # Update record of the incumbent abscissa, function value, and weight
660
659
  xr0[j] = xr_max[j]
661
660
  fr0[j] = fr_max[j]
@@ -663,15 +662,15 @@ def _euler_maclaurin_sum(fj, work, xp):
663
662
 
664
663
  # integer index of the minimum abscissa at this level
665
664
  xl[invalid_l] = xp.inf
666
- il = xp.argmin(xp_real(xl), axis=0, keepdims=True)
665
+ il = xp.argmin(xp.real(xl), axis=0, keepdims=True)
667
666
  # abscissa, function value, and weight at this index
668
- xl_min = xp_take_along_axis(xl, il, axis=0)[0]
669
- fl_min = xp_take_along_axis(fl, il, axis=0)[0]
670
- wl_min = xp_take_along_axis(wl, il, axis=0)[0]
667
+ xl_min = xp.take_along_axis(xl, il, axis=0)[0]
668
+ fl_min = xp.take_along_axis(fl, il, axis=0)[0]
669
+ wl_min = xp.take_along_axis(wl, il, axis=0)[0]
671
670
  # boolean indices at which minimum abscissa at this level is less than
672
671
  # the incumbent minimum abscissa (from all previous levels)
673
672
  # note: abscissa may have complex dtype, but will have zero imaginary part
674
- j = xp_real(xl_min) < xp_real(xl0)
673
+ j = xp.real(xl_min) < xp.real(xl0)
675
674
  # Update record of the incumbent abscissa, function value, and weight
676
675
  xl0[j] = xl_min[j]
677
676
  fl0[j] = fl_min[j]
@@ -682,7 +681,7 @@ def _euler_maclaurin_sum(fj, work, xp):
682
681
  # rightmost term, whichever is greater.
683
682
  flwl0 = fl0 + xp.log(wl0) if work.log else fl0 * wl0 # leftmost term
684
683
  frwr0 = fr0 + xp.log(wr0) if work.log else fr0 * wr0 # rightmost term
685
- magnitude = xp_real if work.log else xp.abs
684
+ magnitude = xp.real if work.log else xp.abs
686
685
  work.d4 = xp.maximum(magnitude(flwl0), magnitude(frwr0))
687
686
 
688
687
  # There are two approaches to dealing with function values that are
@@ -769,14 +768,14 @@ def _estimate_error(work, xp):
769
768
  # complex values have imaginary part in increments of pi*j, which just
770
769
  # carries sign information of the original integral, so use of
771
770
  # `xp.real` here is equivalent to absolute value in real scale.
772
- d1 = xp_real(special.logsumexp(xp.stack([work.Sn, Snm1 + work.pi*1j]), axis=0))
773
- d2 = xp_real(special.logsumexp(xp.stack([work.Sn, Snm2 + work.pi*1j]), axis=0))
774
- d3 = log_e1 + xp.max(xp_real(work.fjwj), axis=-1)
771
+ d1 = xp.real(special.logsumexp(xp.stack([work.Sn, Snm1 + work.pi*1j]), axis=0))
772
+ d2 = xp.real(special.logsumexp(xp.stack([work.Sn, Snm2 + work.pi*1j]), axis=0))
773
+ d3 = log_e1 + xp.max(xp.real(work.fjwj), axis=-1)
775
774
  d4 = work.d4
776
775
  d5 = log_e1 + xp.real(work.Sn)
777
776
  temp = xp.where(d1 > -xp.inf, d1 ** 2 / d2, -xp.inf)
778
- ds = xp.stack([temp, 2 * d1, d3, d4, d5])
779
- aerr = xp.max(ds, axis=0)
777
+ ds = xp.stack([temp, 2 * d1, d3, d4])
778
+ aerr = xp.clip(xp.max(ds, axis=0), d5, d1)
780
779
  rerr = aerr - xp.real(work.Sn)
781
780
  else:
782
781
  # Note: explicit computation of log10 of each of these is unnecessary.
@@ -786,8 +785,8 @@ def _estimate_error(work, xp):
786
785
  d4 = work.d4
787
786
  d5 = e1 * xp.abs(work.Sn)
788
787
  temp = xp.where(d1 > 0, d1**(xp.log(d1)/xp.log(d2)), 0)
789
- ds = xp.stack([temp, d1**2, d3, d4, d5])
790
- aerr = xp.max(ds, axis=0)
788
+ ds = xp.stack([temp, d1**2, d3, d4])
789
+ aerr = xp.clip(xp.max(ds, axis=0), d5, d1)
791
790
  rerr = aerr/xp.abs(work.Sn)
792
791
 
793
792
  return rerr, aerr
@@ -804,7 +803,7 @@ def _transform_integrals(a, b, xp):
804
803
  a[ab_same], b[ab_same] = 1, 1
805
804
 
806
805
  # `a, b` may have complex dtype but have zero imaginary part
807
- negative = xp_real(b) < xp_real(a)
806
+ negative = xp.real(b) < xp.real(a)
808
807
  a[negative], b[negative] = b[negative], a[negative]
809
808
 
810
809
  abinf = xp.isinf(a) & xp.isinf(b)
@@ -825,14 +824,13 @@ def _tanhsinh_iv(f, a, b, log, maxfun, maxlevel, minlevel,
825
824
  # Input validation and standardization
826
825
 
827
826
  xp = array_namespace(a, b)
827
+ a, b = xp_promote(a, b, broadcast=True, force_floating=True, xp=xp)
828
828
 
829
829
  message = '`f` must be callable.'
830
830
  if not callable(f):
831
831
  raise ValueError(message)
832
832
 
833
833
  message = 'All elements of `a` and `b` must be real numbers.'
834
- a, b = xp.asarray(a), xp.asarray(b)
835
- a, b = xp.broadcast_arrays(a, b)
836
834
  if (xp.isdtype(a.dtype, 'complex floating')
837
835
  or xp.isdtype(b.dtype, 'complex floating')):
838
836
  raise ValueError(message)
@@ -901,16 +899,15 @@ def _tanhsinh_iv(f, a, b, log, maxfun, maxlevel, minlevel,
901
899
  def _nsum_iv(f, a, b, step, args, log, maxterms, tolerances):
902
900
  # Input validation and standardization
903
901
 
904
- xp = array_namespace(a, b)
902
+ xp = array_namespace(a, b, step)
903
+ a, b, step = xp_promote(a, b, step, broadcast=True, force_floating=True, xp=xp)
905
904
 
906
905
  message = '`f` must be callable.'
907
906
  if not callable(f):
908
907
  raise ValueError(message)
909
908
 
910
909
  message = 'All elements of `a`, `b`, and `step` must be real numbers.'
911
- a, b, step = xp.broadcast_arrays(xp.asarray(a), xp.asarray(b), xp.asarray(step))
912
- dtype = xp.result_type(a.dtype, b.dtype, step.dtype)
913
- if not xp.isdtype(dtype, 'numeric') or xp.isdtype(dtype, 'complex floating'):
910
+ if not xp.isdtype(a.dtype, ('integral', 'real floating')):
914
911
  raise ValueError(message)
915
912
 
916
913
  valid_b = b >= a # NaNs will be False
@@ -1183,6 +1180,7 @@ def nsum(f, a, b, *, step=1, args=(), log=False, maxterms=int(2**20), tolerances
1183
1180
 
1184
1181
  # Branch for direct sum evaluation / integral approximation / invalid input
1185
1182
  i0 = ~valid_abstep # invalid
1183
+ i0b = b < a # zero
1186
1184
  i1 = (nterms + 1 <= maxterms) & ~i0 # direct sum evaluation
1187
1185
  i2 = xp.isfinite(a) & ~i1 & ~i0 # infinite sum to the right
1188
1186
  i3 = xp.isfinite(b) & ~i2 & ~i1 & ~i0 # infinite sum to the left
@@ -1192,6 +1190,9 @@ def nsum(f, a, b, *, step=1, args=(), log=False, maxterms=int(2**20), tolerances
1192
1190
  S[i0], E[i0] = xp.nan, xp.nan
1193
1191
  status[i0] = -1
1194
1192
 
1193
+ S[i0b], E[i0b] = zero, zero
1194
+ status[i0b] = 0
1195
+
1195
1196
  if xp.any(i1):
1196
1197
  args_direct = [arg[i1] for arg in args]
1197
1198
  tmp = _direct(f, a[i1], b[i1], step[i1], args_direct, constants, xp)
@@ -1294,7 +1295,7 @@ def _direct(f, a, b, step, args, constants, xp, inclusive=True):
1294
1295
  nfev = max_steps - i_nan.sum(axis=-1)
1295
1296
  S = special.logsumexp(fs, axis=-1) if log else xp.sum(fs, axis=-1)
1296
1297
  # Rough, non-conservative error estimate. See gh-19667 for improvement ideas.
1297
- E = xp_real(S) + math.log(eps) if log else eps * abs(S)
1298
+ E = xp.real(S) + math.log(eps) if log else eps * abs(S)
1298
1299
  return S, E, nfev
1299
1300
 
1300
1301
 
@@ -1310,7 +1311,7 @@ def _integral_bound(f, a, b, step, args, constants, xp):
1310
1311
  tol = special.logsumexp(xp.stack((tol, rtol + lb.integral)), axis=0)
1311
1312
  else:
1312
1313
  tol = tol + rtol*lb.integral
1313
- i_skip = lb.status < 0 # avoid unnecessary f_evals if integral is divergent
1314
+ i_skip = lb.status == -3 # avoid unnecessary f_evals if integral is divergent
1314
1315
  tol[i_skip] = xp.nan
1315
1316
  status = lb.status
1316
1317
 
@@ -1331,7 +1332,7 @@ def _integral_bound(f, a, b, step, args, constants, xp):
1331
1332
  fksp1 = f(ks + step2, *args2) # check that the function is decreasing
1332
1333
  fk_insufficient = (fks > tol[:, xp.newaxis]) | (fksp1 > fks)
1333
1334
  n_fk_insufficient = xp.sum(fk_insufficient, axis=-1)
1334
- nt = xp.minimum(n_fk_insufficient, xp.asarray(n_steps.shape[-1]-1))
1335
+ nt = xp.minimum(n_fk_insufficient, n_steps.shape[-1]-1)
1335
1336
  n_steps = n_steps[nt]
1336
1337
 
1337
1338
  # If `maxterms` is insufficient (i.e. either the magnitude of the last term of the
@@ -1374,7 +1375,7 @@ def _integral_bound(f, a, b, step, args, constants, xp):
1374
1375
  S_terms = (left, right.integral - log_step, fk - log2, fb - log2)
1375
1376
  S = special.logsumexp(xp.stack(S_terms), axis=0)
1376
1377
  E_terms = (left_error, right.error - log_step, fk-log2, fb-log2+xp.pi*1j)
1377
- E = xp_real(special.logsumexp(xp.stack(E_terms), axis=0))
1378
+ E = xp.real(special.logsumexp(xp.stack(E_terms), axis=0))
1378
1379
  else:
1379
1380
  S = left + right.integral/step + fk/2 + fb/2
1380
1381
  E = left_error + right.error/step + fk/2 - fb/2
Binary file
Binary file
@@ -209,9 +209,3 @@ def test_points(a, b):
209
209
  for p in interval_sets:
210
210
  j = np.searchsorted(sorted(points), tuple(p))
211
211
  assert np.all(j == j[0])
212
-
213
-
214
- @pytest.mark.thread_unsafe
215
- def test_trapz_deprecation():
216
- with pytest.deprecated_call(match="`quadrature='trapz'`"):
217
- quad_vec(lambda x: x, 0, 1, quadrature="trapz")
@@ -130,6 +130,9 @@ def test_banded_ode_solvers():
130
130
  # Test the "lsoda", "vode" and "zvode" solvers of the `ode` class
131
131
  # with a system that has a banded Jacobian matrix.
132
132
 
133
+ # This test does not test the Jacobian evaluation (banded or not)
134
+ # of "lsoda" due to the nonstiff nature of the equations.
135
+
133
136
  t_exact = np.linspace(0, 1.0, 5)
134
137
 
135
138
  # --- Real arrays for testing the "lsoda" and "vode" solvers ---
@@ -218,3 +221,85 @@ def test_banded_ode_solvers():
218
221
  [False, True]] # banded
219
222
  for meth, use_jac, with_jac, banded in itertools.product(*p):
220
223
  check_complex(idx, "zvode", meth, use_jac, with_jac, banded)
224
+
225
+ # lsoda requires a stiffer problem to switch to stiff solver
226
+ # Use the Robertson equation with surrounding trivial equations to make banded
227
+
228
+ def stiff_f(t, y):
229
+ return np.array([
230
+ y[0],
231
+ -0.04 * y[1] + 1e4 * y[2] * y[3],
232
+ 0.04 * y[1] - 1e4 * y[2] * y[3] - 3e7 * y[2]**2,
233
+ 3e7 * y[2]**2,
234
+ y[4]
235
+ ])
236
+
237
+ def stiff_jac(t, y):
238
+ return np.array([
239
+ [1, 0, 0, 0, 0],
240
+ [0, -0.04, 1e4*y[3], 1e4*y[2], 0],
241
+ [0, 0.04, -1e4 * y[3] - 3e7 * 2 * y[2], -1e4*y[2], 0],
242
+ [0, 0, 3e7*2*y[2], 0, 0],
243
+ [0, 0, 0, 0, 1]
244
+ ])
245
+
246
+ def banded_stiff_jac(t, y):
247
+ return np.array([
248
+ [0, 0, 0, 1e4*y[2], 0],
249
+ [0, 0, 1e4*y[3], -1e4*y[2], 0],
250
+ [1, -0.04, -1e4*y[3]-3e7*2*y[2], 0, 1],
251
+ [0, 0.04, 3e7*2*y[2], 0, 0]
252
+ ])
253
+
254
+ @pytest.mark.thread_unsafe
255
+ def test_banded_lsoda():
256
+ # expected solution is given by problem with full jacobian
257
+ tfull, yfull = _solve_robertson_lsoda(use_jac=True, banded=False)
258
+
259
+ for use_jac in [True, False]:
260
+ t, y = _solve_robertson_lsoda(use_jac, True)
261
+ assert_allclose(t, tfull)
262
+ assert_allclose(y, yfull)
263
+
264
+ def _solve_robertson_lsoda(use_jac, banded):
265
+
266
+ if use_jac:
267
+ if banded:
268
+ jac = banded_stiff_jac
269
+ else:
270
+ jac = stiff_jac
271
+ else:
272
+ jac = None
273
+
274
+ if banded:
275
+ lband = 1
276
+ uband = 2
277
+ else:
278
+ lband = None
279
+ uband = None
280
+
281
+ r = ode(stiff_f, jac)
282
+ r.set_integrator('lsoda',
283
+ lband=lband, uband=uband,
284
+ rtol=1e-9, atol=1e-10,
285
+ )
286
+ t0 = 0
287
+ dt = 1
288
+ tend = 10
289
+ y0 = np.array([1.0, 1.0, 0.0, 0.0, 1.0])
290
+ r.set_initial_value(y0, t0)
291
+
292
+ t = [t0]
293
+ y = [y0]
294
+ while r.successful() and r.t < tend:
295
+ r.integrate(r.t + dt)
296
+ t.append(r.t)
297
+ y.append(r.y)
298
+
299
+ # Ensure that the Jacobian was evaluated
300
+ # iwork[12] has the number of Jacobian evaluations.
301
+ assert r._integrator.iwork[12] > 0
302
+
303
+ t = np.array(t)
304
+ y = np.array(y)
305
+ return t, y
@@ -11,10 +11,8 @@ from scipy._lib._array_api import (
11
11
  np_compat,
12
12
  is_array_api_strict,
13
13
  )
14
- from scipy.conftest import array_api_compatible
15
-
16
14
  from scipy.integrate import cubature
17
-
15
+ from scipy.integrate._cubature import _InfiniteLimitsTransform
18
16
  from scipy.integrate._rules import (
19
17
  Rule, FixedRule,
20
18
  NestedFixedRule,
@@ -22,10 +20,8 @@ from scipy.integrate._rules import (
22
20
  GenzMalikCubature,
23
21
  )
24
22
 
25
- from scipy.integrate._cubature import _InfiniteLimitsTransform
26
-
27
- pytestmark = [pytest.mark.usefixtures("skip_xp_backends"),]
28
23
  skip_xp_backends = pytest.mark.skip_xp_backends
24
+ boolean_index_skip_reason = 'JAX/Dask arrays do not support boolean assignment.'
29
25
 
30
26
  # The integrands ``genz_malik_1980_*`` come from the paper:
31
27
  # A.C. Genz, A.A. Malik, Remarks on algorithm 006: An adaptive algorithm for
@@ -120,13 +116,10 @@ def genz_malik_1980_f_2_exact(a, b, alphas, betas, xp):
120
116
  a = xp.reshape(a, (*([1]*(len(alphas.shape) - 1)), ndim))
121
117
  b = xp.reshape(b, (*([1]*(len(alphas.shape) - 1)), ndim))
122
118
 
123
- # `xp` is the unwrapped namespace, so `.atan` won't work for `xp = np` and np<2.
124
- xp_test = array_namespace(a)
125
-
126
119
  return (
127
120
  (-1)**ndim * 1/xp.prod(alphas, axis=-1)
128
121
  * xp.prod(
129
- xp_test.atan((a - betas)/alphas) - xp_test.atan((b - betas)/alphas),
122
+ xp.atan((a - betas)/alphas) - xp.atan((b - betas)/alphas),
130
123
  axis=-1,
131
124
  )
132
125
  )
@@ -229,7 +222,9 @@ def _eval_indefinite_integral(F, a, b, xp):
229
222
 
230
223
  out = 0
231
224
  for ind in itertools.product(range(2), repeat=ndim):
232
- selected_points = xp.asarray([points[i, j] for i, j in zip(ind, range(ndim))])
225
+ selected_points = xp.asarray(
226
+ [float(points[i, j]) for i, j in zip(ind, range(ndim))]
227
+ )
233
228
  out += pow(-1, sum(ind) + ndim) * F(selected_points)
234
229
 
235
230
  return out
@@ -377,7 +372,6 @@ def f_with_problematic_points(x_arr, points, xp):
377
372
  return xp.ones(x_arr.shape[0])
378
373
 
379
374
 
380
- @array_api_compatible
381
375
  class TestCubature:
382
376
  """
383
377
  Tests related to the interface of `cubature`.
@@ -534,12 +528,13 @@ class TestCubature:
534
528
  "gk21",
535
529
  "genz-malik",
536
530
  ])
537
- @array_api_compatible
538
531
  class TestCubatureProblems:
539
532
  """
540
533
  Tests that `cubature` gives the correct answer.
541
534
  """
542
535
 
536
+ @skip_xp_backends("dask.array",
537
+ reason="Dask hangs/takes a long time for some test cases")
543
538
  @pytest.mark.parametrize("problem", [
544
539
  # -- f1 --
545
540
  (
@@ -786,6 +781,8 @@ class TestCubatureProblems:
786
781
  err_msg=f"estimate_error={res.error}, subdivisions={res.subdivisions}",
787
782
  )
788
783
 
784
+ @skip_xp_backends("dask.array",
785
+ reason="Dask hangs/takes a long time for some test cases")
789
786
  @pytest.mark.parametrize("problem", [
790
787
  (
791
788
  # Function to integrate, like `f(x, *args)`
@@ -973,10 +970,8 @@ class TestCubatureProblems:
973
970
  f"true_error={xp.abs(res.estimate - exact)}")
974
971
  assert res.status == "converged", err_msg
975
972
 
976
- @skip_xp_backends(
977
- "jax.numpy",
978
- reasons=["transforms make use of indexing assignment"],
979
- )
973
+ @pytest.mark.skip_xp_backends('jax.numpy', reason=boolean_index_skip_reason)
974
+ @pytest.mark.skip_xp_backends('dask.array', reason=boolean_index_skip_reason)
980
975
  @pytest.mark.parametrize("problem", [
981
976
  (
982
977
  # Function to integrate
@@ -1123,10 +1118,8 @@ class TestCubatureProblems:
1123
1118
  check_0d=False,
1124
1119
  )
1125
1120
 
1126
- @skip_xp_backends(
1127
- "jax.numpy",
1128
- reasons=["transforms make use of indexing assignment"],
1129
- )
1121
+ @pytest.mark.skip_xp_backends('jax.numpy', reason=boolean_index_skip_reason)
1122
+ @pytest.mark.skip_xp_backends('dask.array', reason=boolean_index_skip_reason)
1130
1123
  @pytest.mark.parametrize("problem", [
1131
1124
  (
1132
1125
  # Function to integrate
@@ -1197,7 +1190,6 @@ class TestCubatureProblems:
1197
1190
  )
1198
1191
 
1199
1192
 
1200
- @array_api_compatible
1201
1193
  class TestRules:
1202
1194
  """
1203
1195
  Tests related to the general Rule interface (currently private).
@@ -1238,7 +1230,6 @@ class TestRules:
1238
1230
  base_class.estimate(basic_1d_integrand, a, b, args=(xp,))
1239
1231
 
1240
1232
 
1241
- @array_api_compatible
1242
1233
  class TestRulesQuadrature:
1243
1234
  """
1244
1235
  Tests underlying quadrature rules (ndim == 1).
@@ -1311,7 +1302,6 @@ class TestRulesQuadrature:
1311
1302
  quadrature(1, xp=xp)
1312
1303
 
1313
1304
 
1314
- @array_api_compatible
1315
1305
  class TestRulesCubature:
1316
1306
  """
1317
1307
  Tests underlying cubature rules (ndim >= 2).
@@ -1333,11 +1323,8 @@ class TestRulesCubature:
1333
1323
  GenzMalikCubature(1, xp=xp)
1334
1324
 
1335
1325
 
1336
- @array_api_compatible
1337
- @skip_xp_backends(
1338
- "jax.numpy",
1339
- reasons=["transforms make use of indexing assignment"],
1340
- )
1326
+ @pytest.mark.skip_xp_backends('jax.numpy', reason=boolean_index_skip_reason)
1327
+ @pytest.mark.skip_xp_backends('dask.array', reason=boolean_index_skip_reason)
1341
1328
  class TestTransformations:
1342
1329
  @pytest.mark.parametrize(("a", "b", "points"), [
1343
1330
  (
@@ -1355,19 +1342,18 @@ class TestTransformations:
1355
1342
  transformation.
1356
1343
  """
1357
1344
 
1358
- xp_compat = array_namespace(xp.empty(0))
1359
1345
  points = [xp.asarray(p, dtype=xp.float64) for p in points]
1360
1346
 
1361
1347
  f_transformed = _InfiniteLimitsTransform(
1362
1348
  # Bind `points` and `xp` argument in f
1363
- lambda x: f_with_problematic_points(x, points, xp_compat),
1364
- xp.asarray(a, dtype=xp_compat.float64),
1365
- xp.asarray(b, dtype=xp_compat.float64),
1366
- xp=xp_compat,
1349
+ lambda x: f_with_problematic_points(x, points, xp),
1350
+ xp.asarray(a, dtype=xp.float64),
1351
+ xp.asarray(b, dtype=xp.float64),
1352
+ xp=xp,
1367
1353
  )
1368
1354
 
1369
1355
  for point in points:
1370
- transformed_point = f_transformed.inv(xp_compat.reshape(point, (1, -1)))
1356
+ transformed_point = f_transformed.inv(xp.reshape(point, (1, -1)))
1371
1357
 
1372
1358
  with pytest.raises(Exception, match="called with a problematic point"):
1373
1359
  f_transformed(transformed_point)
@@ -13,7 +13,7 @@ from scipy.integrate import (romb, newton_cotes,
13
13
  from scipy.integrate._quadrature import _cumulative_simpson_unequal_intervals
14
14
 
15
15
  from scipy import stats, special, integrate
16
- from scipy.conftest import array_api_compatible, skip_xp_invalid_arg
16
+ from scipy.conftest import skip_xp_invalid_arg
17
17
  from scipy._lib._array_api_no_0d import xp_assert_close
18
18
 
19
19
  skip_xp_backends = pytest.mark.skip_xp_backends
@@ -269,7 +269,6 @@ class TestCumulative_trapezoid:
269
269
  cumulative_trapezoid(y=[])
270
270
 
271
271
 
272
- @array_api_compatible
273
272
  class TestTrapezoid:
274
273
  def test_simple(self, xp):
275
274
  x = xp.arange(-10, 10, .1)
@@ -278,8 +277,7 @@ class TestTrapezoid:
278
277
  xp_assert_close(r, xp.asarray(1.0))
279
278
 
280
279
  @skip_xp_backends('jax.numpy',
281
- reasons=["JAX arrays do not support item assignment"])
282
- @pytest.mark.usefixtures("skip_xp_backends")
280
+ reason="JAX arrays do not support item assignment")
283
281
  def test_ndim(self, xp):
284
282
  x = xp.linspace(0, 1, 3)
285
283
  y = xp.linspace(0, 2, 8)
@@ -318,8 +316,7 @@ class TestTrapezoid:
318
316
  xp_assert_close(r, qz)
319
317
 
320
318
  @skip_xp_backends('jax.numpy',
321
- reasons=["JAX arrays do not support item assignment"])
322
- @pytest.mark.usefixtures("skip_xp_backends")
319
+ reason="JAX arrays do not support item assignment")
323
320
  def test_gh21908(self, xp):
324
321
  # extended testing for n-dim arrays
325
322
  x = xp.reshape(xp.linspace(0, 29, 30), (3, 10))
@@ -362,8 +359,7 @@ class TestTrapezoid:
362
359
  assert_allclose(trapezoid(y, xm), r)
363
360
 
364
361
  @skip_xp_backends(np_only=True,
365
- reasons=['array-likes only supported for NumPy backend'])
366
- @pytest.mark.usefixtures("skip_xp_backends")
362
+ reason='array-likes only supported for NumPy backend')
367
363
  def test_array_like(self, xp):
368
364
  x = list(range(5))
369
365
  y = [t * t for t in x]
@@ -635,6 +631,7 @@ class TestCumulativeSimpson:
635
631
  # `simpson` uses the trapezoidal rule
636
632
  return theoretical_difference
637
633
 
634
+ @pytest.mark.fail_slow(10)
638
635
  @pytest.mark.thread_unsafe
639
636
  @pytest.mark.slow
640
637
  @given(
@@ -666,6 +663,7 @@ class TestCumulativeSimpson:
666
663
  res[..., 1:], ref[..., 1:] + theoretical_difference[..., 1:], atol=1e-16
667
664
  )
668
665
 
666
+ @pytest.mark.fail_slow(10)
669
667
  @pytest.mark.thread_unsafe
670
668
  @pytest.mark.slow
671
669
  @given(