scipy 1.15.3__cp312-cp312-win_amd64.whl → 1.16.0__cp312-cp312-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 (760) hide show
  1. scipy/__config__.py +8 -8
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cp312-win_amd64.dll.a +0 -0
  4. scipy/_cyutility.cp312-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.cp312-win_amd64.dll.a +0 -0
  9. scipy/_lib/_ccallback_c.cp312-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.cp312-win_amd64.dll.a +0 -0
  13. scipy/_lib/_fpumode.cp312-win_amd64.pyd +0 -0
  14. scipy/_lib/_sparse.py +41 -0
  15. scipy/_lib/_test_ccallback.cp312-win_amd64.dll.a +0 -0
  16. scipy/_lib/_test_ccallback.cp312-win_amd64.pyd +0 -0
  17. scipy/_lib/_test_deprecation_call.cp312-win_amd64.dll.a +0 -0
  18. scipy/_lib/_test_deprecation_call.cp312-win_amd64.pyd +0 -0
  19. scipy/_lib/_test_deprecation_def.cp312-win_amd64.dll.a +0 -0
  20. scipy/_lib/_test_deprecation_def.cp312-win_amd64.pyd +0 -0
  21. scipy/_lib/_testutils.py +6 -2
  22. scipy/_lib/_uarray/_uarray.cp312-win_amd64.dll.a +0 -0
  23. scipy/_lib/_uarray/_uarray.cp312-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.cp312-win_amd64.dll.a +0 -0
  72. scipy/_lib/messagestream.cp312-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.cp312-win_amd64.dll.a +0 -0
  105. scipy/cluster/_hierarchy.cp312-win_amd64.pyd +0 -0
  106. scipy/cluster/_optimal_leaf_ordering.cp312-win_amd64.dll.a +0 -0
  107. scipy/cluster/_optimal_leaf_ordering.cp312-win_amd64.pyd +0 -0
  108. scipy/cluster/_vq.cp312-win_amd64.dll.a +0 -0
  109. scipy/cluster/_vq.cp312-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 +282 -151
  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.cp312-win_amd64.dll.a +0 -0
  127. scipy/fft/_pocketfft/pypocketfft.cp312-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.cp312-win_amd64.dll.a +0 -0
  136. scipy/fftpack/convolve.cp312-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.cp312-win_amd64.dll.a +0 -0
  142. scipy/integrate/_dop.cp312-win_amd64.pyd +0 -0
  143. scipy/integrate/_lsoda.cp312-win_amd64.dll.a +0 -0
  144. scipy/integrate/_lsoda.cp312-win_amd64.pyd +0 -0
  145. scipy/integrate/_ode.py +9 -2
  146. scipy/integrate/_odepack.cp312-win_amd64.dll.a +0 -0
  147. scipy/integrate/_odepack.cp312-win_amd64.pyd +0 -0
  148. scipy/integrate/_quad_vec.py +21 -29
  149. scipy/integrate/_quadpack.cp312-win_amd64.dll.a +0 -0
  150. scipy/integrate/_quadpack.cp312-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.cp312-win_amd64.dll.a +0 -0
  156. scipy/integrate/_test_multivariate.cp312-win_amd64.pyd +0 -0
  157. scipy/integrate/_test_odeint_banded.cp312-win_amd64.dll.a +0 -0
  158. scipy/integrate/_test_odeint_banded.cp312-win_amd64.pyd +0 -0
  159. scipy/integrate/_vode.cp312-win_amd64.dll.a +0 -0
  160. scipy/integrate/_vode.cp312-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.cp312-win_amd64.dll.a +0 -0
  171. scipy/interpolate/_dfitpack.cp312-win_amd64.pyd +0 -0
  172. scipy/interpolate/_dierckx.cp312-win_amd64.dll.a +0 -0
  173. scipy/interpolate/_dierckx.cp312-win_amd64.pyd +0 -0
  174. scipy/interpolate/_fitpack.cp312-win_amd64.dll.a +0 -0
  175. scipy/interpolate/_fitpack.cp312-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.cp312-win_amd64.dll.a +0 -0
  180. scipy/interpolate/_interpnd.cp312-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.cp312-win_amd64.dll.a +0 -0
  186. scipy/interpolate/_ppoly.cp312-win_amd64.pyd +0 -0
  187. scipy/interpolate/_rbf.py +2 -2
  188. scipy/interpolate/_rbfinterp.py +1 -1
  189. scipy/interpolate/_rbfinterp_pythran.cp312-win_amd64.dll.a +0 -0
  190. scipy/interpolate/_rbfinterp_pythran.cp312-win_amd64.pyd +0 -0
  191. scipy/interpolate/_rgi.py +31 -26
  192. scipy/interpolate/_rgi_cython.cp312-win_amd64.dll.a +0 -0
  193. scipy/interpolate/_rgi_cython.cp312-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.cp312-win_amd64.dll.a +0 -0
  204. scipy/io/_fast_matrix_market/_fmm_core.cp312-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.cp312-win_amd64.dll.a +0 -0
  210. scipy/io/_test_fortran.cp312-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.cp312-win_amd64.dll.a +0 -0
  216. scipy/io/matlab/_mio5_utils.cp312-win_amd64.pyd +0 -0
  217. scipy/io/matlab/_mio_utils.cp312-win_amd64.dll.a +0 -0
  218. scipy/io/matlab/_mio_utils.cp312-win_amd64.pyd +0 -0
  219. scipy/io/matlab/_miobase.py +4 -1
  220. scipy/io/matlab/_streams.cp312-win_amd64.dll.a +0 -0
  221. scipy/io/matlab/_streams.cp312-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.cp312-win_amd64.dll.a +0 -0
  229. scipy/linalg/_cythonized_array_utils.cp312-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.cp312-win_amd64.dll.a +0 -0
  234. scipy/linalg/_decomp_interpolative.cp312-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.cp312-win_amd64.dll.a +0 -0
  238. scipy/linalg/_decomp_lu_cython.cp312-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.cp312-win_amd64.dll.a +0 -0
  245. scipy/linalg/_decomp_update.cp312-win_amd64.pyd +0 -0
  246. scipy/linalg/_expm_frechet.py +4 -0
  247. scipy/linalg/_fblas.cp312-win_amd64.dll.a +0 -0
  248. scipy/linalg/_fblas.cp312-win_amd64.pyd +0 -0
  249. scipy/linalg/_flapack.cp312-win_amd64.dll.a +0 -0
  250. scipy/linalg/_flapack.cp312-win_amd64.pyd +0 -0
  251. scipy/linalg/_linalg_pythran.cp312-win_amd64.dll.a +0 -0
  252. scipy/linalg/_linalg_pythran.cp312-win_amd64.pyd +0 -0
  253. scipy/linalg/_matfuncs.py +187 -4
  254. scipy/linalg/_matfuncs_expm.cp312-win_amd64.dll.a +0 -0
  255. scipy/linalg/_matfuncs_expm.cp312-win_amd64.pyd +0 -0
  256. scipy/linalg/_matfuncs_schur_sqrtm.cp312-win_amd64.dll.a +0 -0
  257. scipy/linalg/_matfuncs_schur_sqrtm.cp312-win_amd64.pyd +0 -0
  258. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  259. scipy/linalg/_matfuncs_sqrtm_triu.cp312-win_amd64.dll.a +0 -0
  260. scipy/linalg/_matfuncs_sqrtm_triu.cp312-win_amd64.pyd +0 -0
  261. scipy/linalg/_procrustes.py +2 -0
  262. scipy/linalg/_sketches.py +17 -6
  263. scipy/linalg/_solve_toeplitz.cp312-win_amd64.dll.a +0 -0
  264. scipy/linalg/_solve_toeplitz.cp312-win_amd64.pyd +0 -0
  265. scipy/linalg/_solvers.py +7 -2
  266. scipy/linalg/_special_matrices.py +26 -36
  267. scipy/linalg/blas.py +35 -24
  268. scipy/linalg/cython_blas.cp312-win_amd64.dll.a +0 -0
  269. scipy/linalg/cython_blas.cp312-win_amd64.pyd +0 -0
  270. scipy/linalg/cython_lapack.cp312-win_amd64.dll.a +0 -0
  271. scipy/linalg/cython_lapack.cp312-win_amd64.pyd +0 -0
  272. scipy/linalg/lapack.py +22 -2
  273. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  274. scipy/linalg/tests/test_basic.py +31 -16
  275. scipy/linalg/tests/test_batch.py +588 -0
  276. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  277. scipy/linalg/tests/test_decomp.py +40 -3
  278. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  279. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  280. scipy/linalg/tests/test_lapack.py +115 -7
  281. scipy/linalg/tests/test_matfuncs.py +157 -102
  282. scipy/linalg/tests/test_procrustes.py +0 -7
  283. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  284. scipy/linalg/tests/test_special_matrices.py +1 -5
  285. scipy/ndimage/__init__.py +1 -0
  286. scipy/ndimage/_ctest.cp312-win_amd64.dll.a +0 -0
  287. scipy/ndimage/_ctest.cp312-win_amd64.pyd +0 -0
  288. scipy/ndimage/_cytest.cp312-win_amd64.dll.a +0 -0
  289. scipy/ndimage/_cytest.cp312-win_amd64.pyd +0 -0
  290. scipy/ndimage/_delegators.py +8 -2
  291. scipy/ndimage/_filters.py +453 -5
  292. scipy/ndimage/_interpolation.py +36 -6
  293. scipy/ndimage/_measurements.py +4 -2
  294. scipy/ndimage/_morphology.py +5 -0
  295. scipy/ndimage/_nd_image.cp312-win_amd64.dll.a +0 -0
  296. scipy/ndimage/_nd_image.cp312-win_amd64.pyd +0 -0
  297. scipy/ndimage/_ni_docstrings.py +5 -1
  298. scipy/ndimage/_ni_label.cp312-win_amd64.dll.a +0 -0
  299. scipy/ndimage/_ni_label.cp312-win_amd64.pyd +0 -0
  300. scipy/ndimage/_ni_support.py +1 -5
  301. scipy/ndimage/_rank_filter_1d.cp312-win_amd64.dll.a +0 -0
  302. scipy/ndimage/_rank_filter_1d.cp312-win_amd64.pyd +0 -0
  303. scipy/ndimage/_support_alternative_backends.py +18 -6
  304. scipy/ndimage/tests/test_filters.py +370 -259
  305. scipy/ndimage/tests/test_fourier.py +7 -9
  306. scipy/ndimage/tests/test_interpolation.py +68 -61
  307. scipy/ndimage/tests/test_measurements.py +18 -35
  308. scipy/ndimage/tests/test_morphology.py +143 -131
  309. scipy/ndimage/tests/test_splines.py +1 -3
  310. scipy/odr/__odrpack.cp312-win_amd64.dll.a +0 -0
  311. scipy/odr/__odrpack.cp312-win_amd64.pyd +0 -0
  312. scipy/optimize/_basinhopping.py +13 -7
  313. scipy/optimize/_bglu_dense.cp312-win_amd64.dll.a +0 -0
  314. scipy/optimize/_bglu_dense.cp312-win_amd64.pyd +0 -0
  315. scipy/optimize/_bracket.py +17 -24
  316. scipy/optimize/_chandrupatla.py +9 -10
  317. scipy/optimize/_cobyla_py.py +104 -123
  318. scipy/optimize/_constraints.py +14 -10
  319. scipy/optimize/_differentiable_functions.py +371 -230
  320. scipy/optimize/_differentialevolution.py +4 -3
  321. scipy/optimize/_direct.cp312-win_amd64.dll.a +0 -0
  322. scipy/optimize/_direct.cp312-win_amd64.pyd +0 -0
  323. scipy/optimize/_dual_annealing.py +1 -1
  324. scipy/optimize/_elementwise.py +1 -4
  325. scipy/optimize/_group_columns.cp312-win_amd64.dll.a +0 -0
  326. scipy/optimize/_group_columns.cp312-win_amd64.pyd +0 -0
  327. scipy/optimize/_highspy/_core.cp312-win_amd64.dll.a +0 -0
  328. scipy/optimize/_highspy/_core.cp312-win_amd64.pyd +0 -0
  329. scipy/optimize/_highspy/_highs_options.cp312-win_amd64.dll.a +0 -0
  330. scipy/optimize/_highspy/_highs_options.cp312-win_amd64.pyd +0 -0
  331. scipy/optimize/_lbfgsb.cp312-win_amd64.dll.a +0 -0
  332. scipy/optimize/_lbfgsb.cp312-win_amd64.pyd +0 -0
  333. scipy/optimize/_lbfgsb_py.py +80 -24
  334. scipy/optimize/_linprog_doc.py +2 -2
  335. scipy/optimize/_linprog_highs.py +2 -2
  336. scipy/optimize/_linprog_ip.py +25 -10
  337. scipy/optimize/_linprog_util.py +14 -16
  338. scipy/optimize/_lsap.cp312-win_amd64.dll.a +0 -0
  339. scipy/optimize/_lsap.cp312-win_amd64.pyd +0 -0
  340. scipy/optimize/_lsq/common.py +3 -3
  341. scipy/optimize/_lsq/dogbox.py +16 -2
  342. scipy/optimize/_lsq/givens_elimination.cp312-win_amd64.dll.a +0 -0
  343. scipy/optimize/_lsq/givens_elimination.cp312-win_amd64.pyd +0 -0
  344. scipy/optimize/_lsq/least_squares.py +198 -126
  345. scipy/optimize/_lsq/lsq_linear.py +6 -6
  346. scipy/optimize/_lsq/trf.py +35 -8
  347. scipy/optimize/_milp.py +3 -1
  348. scipy/optimize/_minimize.py +105 -36
  349. scipy/optimize/_minpack.cp312-win_amd64.dll.a +0 -0
  350. scipy/optimize/_minpack.cp312-win_amd64.pyd +0 -0
  351. scipy/optimize/_minpack_py.py +21 -14
  352. scipy/optimize/_moduleTNC.cp312-win_amd64.dll.a +0 -0
  353. scipy/optimize/_moduleTNC.cp312-win_amd64.pyd +0 -0
  354. scipy/optimize/_nnls.py +20 -21
  355. scipy/optimize/_nonlin.py +34 -3
  356. scipy/optimize/_numdiff.py +288 -110
  357. scipy/optimize/_optimize.py +86 -48
  358. scipy/optimize/_pava_pybind.cp312-win_amd64.dll.a +0 -0
  359. scipy/optimize/_pava_pybind.cp312-win_amd64.pyd +0 -0
  360. scipy/optimize/_remove_redundancy.py +5 -5
  361. scipy/optimize/_root_scalar.py +1 -1
  362. scipy/optimize/_shgo.py +6 -0
  363. scipy/optimize/_shgo_lib/_complex.py +1 -1
  364. scipy/optimize/_slsqp_py.py +216 -124
  365. scipy/optimize/_slsqplib.cp312-win_amd64.dll.a +0 -0
  366. scipy/optimize/_slsqplib.cp312-win_amd64.pyd +0 -0
  367. scipy/optimize/_spectral.py +1 -1
  368. scipy/optimize/_tnc.py +8 -1
  369. scipy/optimize/_trlib/_trlib.cp312-win_amd64.dll.a +0 -0
  370. scipy/optimize/_trlib/_trlib.cp312-win_amd64.pyd +0 -0
  371. scipy/optimize/_trustregion.py +20 -6
  372. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  373. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  374. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  375. scipy/optimize/_trustregion_constr/projections.py +12 -8
  376. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  377. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  378. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  379. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  380. scipy/optimize/_trustregion_exact.py +0 -1
  381. scipy/optimize/_zeros.cp312-win_amd64.dll.a +0 -0
  382. scipy/optimize/_zeros.cp312-win_amd64.pyd +0 -0
  383. scipy/optimize/_zeros_py.py +97 -17
  384. scipy/optimize/cython_optimize/_zeros.cp312-win_amd64.dll.a +0 -0
  385. scipy/optimize/cython_optimize/_zeros.cp312-win_amd64.pyd +0 -0
  386. scipy/optimize/slsqp.py +0 -1
  387. scipy/optimize/tests/test__basinhopping.py +1 -1
  388. scipy/optimize/tests/test__differential_evolution.py +4 -4
  389. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  390. scipy/optimize/tests/test__numdiff.py +66 -22
  391. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  392. scipy/optimize/tests/test__shgo.py +9 -1
  393. scipy/optimize/tests/test_bracket.py +36 -46
  394. scipy/optimize/tests/test_chandrupatla.py +133 -135
  395. scipy/optimize/tests/test_cobyla.py +74 -45
  396. scipy/optimize/tests/test_constraints.py +1 -1
  397. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  398. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  399. scipy/optimize/tests/test_least_squares.py +125 -13
  400. scipy/optimize/tests/test_linear_assignment.py +3 -3
  401. scipy/optimize/tests/test_linprog.py +3 -3
  402. scipy/optimize/tests/test_lsq_linear.py +6 -6
  403. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  404. scipy/optimize/tests/test_minpack.py +4 -4
  405. scipy/optimize/tests/test_nnls.py +43 -3
  406. scipy/optimize/tests/test_nonlin.py +36 -0
  407. scipy/optimize/tests/test_optimize.py +98 -20
  408. scipy/optimize/tests/test_slsqp.py +36 -4
  409. scipy/optimize/tests/test_zeros.py +34 -1
  410. scipy/signal/__init__.py +12 -23
  411. scipy/signal/_delegators.py +568 -0
  412. scipy/signal/_filter_design.py +459 -241
  413. scipy/signal/_fir_filter_design.py +262 -90
  414. scipy/signal/_lti_conversion.py +3 -2
  415. scipy/signal/_ltisys.py +118 -91
  416. scipy/signal/_max_len_seq_inner.cp312-win_amd64.dll.a +0 -0
  417. scipy/signal/_max_len_seq_inner.cp312-win_amd64.pyd +0 -0
  418. scipy/signal/_peak_finding_utils.cp312-win_amd64.dll.a +0 -0
  419. scipy/signal/_peak_finding_utils.cp312-win_amd64.pyd +0 -0
  420. scipy/signal/_polyutils.py +172 -0
  421. scipy/signal/_short_time_fft.py +519 -70
  422. scipy/signal/_signal_api.py +30 -0
  423. scipy/signal/_signaltools.py +719 -399
  424. scipy/signal/_sigtools.cp312-win_amd64.dll.a +0 -0
  425. scipy/signal/_sigtools.cp312-win_amd64.pyd +0 -0
  426. scipy/signal/_sosfilt.cp312-win_amd64.dll.a +0 -0
  427. scipy/signal/_sosfilt.cp312-win_amd64.pyd +0 -0
  428. scipy/signal/_spectral_py.py +230 -50
  429. scipy/signal/_spline.cp312-win_amd64.dll.a +0 -0
  430. scipy/signal/_spline.cp312-win_amd64.pyd +0 -0
  431. scipy/signal/_spline_filters.py +108 -68
  432. scipy/signal/_support_alternative_backends.py +73 -0
  433. scipy/signal/_upfirdn.py +4 -1
  434. scipy/signal/_upfirdn_apply.cp312-win_amd64.dll.a +0 -0
  435. scipy/signal/_upfirdn_apply.cp312-win_amd64.pyd +0 -0
  436. scipy/signal/_waveforms.py +2 -11
  437. scipy/signal/_wavelets.py +1 -1
  438. scipy/signal/fir_filter_design.py +1 -0
  439. scipy/signal/spline.py +4 -11
  440. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  441. scipy/signal/tests/test_bsplines.py +114 -79
  442. scipy/signal/tests/test_cont2discrete.py +9 -2
  443. scipy/signal/tests/test_filter_design.py +721 -481
  444. scipy/signal/tests/test_fir_filter_design.py +332 -140
  445. scipy/signal/tests/test_savitzky_golay.py +4 -3
  446. scipy/signal/tests/test_short_time_fft.py +221 -3
  447. scipy/signal/tests/test_signaltools.py +2145 -1349
  448. scipy/signal/tests/test_spectral.py +50 -6
  449. scipy/signal/tests/test_splines.py +161 -96
  450. scipy/signal/tests/test_upfirdn.py +84 -50
  451. scipy/signal/tests/test_waveforms.py +20 -0
  452. scipy/signal/tests/test_windows.py +607 -466
  453. scipy/signal/windows/_windows.py +287 -148
  454. scipy/sparse/__init__.py +23 -4
  455. scipy/sparse/_base.py +270 -108
  456. scipy/sparse/_bsr.py +7 -4
  457. scipy/sparse/_compressed.py +59 -231
  458. scipy/sparse/_construct.py +90 -38
  459. scipy/sparse/_coo.py +115 -181
  460. scipy/sparse/_csc.py +4 -4
  461. scipy/sparse/_csparsetools.cp312-win_amd64.dll.a +0 -0
  462. scipy/sparse/_csparsetools.cp312-win_amd64.pyd +0 -0
  463. scipy/sparse/_csr.py +2 -2
  464. scipy/sparse/_data.py +48 -48
  465. scipy/sparse/_dia.py +105 -18
  466. scipy/sparse/_dok.py +0 -23
  467. scipy/sparse/_index.py +4 -4
  468. scipy/sparse/_matrix.py +23 -0
  469. scipy/sparse/_sparsetools.cp312-win_amd64.dll.a +0 -0
  470. scipy/sparse/_sparsetools.cp312-win_amd64.pyd +0 -0
  471. scipy/sparse/_sputils.py +37 -22
  472. scipy/sparse/base.py +0 -9
  473. scipy/sparse/bsr.py +0 -14
  474. scipy/sparse/compressed.py +0 -23
  475. scipy/sparse/construct.py +0 -6
  476. scipy/sparse/coo.py +0 -14
  477. scipy/sparse/csc.py +0 -3
  478. scipy/sparse/csgraph/_flow.cp312-win_amd64.dll.a +0 -0
  479. scipy/sparse/csgraph/_flow.cp312-win_amd64.pyd +0 -0
  480. scipy/sparse/csgraph/_matching.cp312-win_amd64.dll.a +0 -0
  481. scipy/sparse/csgraph/_matching.cp312-win_amd64.pyd +0 -0
  482. scipy/sparse/csgraph/_min_spanning_tree.cp312-win_amd64.dll.a +0 -0
  483. scipy/sparse/csgraph/_min_spanning_tree.cp312-win_amd64.pyd +0 -0
  484. scipy/sparse/csgraph/_reordering.cp312-win_amd64.dll.a +0 -0
  485. scipy/sparse/csgraph/_reordering.cp312-win_amd64.pyd +0 -0
  486. scipy/sparse/csgraph/_shortest_path.cp312-win_amd64.dll.a +0 -0
  487. scipy/sparse/csgraph/_shortest_path.cp312-win_amd64.pyd +0 -0
  488. scipy/sparse/csgraph/_tools.cp312-win_amd64.dll.a +0 -0
  489. scipy/sparse/csgraph/_tools.cp312-win_amd64.pyd +0 -0
  490. scipy/sparse/csgraph/_traversal.cp312-win_amd64.dll.a +0 -0
  491. scipy/sparse/csgraph/_traversal.cp312-win_amd64.pyd +0 -0
  492. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  493. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  494. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  495. scipy/sparse/csr.py +0 -5
  496. scipy/sparse/data.py +1 -6
  497. scipy/sparse/dia.py +0 -7
  498. scipy/sparse/dok.py +0 -10
  499. scipy/sparse/linalg/_dsolve/_superlu.cp312-win_amd64.dll.a +0 -0
  500. scipy/sparse/linalg/_dsolve/_superlu.cp312-win_amd64.pyd +0 -0
  501. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  502. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  503. scipy/sparse/linalg/_eigen/arpack/_arpack.cp312-win_amd64.dll.a +0 -0
  504. scipy/sparse/linalg/_eigen/arpack/_arpack.cp312-win_amd64.pyd +0 -0
  505. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  506. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  507. scipy/sparse/linalg/_interface.py +17 -18
  508. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  509. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  510. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  511. scipy/sparse/linalg/_isolve/minres.py +5 -5
  512. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  513. scipy/sparse/linalg/_isolve/utils.py +2 -8
  514. scipy/sparse/linalg/_matfuncs.py +1 -1
  515. scipy/sparse/linalg/_norm.py +1 -1
  516. scipy/sparse/linalg/_propack/_cpropack.cp312-win_amd64.dll.a +0 -0
  517. scipy/sparse/linalg/_propack/_cpropack.cp312-win_amd64.pyd +0 -0
  518. scipy/sparse/linalg/_propack/_dpropack.cp312-win_amd64.dll.a +0 -0
  519. scipy/sparse/linalg/_propack/_dpropack.cp312-win_amd64.pyd +0 -0
  520. scipy/sparse/linalg/_propack/_spropack.cp312-win_amd64.dll.a +0 -0
  521. scipy/sparse/linalg/_propack/_spropack.cp312-win_amd64.pyd +0 -0
  522. scipy/sparse/linalg/_propack/_zpropack.cp312-win_amd64.dll.a +0 -0
  523. scipy/sparse/linalg/_propack/_zpropack.cp312-win_amd64.pyd +0 -0
  524. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  525. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  526. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  527. scipy/sparse/tests/test_base.py +214 -42
  528. scipy/sparse/tests/test_common1d.py +7 -7
  529. scipy/sparse/tests/test_construct.py +1 -1
  530. scipy/sparse/tests/test_coo.py +272 -4
  531. scipy/sparse/tests/test_sparsetools.py +5 -0
  532. scipy/sparse/tests/test_sputils.py +36 -7
  533. scipy/spatial/_ckdtree.cp312-win_amd64.dll.a +0 -0
  534. scipy/spatial/_ckdtree.cp312-win_amd64.pyd +0 -0
  535. scipy/spatial/_distance_pybind.cp312-win_amd64.dll.a +0 -0
  536. scipy/spatial/_distance_pybind.cp312-win_amd64.pyd +0 -0
  537. scipy/spatial/_distance_wrap.cp312-win_amd64.dll.a +0 -0
  538. scipy/spatial/_distance_wrap.cp312-win_amd64.pyd +0 -0
  539. scipy/spatial/_hausdorff.cp312-win_amd64.dll.a +0 -0
  540. scipy/spatial/_hausdorff.cp312-win_amd64.pyd +0 -0
  541. scipy/spatial/_qhull.cp312-win_amd64.dll.a +0 -0
  542. scipy/spatial/_qhull.cp312-win_amd64.pyd +0 -0
  543. scipy/spatial/_voronoi.cp312-win_amd64.dll.a +0 -0
  544. scipy/spatial/_voronoi.cp312-win_amd64.pyd +0 -0
  545. scipy/spatial/distance.py +49 -42
  546. scipy/spatial/tests/test_distance.py +15 -1
  547. scipy/spatial/tests/test_kdtree.py +1 -0
  548. scipy/spatial/tests/test_qhull.py +7 -2
  549. scipy/spatial/transform/__init__.py +5 -3
  550. scipy/spatial/transform/_rigid_transform.cp312-win_amd64.dll.a +0 -0
  551. scipy/spatial/transform/_rigid_transform.cp312-win_amd64.pyd +0 -0
  552. scipy/spatial/transform/_rotation.cp312-win_amd64.dll.a +0 -0
  553. scipy/spatial/transform/_rotation.cp312-win_amd64.pyd +0 -0
  554. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  555. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  556. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  557. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  558. scipy/special/__init__.py +1 -47
  559. scipy/special/_add_newdocs.py +34 -772
  560. scipy/special/_basic.py +22 -25
  561. scipy/special/_comb.cp312-win_amd64.dll.a +0 -0
  562. scipy/special/_comb.cp312-win_amd64.pyd +0 -0
  563. scipy/special/_ellip_harm_2.cp312-win_amd64.dll.a +0 -0
  564. scipy/special/_ellip_harm_2.cp312-win_amd64.pyd +0 -0
  565. scipy/special/_gufuncs.cp312-win_amd64.dll.a +0 -0
  566. scipy/special/_gufuncs.cp312-win_amd64.pyd +0 -0
  567. scipy/special/_logsumexp.py +67 -58
  568. scipy/special/_orthogonal.pyi +1 -1
  569. scipy/special/_specfun.cp312-win_amd64.dll.a +0 -0
  570. scipy/special/_specfun.cp312-win_amd64.pyd +0 -0
  571. scipy/special/_special_ufuncs.cp312-win_amd64.dll.a +0 -0
  572. scipy/special/_special_ufuncs.cp312-win_amd64.pyd +0 -0
  573. scipy/special/_spherical_bessel.py +4 -4
  574. scipy/special/_support_alternative_backends.py +212 -119
  575. scipy/special/_test_internal.cp312-win_amd64.dll.a +0 -0
  576. scipy/special/_test_internal.cp312-win_amd64.pyd +0 -0
  577. scipy/special/_testutils.py +4 -4
  578. scipy/special/_ufuncs.cp312-win_amd64.dll.a +0 -0
  579. scipy/special/_ufuncs.cp312-win_amd64.pyd +0 -0
  580. scipy/special/_ufuncs.pyi +1 -0
  581. scipy/special/_ufuncs.pyx +215 -1400
  582. scipy/special/_ufuncs_cxx.cp312-win_amd64.dll.a +0 -0
  583. scipy/special/_ufuncs_cxx.cp312-win_amd64.pyd +0 -0
  584. scipy/special/_ufuncs_cxx.pxd +2 -15
  585. scipy/special/_ufuncs_cxx.pyx +5 -44
  586. scipy/special/_ufuncs_cxx_defs.h +2 -16
  587. scipy/special/_ufuncs_defs.h +0 -8
  588. scipy/special/cython_special.cp312-win_amd64.dll.a +0 -0
  589. scipy/special/cython_special.cp312-win_amd64.pyd +0 -0
  590. scipy/special/cython_special.pxd +1 -1
  591. scipy/special/tests/_cython_examples/meson.build +10 -1
  592. scipy/special/tests/test_basic.py +153 -20
  593. scipy/special/tests/test_boost_ufuncs.py +3 -0
  594. scipy/special/tests/test_cdflib.py +35 -11
  595. scipy/special/tests/test_gammainc.py +16 -0
  596. scipy/special/tests/test_hyp2f1.py +2 -2
  597. scipy/special/tests/test_log1mexp.py +85 -0
  598. scipy/special/tests/test_logsumexp.py +206 -64
  599. scipy/special/tests/test_mpmath.py +1 -0
  600. scipy/special/tests/test_nan_inputs.py +1 -1
  601. scipy/special/tests/test_orthogonal.py +17 -18
  602. scipy/special/tests/test_sf_error.py +3 -2
  603. scipy/special/tests/test_sph_harm.py +6 -7
  604. scipy/special/tests/test_support_alternative_backends.py +211 -76
  605. scipy/stats/__init__.py +4 -1
  606. scipy/stats/_ansari_swilk_statistics.cp312-win_amd64.dll.a +0 -0
  607. scipy/stats/_ansari_swilk_statistics.cp312-win_amd64.pyd +0 -0
  608. scipy/stats/_axis_nan_policy.py +5 -12
  609. scipy/stats/_biasedurn.cp312-win_amd64.dll.a +0 -0
  610. scipy/stats/_biasedurn.cp312-win_amd64.pyd +0 -0
  611. scipy/stats/_continued_fraction.py +387 -0
  612. scipy/stats/_continuous_distns.py +277 -310
  613. scipy/stats/_correlation.py +1 -1
  614. scipy/stats/_covariance.py +6 -3
  615. scipy/stats/_discrete_distns.py +39 -32
  616. scipy/stats/_distn_infrastructure.py +39 -12
  617. scipy/stats/_distribution_infrastructure.py +920 -238
  618. scipy/stats/_entropy.py +9 -10
  619. scipy/{_lib → stats}/_finite_differences.py +1 -1
  620. scipy/stats/_hypotests.py +83 -50
  621. scipy/stats/_kde.py +53 -49
  622. scipy/stats/_ksstats.py +1 -1
  623. scipy/stats/_levy_stable/__init__.py +7 -15
  624. scipy/stats/_levy_stable/levyst.cp312-win_amd64.dll.a +0 -0
  625. scipy/stats/_levy_stable/levyst.cp312-win_amd64.pyd +0 -0
  626. scipy/stats/_morestats.py +118 -73
  627. scipy/stats/_mstats_basic.py +13 -17
  628. scipy/stats/_mstats_extras.py +8 -8
  629. scipy/stats/_multivariate.py +89 -113
  630. scipy/stats/_new_distributions.py +97 -20
  631. scipy/stats/_page_trend_test.py +12 -5
  632. scipy/stats/_probability_distribution.py +265 -43
  633. scipy/stats/_qmc.py +14 -9
  634. scipy/stats/_qmc_cy.cp312-win_amd64.dll.a +0 -0
  635. scipy/stats/_qmc_cy.cp312-win_amd64.pyd +0 -0
  636. scipy/stats/_qmvnt.py +16 -95
  637. scipy/stats/_qmvnt_cy.cp312-win_amd64.dll.a +0 -0
  638. scipy/stats/_qmvnt_cy.cp312-win_amd64.pyd +0 -0
  639. scipy/stats/_quantile.py +335 -0
  640. scipy/stats/_rcont/rcont.cp312-win_amd64.dll.a +0 -0
  641. scipy/stats/_rcont/rcont.cp312-win_amd64.pyd +0 -0
  642. scipy/stats/_resampling.py +5 -30
  643. scipy/stats/_sampling.py +1 -1
  644. scipy/stats/_sobol.cp312-win_amd64.dll.a +0 -0
  645. scipy/stats/_sobol.cp312-win_amd64.pyd +0 -0
  646. scipy/stats/_stats.cp312-win_amd64.dll.a +0 -0
  647. scipy/stats/_stats.cp312-win_amd64.pyd +0 -0
  648. scipy/stats/_stats_mstats_common.py +21 -2
  649. scipy/stats/_stats_py.py +551 -477
  650. scipy/stats/_stats_pythran.cp312-win_amd64.dll.a +0 -0
  651. scipy/stats/_stats_pythran.cp312-win_amd64.pyd +0 -0
  652. scipy/stats/_unuran/unuran_wrapper.cp312-win_amd64.dll.a +0 -0
  653. scipy/stats/_unuran/unuran_wrapper.cp312-win_amd64.pyd +0 -0
  654. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  655. scipy/stats/_variation.py +6 -8
  656. scipy/stats/_wilcoxon.py +13 -7
  657. scipy/stats/tests/common_tests.py +6 -4
  658. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  659. scipy/stats/tests/test_continued_fraction.py +173 -0
  660. scipy/stats/tests/test_continuous.py +379 -60
  661. scipy/stats/tests/test_continuous_basic.py +18 -12
  662. scipy/stats/tests/test_discrete_basic.py +14 -8
  663. scipy/stats/tests/test_discrete_distns.py +16 -16
  664. scipy/stats/tests/test_distributions.py +95 -75
  665. scipy/stats/tests/test_entropy.py +40 -48
  666. scipy/stats/tests/test_fit.py +4 -3
  667. scipy/stats/tests/test_hypotests.py +153 -24
  668. scipy/stats/tests/test_kdeoth.py +109 -41
  669. scipy/stats/tests/test_marray.py +289 -0
  670. scipy/stats/tests/test_morestats.py +81 -49
  671. scipy/stats/tests/test_mstats_basic.py +3 -3
  672. scipy/stats/tests/test_multivariate.py +434 -83
  673. scipy/stats/tests/test_qmc.py +13 -10
  674. scipy/stats/tests/test_quantile.py +199 -0
  675. scipy/stats/tests/test_rank.py +119 -112
  676. scipy/stats/tests/test_resampling.py +47 -56
  677. scipy/stats/tests/test_sampling.py +9 -4
  678. scipy/stats/tests/test_stats.py +799 -939
  679. scipy/stats/tests/test_variation.py +8 -6
  680. scipy/version.py +2 -2
  681. scipy-1.16.0.dist-info/DELVEWHEEL +2 -0
  682. {scipy-1.15.3.dist-info → scipy-1.16.0.dist-info}/LICENSE.txt +4 -4
  683. {scipy-1.15.3.dist-info → scipy-1.16.0.dist-info}/METADATA +11 -11
  684. {scipy-1.15.3.dist-info → scipy-1.16.0.dist-info}/RECORD +686 -694
  685. scipy/_lib/array_api_extra/_funcs.py +0 -484
  686. scipy/_lib/array_api_extra/_typing.py +0 -8
  687. scipy/interpolate/_bspl.cp312-win_amd64.dll.a +0 -0
  688. scipy/interpolate/_bspl.cp312-win_amd64.pyd +0 -0
  689. scipy/optimize/_cobyla.cp312-win_amd64.dll.a +0 -0
  690. scipy/optimize/_cobyla.cp312-win_amd64.pyd +0 -0
  691. scipy/optimize/_cython_nnls.cp312-win_amd64.dll.a +0 -0
  692. scipy/optimize/_cython_nnls.cp312-win_amd64.pyd +0 -0
  693. scipy/optimize/_slsqp.cp312-win_amd64.dll.a +0 -0
  694. scipy/optimize/_slsqp.cp312-win_amd64.pyd +0 -0
  695. scipy/spatial/qhull_src/COPYING.txt +0 -38
  696. scipy/special/libsf_error_state.dll +0 -0
  697. scipy/special/libsf_error_state.dll.a +0 -0
  698. scipy/special/tests/test_log_softmax.py +0 -109
  699. scipy/special/tests/test_xsf_cuda.py +0 -114
  700. scipy/special/xsf/binom.h +0 -89
  701. scipy/special/xsf/cdflib.h +0 -100
  702. scipy/special/xsf/cephes/airy.h +0 -307
  703. scipy/special/xsf/cephes/besselpoly.h +0 -51
  704. scipy/special/xsf/cephes/beta.h +0 -257
  705. scipy/special/xsf/cephes/cbrt.h +0 -131
  706. scipy/special/xsf/cephes/chbevl.h +0 -85
  707. scipy/special/xsf/cephes/chdtr.h +0 -193
  708. scipy/special/xsf/cephes/const.h +0 -87
  709. scipy/special/xsf/cephes/ellie.h +0 -293
  710. scipy/special/xsf/cephes/ellik.h +0 -251
  711. scipy/special/xsf/cephes/ellpe.h +0 -107
  712. scipy/special/xsf/cephes/ellpk.h +0 -117
  713. scipy/special/xsf/cephes/expn.h +0 -260
  714. scipy/special/xsf/cephes/gamma.h +0 -398
  715. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  716. scipy/special/xsf/cephes/hyperg.h +0 -361
  717. scipy/special/xsf/cephes/i0.h +0 -149
  718. scipy/special/xsf/cephes/i1.h +0 -158
  719. scipy/special/xsf/cephes/igam.h +0 -421
  720. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  721. scipy/special/xsf/cephes/igami.h +0 -313
  722. scipy/special/xsf/cephes/j0.h +0 -225
  723. scipy/special/xsf/cephes/j1.h +0 -198
  724. scipy/special/xsf/cephes/jv.h +0 -715
  725. scipy/special/xsf/cephes/k0.h +0 -164
  726. scipy/special/xsf/cephes/k1.h +0 -163
  727. scipy/special/xsf/cephes/kn.h +0 -243
  728. scipy/special/xsf/cephes/lanczos.h +0 -112
  729. scipy/special/xsf/cephes/ndtr.h +0 -275
  730. scipy/special/xsf/cephes/poch.h +0 -85
  731. scipy/special/xsf/cephes/polevl.h +0 -167
  732. scipy/special/xsf/cephes/psi.h +0 -194
  733. scipy/special/xsf/cephes/rgamma.h +0 -111
  734. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  735. scipy/special/xsf/cephes/shichi.h +0 -248
  736. scipy/special/xsf/cephes/sici.h +0 -224
  737. scipy/special/xsf/cephes/sindg.h +0 -221
  738. scipy/special/xsf/cephes/tandg.h +0 -139
  739. scipy/special/xsf/cephes/trig.h +0 -58
  740. scipy/special/xsf/cephes/unity.h +0 -186
  741. scipy/special/xsf/cephes/zeta.h +0 -172
  742. scipy/special/xsf/config.h +0 -304
  743. scipy/special/xsf/digamma.h +0 -205
  744. scipy/special/xsf/error.h +0 -57
  745. scipy/special/xsf/evalpoly.h +0 -47
  746. scipy/special/xsf/expint.h +0 -266
  747. scipy/special/xsf/hyp2f1.h +0 -694
  748. scipy/special/xsf/iv_ratio.h +0 -173
  749. scipy/special/xsf/lambertw.h +0 -150
  750. scipy/special/xsf/loggamma.h +0 -163
  751. scipy/special/xsf/sici.h +0 -200
  752. scipy/special/xsf/tools.h +0 -427
  753. scipy/special/xsf/trig.h +0 -164
  754. scipy/special/xsf/wright_bessel.h +0 -843
  755. scipy/special/xsf/zlog1.h +0 -35
  756. scipy/stats/_mvn.cp312-win_amd64.dll.a +0 -0
  757. scipy/stats/_mvn.cp312-win_amd64.pyd +0 -0
  758. scipy-1.15.3.dist-info/DELVEWHEEL +0 -2
  759. /scipy-1.15.3-cp312-cp312-win_amd64.whl → /scipy-1.16.0-cp312-cp312-win_amd64.whl +0 -0
  760. {scipy-1.15.3.dist-info → scipy-1.16.0.dist-info}/WHEEL +0 -0
@@ -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(
@@ -6,7 +6,6 @@ import math
6
6
  import numpy as np
7
7
  from numpy.testing import assert_allclose
8
8
 
9
- from scipy.conftest import array_api_compatible
10
9
  import scipy._lib._elementwise_iterative_method as eim
11
10
  from scipy._lib._array_api_no_0d import xp_assert_close, xp_assert_equal
12
11
  from scipy._lib._array_api import array_namespace, xp_size, xp_ravel, xp_copy, is_numpy
@@ -20,6 +19,7 @@ def norm_pdf(x, xp=None):
20
19
  xp = array_namespace(x) if xp is None else xp
21
20
  return 1/(2*xp.pi)**0.5 * xp.exp(-x**2/2)
22
21
 
22
+
23
23
  def norm_logpdf(x, xp=None):
24
24
  xp = array_namespace(x) if xp is None else xp
25
25
  return -0.5*math.log(2*xp.pi) - x**2/2
@@ -43,11 +43,12 @@ def _vectorize(xp):
43
43
  return decorator
44
44
 
45
45
 
46
- @array_api_compatible
47
- @pytest.mark.usefixtures("skip_xp_backends")
48
46
  @pytest.mark.skip_xp_backends(
49
47
  'array_api_strict', reason='Currently uses fancy indexing assignment.'
50
48
  )
49
+ @pytest.mark.skip_xp_backends(
50
+ 'dask.array', reason='boolean indexing assignment'
51
+ )
51
52
  @pytest.mark.skip_xp_backends(
52
53
  'jax.numpy', reason='JAX arrays do not support item assignment.'
53
54
  )
@@ -233,11 +234,11 @@ class TestTanhSinh:
233
234
  logres = _tanhsinh(norm_logpdf, *limits, log=True)
234
235
  xp_assert_close(xp.exp(logres.integral), ref, check_dtype=False)
235
236
  # Transformation should not make the result complex unnecessarily
236
- xp_test = array_namespace(*limits) # we need xp.isdtype
237
- assert (xp_test.isdtype(logres.integral.dtype, "real floating") if ref > 0
238
- else xp_test.isdtype(logres.integral.dtype, "complex floating"))
237
+ assert (xp.isdtype(logres.integral.dtype, "real floating") if ref > 0
238
+ else xp.isdtype(logres.integral.dtype, "complex floating"))
239
239
 
240
- xp_assert_close(xp.exp(logres.error), res.error, atol=1e-16, check_dtype=False)
240
+ atol = 2 * xp.finfo(res.error.dtype).eps
241
+ xp_assert_close(xp.exp(logres.error), res.error, atol=atol, check_dtype=False)
241
242
 
242
243
  # 15 skipped intentionally; it's very difficult numerically
243
244
  @pytest.mark.skip_xp_backends(np_only=True,
@@ -248,7 +249,7 @@ class TestTanhSinh:
248
249
  rtol = 2e-8
249
250
  res = _tanhsinh(f, 0, f.b, rtol=rtol)
250
251
  assert_allclose(res.integral, f.ref, rtol=rtol)
251
- if f_number not in {14}: # mildly underestimates error here
252
+ if f_number not in {7, 12, 14}: # mildly underestimates error here
252
253
  true_error = abs(self.error(res.integral, f.ref)/res.integral)
253
254
  assert true_error < res.error
254
255
 
@@ -299,18 +300,17 @@ class TestTanhSinh:
299
300
  res = _tanhsinh(f, a, b, args=(p,))
300
301
  refs = _tanhsinh_single(a, b, p)
301
302
 
302
- xp_test = array_namespace(a) # need xp.stack, isdtype
303
303
  attrs = ['integral', 'error', 'success', 'status', 'nfev', 'maxlevel']
304
304
  for attr in attrs:
305
- ref_attr = xp_test.stack([getattr(ref, attr) for ref in refs])
305
+ ref_attr = xp.stack([getattr(ref, attr) for ref in refs])
306
306
  res_attr = xp_ravel(getattr(res, attr))
307
307
  xp_assert_close(res_attr, ref_attr, rtol=1e-15)
308
308
  assert getattr(res, attr).shape == shape
309
309
 
310
- assert xp_test.isdtype(res.success.dtype, 'bool')
311
- assert xp_test.isdtype(res.status.dtype, 'integral')
312
- assert xp_test.isdtype(res.nfev.dtype, 'integral')
313
- assert xp_test.isdtype(res.maxlevel.dtype, 'integral')
310
+ assert xp.isdtype(res.success.dtype, 'bool')
311
+ assert xp.isdtype(res.status.dtype, 'integral')
312
+ assert xp.isdtype(res.nfev.dtype, 'integral')
313
+ assert xp.isdtype(res.maxlevel.dtype, 'integral')
314
314
  assert xp.max(res.nfev) == f.feval
315
315
  # maxlevel = 2 -> 3 function calls (2 initialization, 1 work)
316
316
  assert xp.max(res.maxlevel) >= 2
@@ -383,12 +383,10 @@ class TestTanhSinh:
383
383
  def test_options_and_result_attributes(self, xp):
384
384
  # demonstrate that options are behaving as advertised and status
385
385
  # messages are as intended
386
- xp_test = array_namespace(xp.asarray(1.)) # need xp.atan
387
-
388
386
  def f(x):
389
387
  f.calls += 1
390
388
  f.feval += xp_size(xp.asarray(x))
391
- return x**2 * xp_test.atan(x)
389
+ return x**2 * xp.atan(x)
392
390
 
393
391
  f.ref = xp.asarray((math.pi - 2 + 2 * math.log(2)) / 12, dtype=xp.float64)
394
392
 
@@ -560,21 +558,18 @@ class TestTanhSinh:
560
558
  # integrand is evaluated or the integral/error estimates, only the
561
559
  # number of function calls
562
560
 
563
- # need `xp.concat`, `xp.atan`, and `xp.sort`
564
- xp_test = array_namespace(xp.asarray(1.))
565
-
566
561
  def f(x):
567
562
  f.calls += 1
568
563
  f.feval += xp_size(xp.asarray(x))
569
- f.x = xp_test.concat((f.x, xp_ravel(x)))
570
- return x**2 * xp_test.atan(x)
564
+ f.x = xp.concat((f.x, xp_ravel(x)))
565
+ return x**2 * xp.atan(x)
571
566
 
572
567
  f.feval, f.calls, f.x = 0, 0, xp.asarray([])
573
568
 
574
569
  a = xp.asarray(0, dtype=xp.float64)
575
570
  b = xp.asarray(1, dtype=xp.float64)
576
571
  ref = _tanhsinh(f, a, b, minlevel=0, maxlevel=maxlevel)
577
- ref_x = xp_test.sort(f.x)
572
+ ref_x = xp.sort(f.x)
578
573
 
579
574
  for minlevel in range(0, maxlevel + 1):
580
575
  f.feval, f.calls, f.x = 0, 0, xp.asarray([])
@@ -587,7 +582,7 @@ class TestTanhSinh:
587
582
  assert res.nfev == f.feval == f.x.shape[0]
588
583
  assert f.calls == maxlevel - minlevel + 1 + 1 # 1 validation call
589
584
  assert res.status == ref.status
590
- xp_assert_equal(ref_x, xp_test.sort(f.x))
585
+ xp_assert_equal(ref_x, xp.sort(f.x))
591
586
 
592
587
  def test_improper_integrals(self, xp):
593
588
  # Test handling of infinite limits of integration (mixed with finite limits)
@@ -679,10 +674,9 @@ class TestTanhSinh:
679
674
  def test_special_cases(self, xp):
680
675
  # Test edge cases and other special cases
681
676
  a, b = xp.asarray(0), xp.asarray(1)
682
- xp_test = array_namespace(a, b) # need `xp.isdtype`
683
677
 
684
678
  def f(x):
685
- assert xp_test.isdtype(x.dtype, "real floating")
679
+ assert xp.isdtype(x.dtype, "real floating")
686
680
  return x
687
681
 
688
682
  res = _tanhsinh(f, a, b)
@@ -756,18 +750,27 @@ class TestTanhSinh:
756
750
  def test_gh_22681_finite_error(self, xp):
757
751
  # gh-22681 noted a case in which the error was NaN on some platforms;
758
752
  # check that this does in fact fail in CI.
759
- a = complex(12, -10)
760
- b = complex(12, 39)
753
+ c1 = complex(12, -10)
754
+ c2 = complex(12, 39)
761
755
  def f(t):
762
- return xp.sin(a * (1 - t) + b * t)
763
- res = _tanhsinh(f, xp.asarray(0.), xp.asarray(1.), atol=0, rtol=0, maxlevel=10)
764
- assert xp.isfinite(res.error)
756
+ return xp.sin(c1 * (1 - t) + c2 * t)
757
+ a, b = xp.asarray(0., dtype=xp.float64), xp.asarray(1., dtype=xp.float64)
758
+ ref = _tanhsinh(f, a, b, atol=0, rtol=0, maxlevel=10)
759
+ assert xp.isfinite(ref.error)
760
+ # Previously, tanhsinh would not detect convergence
761
+ res = _tanhsinh(f, a, b, rtol=1e-14)
762
+ assert res.success
763
+ assert res.maxlevel < 5
764
+ xp_assert_close(res.integral, ref.integral, rtol=1e-15)
765
765
 
766
766
 
767
- @array_api_compatible
768
- @pytest.mark.usefixtures("skip_xp_backends")
767
+ @pytest.mark.skip_xp_backends('torch', reason='data-apis/array-api-compat#271')
769
768
  @pytest.mark.skip_xp_backends('array_api_strict', reason='No fancy indexing.')
770
769
  @pytest.mark.skip_xp_backends('jax.numpy', reason='No mutation.')
770
+ @pytest.mark.skip_xp_backends(
771
+ 'dask.array',
772
+ reason='Data-dependent shapes in boolean index assignment'
773
+ )
771
774
  class TestNSum:
772
775
  rng = np.random.default_rng(5895448232066142650)
773
776
  p = rng.uniform(1, 10, size=10).tolist()
@@ -822,13 +825,21 @@ class TestNSum:
822
825
  with pytest.raises(ValueError, match=message):
823
826
  nsum(f, a, b, tolerances=dict(rtol=pytest))
824
827
 
825
- with np.errstate(all='ignore'):
828
+ with (np.errstate(all='ignore')):
826
829
  res = nsum(f, xp.asarray([np.nan, np.inf]), xp.asarray(1.))
827
- assert xp.all((res.status == -1) & xp.isnan(res.sum)
828
- & xp.isnan(res.error) & ~res.success & res.nfev == 1)
830
+ assert (res.status[0] == -1) and not res.success[0]
831
+ assert xp.isnan(res.sum[0]) and xp.isnan(res.error[0])
832
+ assert (res.status[1] == 0) and res.success[1]
833
+ assert res.sum[1] == res.error[1]
834
+ assert xp.all(res.nfev[0] == 1)
835
+
829
836
  res = nsum(f, xp.asarray(10.), xp.asarray([np.nan, 1]))
830
- assert xp.all((res.status == -1) & xp.isnan(res.sum)
831
- & xp.isnan(res.error) & ~res.success & res.nfev == 1)
837
+ assert (res.status[0] == -1) and not res.success[0]
838
+ assert xp.isnan(res.sum[0]) and xp.isnan(res.error[0])
839
+ assert (res.status[1] == 0) and res.success[1]
840
+ assert res.sum[1] == res.error[1]
841
+ assert xp.all(res.nfev[0] == 1)
842
+
832
843
  res = nsum(f, xp.asarray(1.), xp.asarray(10.),
833
844
  step=xp.asarray([xp.nan, -xp.inf, xp.inf, -1, 0]))
834
845
  assert xp.all((res.status == -1) & xp.isnan(res.sum)
@@ -862,8 +873,7 @@ class TestNSum:
862
873
  res = nsum(f, a, b, args=args)
863
874
  xp_assert_close(res.sum, ref)
864
875
  xp_assert_equal(res.status, xp.zeros(ref.shape, dtype=xp.int32))
865
- xp_test = array_namespace(a) # CuPy doesn't have `bool`
866
- xp_assert_equal(res.success, xp.ones(ref.shape, dtype=xp_test.bool))
876
+ xp_assert_equal(res.success, xp.ones(ref.shape, dtype=xp.bool))
867
877
 
868
878
  with np.errstate(divide='ignore'):
869
879
  logres = nsum(lambda *args: xp.log(f(*args)),
@@ -901,8 +911,7 @@ class TestNSum:
901
911
  ref_err = (high - low)/2 # error (assuming perfect quadrature)
902
912
 
903
913
  # correct reference values where number of terms < maxterms
904
- xp_test = array_namespace(a) # torch needs broadcast_arrays
905
- a, b, step = xp_test.broadcast_arrays(a, b, step)
914
+ a, b, step = xp.broadcast_arrays(a, b, step)
906
915
  for i in np.ndindex(a.shape):
907
916
  ai, bi, stepi = float(a[i]), float(b[i]), float(step[i])
908
917
  if (bi - ai)/stepi + 1 <= maxterms:
@@ -959,10 +968,9 @@ class TestNSum:
959
968
  xp_assert_close(xp_ravel(res_attr), xp.asarray(ref_attr), rtol=1e-15)
960
969
  assert res_attr.shape == shape
961
970
 
962
- xp_test = array_namespace(xp.asarray(1.))
963
- assert xp_test.isdtype(res.success.dtype, 'bool')
964
- assert xp_test.isdtype(res.status.dtype, 'integral')
965
- assert xp_test.isdtype(res.nfev.dtype, 'integral')
971
+ assert xp.isdtype(res.success.dtype, 'bool')
972
+ assert xp.isdtype(res.status.dtype, 'integral')
973
+ assert xp.isdtype(res.nfev.dtype, 'integral')
966
974
  if is_numpy(xp): # other libraries might have different number
967
975
  assert int(xp.max(res.nfev)) == f.feval
968
976
 
@@ -1084,8 +1092,8 @@ class TestNSum:
1084
1092
  return 1 / x
1085
1093
 
1086
1094
  res = nsum(f, xp.asarray(0), xp.asarray(10), maxterms=0)
1087
- assert xp.isnan(res.sum)
1088
- assert xp.isnan(res.error)
1095
+ assert xp.isinf(res.sum)
1096
+ assert xp.isinf(res.error)
1089
1097
  assert res.status == -2
1090
1098
 
1091
1099
  res = nsum(f, xp.asarray(0), xp.asarray(10), maxterms=1)