scipy 1.15.3__cp311-cp311-win_amd64.whl → 1.16.0__cp311-cp311-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.cp311-win_amd64.dll.a +0 -0
  4. scipy/_cyutility.cp311-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.cp311-win_amd64.dll.a +0 -0
  9. scipy/_lib/_ccallback_c.cp311-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.cp311-win_amd64.dll.a +0 -0
  13. scipy/_lib/_fpumode.cp311-win_amd64.pyd +0 -0
  14. scipy/_lib/_sparse.py +41 -0
  15. scipy/_lib/_test_ccallback.cp311-win_amd64.dll.a +0 -0
  16. scipy/_lib/_test_ccallback.cp311-win_amd64.pyd +0 -0
  17. scipy/_lib/_test_deprecation_call.cp311-win_amd64.dll.a +0 -0
  18. scipy/_lib/_test_deprecation_call.cp311-win_amd64.pyd +0 -0
  19. scipy/_lib/_test_deprecation_def.cp311-win_amd64.dll.a +0 -0
  20. scipy/_lib/_test_deprecation_def.cp311-win_amd64.pyd +0 -0
  21. scipy/_lib/_testutils.py +6 -2
  22. scipy/_lib/_uarray/_uarray.cp311-win_amd64.dll.a +0 -0
  23. scipy/_lib/_uarray/_uarray.cp311-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.cp311-win_amd64.dll.a +0 -0
  72. scipy/_lib/messagestream.cp311-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.cp311-win_amd64.dll.a +0 -0
  105. scipy/cluster/_hierarchy.cp311-win_amd64.pyd +0 -0
  106. scipy/cluster/_optimal_leaf_ordering.cp311-win_amd64.dll.a +0 -0
  107. scipy/cluster/_optimal_leaf_ordering.cp311-win_amd64.pyd +0 -0
  108. scipy/cluster/_vq.cp311-win_amd64.dll.a +0 -0
  109. scipy/cluster/_vq.cp311-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.cp311-win_amd64.dll.a +0 -0
  127. scipy/fft/_pocketfft/pypocketfft.cp311-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.cp311-win_amd64.dll.a +0 -0
  136. scipy/fftpack/convolve.cp311-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.cp311-win_amd64.dll.a +0 -0
  142. scipy/integrate/_dop.cp311-win_amd64.pyd +0 -0
  143. scipy/integrate/_lsoda.cp311-win_amd64.dll.a +0 -0
  144. scipy/integrate/_lsoda.cp311-win_amd64.pyd +0 -0
  145. scipy/integrate/_ode.py +9 -2
  146. scipy/integrate/_odepack.cp311-win_amd64.dll.a +0 -0
  147. scipy/integrate/_odepack.cp311-win_amd64.pyd +0 -0
  148. scipy/integrate/_quad_vec.py +21 -29
  149. scipy/integrate/_quadpack.cp311-win_amd64.dll.a +0 -0
  150. scipy/integrate/_quadpack.cp311-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.cp311-win_amd64.dll.a +0 -0
  156. scipy/integrate/_test_multivariate.cp311-win_amd64.pyd +0 -0
  157. scipy/integrate/_test_odeint_banded.cp311-win_amd64.dll.a +0 -0
  158. scipy/integrate/_test_odeint_banded.cp311-win_amd64.pyd +0 -0
  159. scipy/integrate/_vode.cp311-win_amd64.dll.a +0 -0
  160. scipy/integrate/_vode.cp311-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.cp311-win_amd64.dll.a +0 -0
  171. scipy/interpolate/_dfitpack.cp311-win_amd64.pyd +0 -0
  172. scipy/interpolate/_dierckx.cp311-win_amd64.dll.a +0 -0
  173. scipy/interpolate/_dierckx.cp311-win_amd64.pyd +0 -0
  174. scipy/interpolate/_fitpack.cp311-win_amd64.dll.a +0 -0
  175. scipy/interpolate/_fitpack.cp311-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.cp311-win_amd64.dll.a +0 -0
  180. scipy/interpolate/_interpnd.cp311-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.cp311-win_amd64.dll.a +0 -0
  186. scipy/interpolate/_ppoly.cp311-win_amd64.pyd +0 -0
  187. scipy/interpolate/_rbf.py +2 -2
  188. scipy/interpolate/_rbfinterp.py +1 -1
  189. scipy/interpolate/_rbfinterp_pythran.cp311-win_amd64.dll.a +0 -0
  190. scipy/interpolate/_rbfinterp_pythran.cp311-win_amd64.pyd +0 -0
  191. scipy/interpolate/_rgi.py +31 -26
  192. scipy/interpolate/_rgi_cython.cp311-win_amd64.dll.a +0 -0
  193. scipy/interpolate/_rgi_cython.cp311-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.cp311-win_amd64.dll.a +0 -0
  204. scipy/io/_fast_matrix_market/_fmm_core.cp311-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.cp311-win_amd64.dll.a +0 -0
  210. scipy/io/_test_fortran.cp311-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.cp311-win_amd64.dll.a +0 -0
  216. scipy/io/matlab/_mio5_utils.cp311-win_amd64.pyd +0 -0
  217. scipy/io/matlab/_mio_utils.cp311-win_amd64.dll.a +0 -0
  218. scipy/io/matlab/_mio_utils.cp311-win_amd64.pyd +0 -0
  219. scipy/io/matlab/_miobase.py +4 -1
  220. scipy/io/matlab/_streams.cp311-win_amd64.dll.a +0 -0
  221. scipy/io/matlab/_streams.cp311-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.cp311-win_amd64.dll.a +0 -0
  229. scipy/linalg/_cythonized_array_utils.cp311-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.cp311-win_amd64.dll.a +0 -0
  234. scipy/linalg/_decomp_interpolative.cp311-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.cp311-win_amd64.dll.a +0 -0
  238. scipy/linalg/_decomp_lu_cython.cp311-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.cp311-win_amd64.dll.a +0 -0
  245. scipy/linalg/_decomp_update.cp311-win_amd64.pyd +0 -0
  246. scipy/linalg/_expm_frechet.py +4 -0
  247. scipy/linalg/_fblas.cp311-win_amd64.dll.a +0 -0
  248. scipy/linalg/_fblas.cp311-win_amd64.pyd +0 -0
  249. scipy/linalg/_flapack.cp311-win_amd64.dll.a +0 -0
  250. scipy/linalg/_flapack.cp311-win_amd64.pyd +0 -0
  251. scipy/linalg/_linalg_pythran.cp311-win_amd64.dll.a +0 -0
  252. scipy/linalg/_linalg_pythran.cp311-win_amd64.pyd +0 -0
  253. scipy/linalg/_matfuncs.py +187 -4
  254. scipy/linalg/_matfuncs_expm.cp311-win_amd64.dll.a +0 -0
  255. scipy/linalg/_matfuncs_expm.cp311-win_amd64.pyd +0 -0
  256. scipy/linalg/_matfuncs_schur_sqrtm.cp311-win_amd64.dll.a +0 -0
  257. scipy/linalg/_matfuncs_schur_sqrtm.cp311-win_amd64.pyd +0 -0
  258. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  259. scipy/linalg/_matfuncs_sqrtm_triu.cp311-win_amd64.dll.a +0 -0
  260. scipy/linalg/_matfuncs_sqrtm_triu.cp311-win_amd64.pyd +0 -0
  261. scipy/linalg/_procrustes.py +2 -0
  262. scipy/linalg/_sketches.py +17 -6
  263. scipy/linalg/_solve_toeplitz.cp311-win_amd64.dll.a +0 -0
  264. scipy/linalg/_solve_toeplitz.cp311-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.cp311-win_amd64.dll.a +0 -0
  269. scipy/linalg/cython_blas.cp311-win_amd64.pyd +0 -0
  270. scipy/linalg/cython_lapack.cp311-win_amd64.dll.a +0 -0
  271. scipy/linalg/cython_lapack.cp311-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.cp311-win_amd64.dll.a +0 -0
  287. scipy/ndimage/_ctest.cp311-win_amd64.pyd +0 -0
  288. scipy/ndimage/_cytest.cp311-win_amd64.dll.a +0 -0
  289. scipy/ndimage/_cytest.cp311-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.cp311-win_amd64.dll.a +0 -0
  296. scipy/ndimage/_nd_image.cp311-win_amd64.pyd +0 -0
  297. scipy/ndimage/_ni_docstrings.py +5 -1
  298. scipy/ndimage/_ni_label.cp311-win_amd64.dll.a +0 -0
  299. scipy/ndimage/_ni_label.cp311-win_amd64.pyd +0 -0
  300. scipy/ndimage/_ni_support.py +1 -5
  301. scipy/ndimage/_rank_filter_1d.cp311-win_amd64.dll.a +0 -0
  302. scipy/ndimage/_rank_filter_1d.cp311-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.cp311-win_amd64.dll.a +0 -0
  311. scipy/odr/__odrpack.cp311-win_amd64.pyd +0 -0
  312. scipy/optimize/_basinhopping.py +13 -7
  313. scipy/optimize/_bglu_dense.cp311-win_amd64.dll.a +0 -0
  314. scipy/optimize/_bglu_dense.cp311-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.cp311-win_amd64.dll.a +0 -0
  322. scipy/optimize/_direct.cp311-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.cp311-win_amd64.dll.a +0 -0
  326. scipy/optimize/_group_columns.cp311-win_amd64.pyd +0 -0
  327. scipy/optimize/_highspy/_core.cp311-win_amd64.dll.a +0 -0
  328. scipy/optimize/_highspy/_core.cp311-win_amd64.pyd +0 -0
  329. scipy/optimize/_highspy/_highs_options.cp311-win_amd64.dll.a +0 -0
  330. scipy/optimize/_highspy/_highs_options.cp311-win_amd64.pyd +0 -0
  331. scipy/optimize/_lbfgsb.cp311-win_amd64.dll.a +0 -0
  332. scipy/optimize/_lbfgsb.cp311-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.cp311-win_amd64.dll.a +0 -0
  339. scipy/optimize/_lsap.cp311-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.cp311-win_amd64.dll.a +0 -0
  343. scipy/optimize/_lsq/givens_elimination.cp311-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.cp311-win_amd64.dll.a +0 -0
  350. scipy/optimize/_minpack.cp311-win_amd64.pyd +0 -0
  351. scipy/optimize/_minpack_py.py +21 -14
  352. scipy/optimize/_moduleTNC.cp311-win_amd64.dll.a +0 -0
  353. scipy/optimize/_moduleTNC.cp311-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.cp311-win_amd64.dll.a +0 -0
  359. scipy/optimize/_pava_pybind.cp311-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.cp311-win_amd64.dll.a +0 -0
  366. scipy/optimize/_slsqplib.cp311-win_amd64.pyd +0 -0
  367. scipy/optimize/_spectral.py +1 -1
  368. scipy/optimize/_tnc.py +8 -1
  369. scipy/optimize/_trlib/_trlib.cp311-win_amd64.dll.a +0 -0
  370. scipy/optimize/_trlib/_trlib.cp311-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.cp311-win_amd64.dll.a +0 -0
  382. scipy/optimize/_zeros.cp311-win_amd64.pyd +0 -0
  383. scipy/optimize/_zeros_py.py +97 -17
  384. scipy/optimize/cython_optimize/_zeros.cp311-win_amd64.dll.a +0 -0
  385. scipy/optimize/cython_optimize/_zeros.cp311-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.cp311-win_amd64.dll.a +0 -0
  417. scipy/signal/_max_len_seq_inner.cp311-win_amd64.pyd +0 -0
  418. scipy/signal/_peak_finding_utils.cp311-win_amd64.dll.a +0 -0
  419. scipy/signal/_peak_finding_utils.cp311-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.cp311-win_amd64.dll.a +0 -0
  425. scipy/signal/_sigtools.cp311-win_amd64.pyd +0 -0
  426. scipy/signal/_sosfilt.cp311-win_amd64.dll.a +0 -0
  427. scipy/signal/_sosfilt.cp311-win_amd64.pyd +0 -0
  428. scipy/signal/_spectral_py.py +230 -50
  429. scipy/signal/_spline.cp311-win_amd64.dll.a +0 -0
  430. scipy/signal/_spline.cp311-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.cp311-win_amd64.dll.a +0 -0
  435. scipy/signal/_upfirdn_apply.cp311-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.cp311-win_amd64.dll.a +0 -0
  462. scipy/sparse/_csparsetools.cp311-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.cp311-win_amd64.dll.a +0 -0
  470. scipy/sparse/_sparsetools.cp311-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.cp311-win_amd64.dll.a +0 -0
  479. scipy/sparse/csgraph/_flow.cp311-win_amd64.pyd +0 -0
  480. scipy/sparse/csgraph/_matching.cp311-win_amd64.dll.a +0 -0
  481. scipy/sparse/csgraph/_matching.cp311-win_amd64.pyd +0 -0
  482. scipy/sparse/csgraph/_min_spanning_tree.cp311-win_amd64.dll.a +0 -0
  483. scipy/sparse/csgraph/_min_spanning_tree.cp311-win_amd64.pyd +0 -0
  484. scipy/sparse/csgraph/_reordering.cp311-win_amd64.dll.a +0 -0
  485. scipy/sparse/csgraph/_reordering.cp311-win_amd64.pyd +0 -0
  486. scipy/sparse/csgraph/_shortest_path.cp311-win_amd64.dll.a +0 -0
  487. scipy/sparse/csgraph/_shortest_path.cp311-win_amd64.pyd +0 -0
  488. scipy/sparse/csgraph/_tools.cp311-win_amd64.dll.a +0 -0
  489. scipy/sparse/csgraph/_tools.cp311-win_amd64.pyd +0 -0
  490. scipy/sparse/csgraph/_traversal.cp311-win_amd64.dll.a +0 -0
  491. scipy/sparse/csgraph/_traversal.cp311-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.cp311-win_amd64.dll.a +0 -0
  500. scipy/sparse/linalg/_dsolve/_superlu.cp311-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.cp311-win_amd64.dll.a +0 -0
  504. scipy/sparse/linalg/_eigen/arpack/_arpack.cp311-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.cp311-win_amd64.dll.a +0 -0
  517. scipy/sparse/linalg/_propack/_cpropack.cp311-win_amd64.pyd +0 -0
  518. scipy/sparse/linalg/_propack/_dpropack.cp311-win_amd64.dll.a +0 -0
  519. scipy/sparse/linalg/_propack/_dpropack.cp311-win_amd64.pyd +0 -0
  520. scipy/sparse/linalg/_propack/_spropack.cp311-win_amd64.dll.a +0 -0
  521. scipy/sparse/linalg/_propack/_spropack.cp311-win_amd64.pyd +0 -0
  522. scipy/sparse/linalg/_propack/_zpropack.cp311-win_amd64.dll.a +0 -0
  523. scipy/sparse/linalg/_propack/_zpropack.cp311-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.cp311-win_amd64.dll.a +0 -0
  534. scipy/spatial/_ckdtree.cp311-win_amd64.pyd +0 -0
  535. scipy/spatial/_distance_pybind.cp311-win_amd64.dll.a +0 -0
  536. scipy/spatial/_distance_pybind.cp311-win_amd64.pyd +0 -0
  537. scipy/spatial/_distance_wrap.cp311-win_amd64.dll.a +0 -0
  538. scipy/spatial/_distance_wrap.cp311-win_amd64.pyd +0 -0
  539. scipy/spatial/_hausdorff.cp311-win_amd64.dll.a +0 -0
  540. scipy/spatial/_hausdorff.cp311-win_amd64.pyd +0 -0
  541. scipy/spatial/_qhull.cp311-win_amd64.dll.a +0 -0
  542. scipy/spatial/_qhull.cp311-win_amd64.pyd +0 -0
  543. scipy/spatial/_voronoi.cp311-win_amd64.dll.a +0 -0
  544. scipy/spatial/_voronoi.cp311-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.cp311-win_amd64.dll.a +0 -0
  551. scipy/spatial/transform/_rigid_transform.cp311-win_amd64.pyd +0 -0
  552. scipy/spatial/transform/_rotation.cp311-win_amd64.dll.a +0 -0
  553. scipy/spatial/transform/_rotation.cp311-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.cp311-win_amd64.dll.a +0 -0
  562. scipy/special/_comb.cp311-win_amd64.pyd +0 -0
  563. scipy/special/_ellip_harm_2.cp311-win_amd64.dll.a +0 -0
  564. scipy/special/_ellip_harm_2.cp311-win_amd64.pyd +0 -0
  565. scipy/special/_gufuncs.cp311-win_amd64.dll.a +0 -0
  566. scipy/special/_gufuncs.cp311-win_amd64.pyd +0 -0
  567. scipy/special/_logsumexp.py +67 -58
  568. scipy/special/_orthogonal.pyi +1 -1
  569. scipy/special/_specfun.cp311-win_amd64.dll.a +0 -0
  570. scipy/special/_specfun.cp311-win_amd64.pyd +0 -0
  571. scipy/special/_special_ufuncs.cp311-win_amd64.dll.a +0 -0
  572. scipy/special/_special_ufuncs.cp311-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.cp311-win_amd64.dll.a +0 -0
  576. scipy/special/_test_internal.cp311-win_amd64.pyd +0 -0
  577. scipy/special/_testutils.py +4 -4
  578. scipy/special/_ufuncs.cp311-win_amd64.dll.a +0 -0
  579. scipy/special/_ufuncs.cp311-win_amd64.pyd +0 -0
  580. scipy/special/_ufuncs.pyi +1 -0
  581. scipy/special/_ufuncs.pyx +215 -1400
  582. scipy/special/_ufuncs_cxx.cp311-win_amd64.dll.a +0 -0
  583. scipy/special/_ufuncs_cxx.cp311-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.cp311-win_amd64.dll.a +0 -0
  589. scipy/special/cython_special.cp311-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.cp311-win_amd64.dll.a +0 -0
  607. scipy/stats/_ansari_swilk_statistics.cp311-win_amd64.pyd +0 -0
  608. scipy/stats/_axis_nan_policy.py +5 -12
  609. scipy/stats/_biasedurn.cp311-win_amd64.dll.a +0 -0
  610. scipy/stats/_biasedurn.cp311-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.cp311-win_amd64.dll.a +0 -0
  625. scipy/stats/_levy_stable/levyst.cp311-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.cp311-win_amd64.dll.a +0 -0
  635. scipy/stats/_qmc_cy.cp311-win_amd64.pyd +0 -0
  636. scipy/stats/_qmvnt.py +16 -95
  637. scipy/stats/_qmvnt_cy.cp311-win_amd64.dll.a +0 -0
  638. scipy/stats/_qmvnt_cy.cp311-win_amd64.pyd +0 -0
  639. scipy/stats/_quantile.py +335 -0
  640. scipy/stats/_rcont/rcont.cp311-win_amd64.dll.a +0 -0
  641. scipy/stats/_rcont/rcont.cp311-win_amd64.pyd +0 -0
  642. scipy/stats/_resampling.py +5 -30
  643. scipy/stats/_sampling.py +1 -1
  644. scipy/stats/_sobol.cp311-win_amd64.dll.a +0 -0
  645. scipy/stats/_sobol.cp311-win_amd64.pyd +0 -0
  646. scipy/stats/_stats.cp311-win_amd64.dll.a +0 -0
  647. scipy/stats/_stats.cp311-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.cp311-win_amd64.dll.a +0 -0
  651. scipy/stats/_stats_pythran.cp311-win_amd64.pyd +0 -0
  652. scipy/stats/_unuran/unuran_wrapper.cp311-win_amd64.dll.a +0 -0
  653. scipy/stats/_unuran/unuran_wrapper.cp311-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.cp311-win_amd64.dll.a +0 -0
  688. scipy/interpolate/_bspl.cp311-win_amd64.pyd +0 -0
  689. scipy/optimize/_cobyla.cp311-win_amd64.dll.a +0 -0
  690. scipy/optimize/_cobyla.cp311-win_amd64.pyd +0 -0
  691. scipy/optimize/_cython_nnls.cp311-win_amd64.dll.a +0 -0
  692. scipy/optimize/_cython_nnls.cp311-win_amd64.pyd +0 -0
  693. scipy/optimize/_slsqp.cp311-win_amd64.dll.a +0 -0
  694. scipy/optimize/_slsqp.cp311-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.cp311-win_amd64.dll.a +0 -0
  757. scipy/stats/_mvn.cp311-win_amd64.pyd +0 -0
  758. scipy-1.15.3.dist-info/DELVEWHEEL +0 -2
  759. /scipy-1.15.3-cp311-cp311-win_amd64.whl → /scipy-1.16.0-cp311-cp311-win_amd64.whl +0 -0
  760. {scipy-1.15.3.dist-info → scipy-1.16.0.dist-info}/WHEEL +0 -0
scipy/special/_basic.py CHANGED
@@ -2693,10 +2693,6 @@ def comb(N, k, *, exact=False, repetition=False):
2693
2693
  exact : bool, optional
2694
2694
  For integers, if `exact` is False, then floating point precision is
2695
2695
  used, otherwise the result is computed exactly.
2696
-
2697
- .. deprecated:: 1.14.0
2698
- ``exact=True`` is deprecated for non-integer `N` and `k` and will raise an
2699
- error in SciPy 1.16.0
2700
2696
  repetition : bool, optional
2701
2697
  If `repetition` is True, then the number of combinations with
2702
2698
  repetition is computed.
@@ -2737,12 +2733,9 @@ def comb(N, k, *, exact=False, repetition=False):
2737
2733
  if int(N) == N and int(k) == k:
2738
2734
  # _comb_int casts inputs to integers, which is safe & intended here
2739
2735
  return _comb_int(N, k)
2740
- # otherwise, we disregard `exact=True`; it makes no sense for
2741
- # non-integral arguments
2742
- msg = ("`exact=True` is deprecated for non-integer `N` and `k` and will raise "
2743
- "an error in SciPy 1.16.0")
2744
- warnings.warn(msg, DeprecationWarning, stacklevel=2)
2745
- return comb(N, k)
2736
+ else:
2737
+ raise ValueError("Non-integer `N` and `k` with `exact=True` is not "
2738
+ "supported.")
2746
2739
  else:
2747
2740
  k, N = asarray(k), asarray(N)
2748
2741
  cond = (k <= N) & (N >= 0) & (k >= 0)
@@ -2796,19 +2789,17 @@ def perm(N, k, exact=False):
2796
2789
  N = np.squeeze(N)[()] # for backward compatibility (accepted size 1 arrays)
2797
2790
  k = np.squeeze(k)[()]
2798
2791
  if not (isscalar(N) and isscalar(k)):
2799
- raise ValueError("`N` and `k` must scalar integers be with `exact=True`.")
2792
+ raise ValueError("`N` and `k` must be scalar integers with `exact=True`.")
2800
2793
 
2801
2794
  floor_N, floor_k = int(N), int(k)
2802
2795
  non_integral = not (floor_N == N and floor_k == k)
2803
- if (k > N) or (N < 0) or (k < 0):
2804
- if non_integral:
2805
- msg = ("Non-integer `N` and `k` with `exact=True` is deprecated and "
2806
- "will raise an error in SciPy 1.16.0.")
2807
- warnings.warn(msg, DeprecationWarning, stacklevel=2)
2808
- return 0
2809
2796
  if non_integral:
2810
2797
  raise ValueError("Non-integer `N` and `k` with `exact=True` is not "
2811
2798
  "supported.")
2799
+
2800
+ if (k > N) or (N < 0) or (k < 0):
2801
+ return 0
2802
+
2812
2803
  val = 1
2813
2804
  for i in range(floor_N - floor_k + 1, floor_N + 1):
2814
2805
  val *= i
@@ -2990,14 +2981,20 @@ def _factorialx_approx_core(n, k, extend):
2990
2981
  # scalar case separately, unified handling would be inefficient for arrays;
2991
2982
  # don't use isscalar due to numpy/numpy#23574; 0-dim arrays treated below
2992
2983
  if not isinstance(n, np.ndarray):
2993
- return (
2994
- np.power(k, (n - n_mod_k) / k)
2995
- * gamma(n / k + 1) / gamma(n_mod_k / k + 1)
2996
- * max(n_mod_k, 1)
2997
- )
2984
+ with warnings.catch_warnings():
2985
+ # large n cause overflow warnings, but infinity is fine
2986
+ warnings.simplefilter("ignore", RuntimeWarning)
2987
+ return (
2988
+ np.power(k, (n - n_mod_k) / k)
2989
+ * gamma(n / k + 1) / gamma(n_mod_k / k + 1)
2990
+ * max(n_mod_k, 1)
2991
+ )
2998
2992
 
2999
2993
  # factor that's independent of the residue class (see factorialk docstring)
3000
- result = np.power(k, n / k) * gamma(n / k + 1)
2994
+ with warnings.catch_warnings():
2995
+ # large n cause overflow warnings, but infinity is fine
2996
+ warnings.simplefilter("ignore", RuntimeWarning)
2997
+ result = np.power(k, n / k) * gamma(n / k + 1)
3001
2998
  # factor dependent on residue r (for `r=0` it's 1, so we skip `r=0`
3002
2999
  # below and thus also avoid evaluating `max(r, 1)`)
3003
3000
  def corr(k, r): return np.power(k, -r / k) / gamma(r / k + 1) * r
@@ -3104,8 +3101,8 @@ def _factorialx_wrapper(fname, n, k, exact, extend):
3104
3101
  elif n in {0, 1}:
3105
3102
  return 1 if exact else np.float64(1)
3106
3103
  elif exact and _is_subdtype(type(n), "i"):
3107
- # calculate with integers
3108
- return _range_prod(1, n, k=k)
3104
+ # calculate with integers; cast away other int types (like unsigned)
3105
+ return _range_prod(1, int(n), k=k)
3109
3106
  elif exact:
3110
3107
  # only relevant for factorial
3111
3108
  raise ValueError(msg_exact_not_possible.format(dtype=type(n)))
Binary file
Binary file
Binary file
@@ -1,19 +1,18 @@
1
- import math
2
1
  import numpy as np
3
- from scipy._lib._util import _asarray_validated
4
2
  from scipy._lib._array_api import (
5
3
  array_namespace,
4
+ xp_capabilities,
5
+ xp_device,
6
6
  xp_size,
7
- xp_broadcast_promote,
8
- xp_copy,
7
+ xp_promote,
9
8
  xp_float_to_complex,
10
- is_complex,
11
9
  )
12
10
  from scipy._lib import array_api_extra as xpx
13
11
 
14
12
  __all__ = ["logsumexp", "softmax", "log_softmax"]
15
13
 
16
14
 
15
+ @xp_capabilities()
17
16
  def logsumexp(a, axis=None, b=None, keepdims=False, return_sign=False):
18
17
  """Compute the log of the sum of exponentials of input elements.
19
18
 
@@ -61,7 +60,8 @@ def logsumexp(a, axis=None, b=None, keepdims=False, return_sign=False):
61
60
 
62
61
  See Also
63
62
  --------
64
- numpy.logaddexp, numpy.logaddexp2
63
+ :data:`numpy.logaddexp`
64
+ :data:`numpy.logaddexp2`
65
65
 
66
66
  Notes
67
67
  -----
@@ -108,28 +108,45 @@ def logsumexp(a, axis=None, b=None, keepdims=False, return_sign=False):
108
108
 
109
109
  """
110
110
  xp = array_namespace(a, b)
111
- a, b = xp_broadcast_promote(a, b, ensure_writeable=True, force_floating=True, xp=xp)
111
+ a, b = xp_promote(a, b, broadcast=True, force_floating=True, xp=xp)
112
112
  a = xpx.atleast_nd(a, ndim=1, xp=xp)
113
113
  b = xpx.atleast_nd(b, ndim=1, xp=xp) if b is not None else b
114
114
  axis = tuple(range(a.ndim)) if axis is None else axis
115
115
 
116
116
  if xp_size(a) != 0:
117
+ with np.errstate(divide='ignore', invalid='ignore', over='ignore'):
118
+ # Where result is infinite, we use the direct logsumexp calculation to
119
+ # delegate edge case handling to the behavior of `xp.log` and `xp.exp`,
120
+ # which should follow the C99 standard for complex values.
121
+ b_exp_a = xp.exp(a) if b is None else b * xp.exp(a)
122
+ sum_ = xp.sum(b_exp_a, axis=axis, keepdims=True)
123
+ sgn_inf = _sign(sum_, xp=xp) if return_sign else None
124
+ sum_ = xp.abs(sum_) if return_sign else sum_
125
+ out_inf = xp.log(sum_)
126
+
117
127
  with np.errstate(divide='ignore', invalid='ignore'): # log of zero is OK
118
128
  out, sgn = _logsumexp(a, b, axis=axis, return_sign=return_sign, xp=xp)
129
+
130
+ # Replace infinite results. This probably could be done with an
131
+ # `apply_where`-like strategy to avoid redundant calculation, but currently
132
+ # `apply_where` itself is only for elementwise functions.
133
+ out_finite = xp.isfinite(out)
134
+ out = xp.where(out_finite, out, out_inf)
135
+ sgn = xp.where(out_finite, sgn, sgn_inf) if return_sign else sgn
119
136
  else:
120
137
  shape = np.asarray(a.shape) # NumPy is convenient for shape manipulation
121
138
  shape[axis] = 1
122
- out = xp.full(tuple(shape), -xp.inf, dtype=a.dtype)
139
+ out = xp.full(tuple(shape), -xp.inf, dtype=a.dtype, device=xp_device(a))
123
140
  sgn = xp.sign(out)
124
141
 
125
142
  if xp.isdtype(out.dtype, 'complex floating'):
126
143
  if return_sign:
127
144
  real = xp.real(sgn)
128
- imag = xp_float_to_complex(_wrap_radians(xp.imag(sgn), xp))
145
+ imag = xp_float_to_complex(_wrap_radians(xp.imag(sgn), xp=xp), xp=xp)
129
146
  sgn = real + imag*1j
130
147
  else:
131
148
  real = xp.real(out)
132
- imag = xp_float_to_complex(_wrap_radians(xp.imag(out), xp))
149
+ imag = xp_float_to_complex(_wrap_radians(xp.imag(out), xp=xp), xp=xp)
133
150
  out = real + imag*1j
134
151
 
135
152
  # Deal with shape details - reducing dimensions and convert 0-D to scalar for NumPy
@@ -141,17 +158,15 @@ def logsumexp(a, axis=None, b=None, keepdims=False, return_sign=False):
141
158
  return (out, sgn) if return_sign else out
142
159
 
143
160
 
144
- def _wrap_radians(x, xp=None):
145
- xp = array_namespace(x) if xp is None else xp
161
+ def _wrap_radians(x, *, xp):
146
162
  # Wrap radians to (-pi, pi] interval
147
- out = -((-x + math.pi) % (2 * math.pi) - math.pi)
163
+ wrapped = -((-x + xp.pi) % (2 * xp.pi) - xp.pi)
148
164
  # preserve relative precision
149
165
  no_wrap = xp.abs(x) < xp.pi
150
- out[no_wrap] = x[no_wrap]
151
- return out
166
+ return xp.where(no_wrap, x, wrapped)
152
167
 
153
168
 
154
- def _elements_and_indices_with_max_real(a, axis=-1, xp=None):
169
+ def _elements_and_indices_with_max_real(a, *, axis=-1, xp):
155
170
  # This is an array-API compatible `max` function that works something
156
171
  # like `np.max` for complex input. The important part is that it finds
157
172
  # the element with maximum real part. When there are multiple complex values
@@ -160,61 +175,54 @@ def _elements_and_indices_with_max_real(a, axis=-1, xp=None):
160
175
  # `take_along_axis`, and even if it did, we would have problems with axis tuples.
161
176
  # Feel free to rewrite! It's ugly, but it's not the purpose of the PR, and
162
177
  # it gets the job done.
163
- xp = array_namespace(a) if xp is None else xp
164
178
 
165
179
  if xp.isdtype(a.dtype, "complex floating"):
166
180
  # select all elements with max real part.
167
181
  real_a = xp.real(a)
168
- max = xp.max(real_a, axis=axis, keepdims=True)
169
- mask = real_a == max
182
+ max_ = xp.max(real_a, axis=axis, keepdims=True)
183
+ mask = real_a == max_
170
184
 
171
185
  # Of those, choose one arbitrarily. This is a reasonably
172
186
  # simple, array-API compatible way of doing so that doesn't
173
187
  # have a problem with `axis` being a tuple or None.
174
- i = xp.reshape(xp.arange(xp_size(a)), a.shape)
175
- i[~mask] = -1
188
+ i = xp.reshape(xp.arange(xp_size(a), device=xp_device(a)), a.shape)
189
+ i = xpx.at(i, ~mask).set(-1)
176
190
  max_i = xp.max(i, axis=axis, keepdims=True)
177
191
  mask = i == max_i
178
- a = xp_copy(a)
179
- a[~mask] = 0
180
- max = xp.sum(a, axis=axis, dtype=a.dtype, keepdims=True)
192
+ a = xp.where(mask, a, 0.)
193
+ max_ = xp.sum(a, axis=axis, dtype=a.dtype, keepdims=True)
181
194
  else:
182
- max = xp.max(a, axis=axis, keepdims=True)
183
- mask = a == max
184
-
185
- return xp.asarray(max), xp.asarray(mask)
195
+ max_ = xp.max(a, axis=axis, keepdims=True)
196
+ mask = a == max_
186
197
 
198
+ return max_, mask
187
199
 
188
- def _sign(x, xp):
189
- return x / xp.where(x == 0, xp.asarray(1, dtype=x.dtype), xp.abs(x))
190
200
 
201
+ def _sign(x, *, xp):
202
+ return x / xp.where(x == 0, 1., xp.abs(x))
191
203
 
192
- def _logsumexp(a, b, axis, return_sign, xp):
193
204
 
205
+ def _logsumexp(a, b, *, axis, return_sign, xp):
194
206
  # This has been around for about a decade, so let's consider it a feature:
195
207
  # Even if element of `a` is infinite or NaN, it adds nothing to the sum if
196
208
  # the corresponding weight is zero.
197
209
  if b is not None:
198
- a[b == 0] = -xp.inf
210
+ a = xpx.at(a, b == 0).set(-xp.inf, copy=True)
199
211
 
200
212
  # Find element with maximum real part, since this is what affects the magnitude
201
213
  # of the exponential. Possible enhancement: include log of `b` magnitude in `a`.
202
214
  a_max, i_max = _elements_and_indices_with_max_real(a, axis=axis, xp=xp)
203
215
 
204
216
  # for precision, these terms are separated out of the main sum.
205
- a[i_max] = -xp.inf
217
+ a = xpx.at(a, i_max).set(-xp.inf, copy=True if b is None else None)
206
218
  i_max_dt = xp.astype(i_max, a.dtype)
207
219
  # This is an inefficient way of getting `m` because it is the sum of a sparse
208
220
  # array; however, this is the simplest way I can think of to get the right shape.
209
- m = (xp.sum(i_max_dt, axis=axis, keepdims=True, dtype=a.dtype) if b is None
210
- else xp.sum(b * i_max_dt, axis=axis, keepdims=True, dtype=a.dtype))
211
-
212
- # Arithmetic between infinities will introduce NaNs.
213
- # `+ a_max` at the end naturally corrects for removing them here.
214
- shift = xp.where(xp.isfinite(a_max), a_max, xp.asarray(0, dtype=a_max.dtype))
221
+ b_i_max = i_max_dt if b is None else b * i_max_dt
222
+ m = xp.sum(b_i_max, axis=axis, keepdims=True, dtype=a.dtype)
215
223
 
216
224
  # Shift, exponentiate, scale, and sum
217
- exp = b * xp.exp(a - shift) if b is not None else xp.exp(a - shift)
225
+ exp = b * xp.exp(a - a_max) if b is not None else xp.exp(a - a_max)
218
226
  s = xp.sum(exp, axis=axis, keepdims=True, dtype=exp.dtype)
219
227
  s = xp.where(s == 0, s, s/m)
220
228
 
@@ -233,20 +241,20 @@ def _logsumexp(a, b, axis, return_sign, xp):
233
241
  m = xp.abs(m)
234
242
  else:
235
243
  # `a_max` can have a sign component for complex input
236
- sgn = sgn * xp.exp(xp.imag(a_max) * xp.asarray(1.0j, dtype=a_max.dtype))
244
+ sgn = sgn * xp.exp(xp.imag(a_max) * 1.0j)
237
245
 
238
246
  # Take log and undo shift
239
247
  out = xp.log1p(s) + xp.log(m) + a_max
240
248
 
241
249
  if return_sign:
242
- if is_complex(out, xp):
243
- out = xp.real(out)
250
+ out = xp.real(out)
244
251
  elif xp.isdtype(out.dtype, 'real floating'):
245
- out[sgn < 0] = xp.nan
252
+ out = xpx.at(out)[sgn < 0].set(xp.nan)
246
253
 
247
254
  return out, sgn
248
255
 
249
256
 
257
+ @xp_capabilities()
250
258
  def softmax(x, axis=None):
251
259
  r"""Compute the softmax function.
252
260
 
@@ -338,12 +346,14 @@ def softmax(x, axis=None):
338
346
  array([ 1., 1., 1.])
339
347
 
340
348
  """
341
- x = _asarray_validated(x, check_finite=False)
342
- x_max = np.amax(x, axis=axis, keepdims=True)
343
- exp_x_shifted = np.exp(x - x_max)
344
- return exp_x_shifted / np.sum(exp_x_shifted, axis=axis, keepdims=True)
349
+ xp = array_namespace(x)
350
+ x = xp.asarray(x)
351
+ x_max = xp.max(x, axis=axis, keepdims=True)
352
+ exp_x_shifted = xp.exp(x - x_max)
353
+ return exp_x_shifted / xp.sum(exp_x_shifted, axis=axis, keepdims=True)
345
354
 
346
355
 
356
+ @xp_capabilities()
347
357
  def log_softmax(x, axis=None):
348
358
  r"""Compute the logarithm of the softmax function.
349
359
 
@@ -395,23 +405,22 @@ def log_softmax(x, axis=None):
395
405
  array([ 0., -inf])
396
406
 
397
407
  """
408
+ xp = array_namespace(x)
409
+ x = xp.asarray(x)
398
410
 
399
- x = _asarray_validated(x, check_finite=False)
400
-
401
- x_max = np.amax(x, axis=axis, keepdims=True)
411
+ x_max = xp.max(x, axis=axis, keepdims=True)
402
412
 
403
413
  if x_max.ndim > 0:
404
- x_max[~np.isfinite(x_max)] = 0
405
- elif not np.isfinite(x_max):
414
+ x_max = xpx.at(x_max, ~xp.isfinite(x_max)).set(0)
415
+ elif not xp.isfinite(x_max):
406
416
  x_max = 0
407
417
 
408
418
  tmp = x - x_max
409
- exp_tmp = np.exp(tmp)
419
+ exp_tmp = xp.exp(tmp)
410
420
 
411
421
  # suppress warnings about log of zero
412
422
  with np.errstate(divide='ignore'):
413
- s = np.sum(exp_tmp, axis=axis, keepdims=True)
414
- out = np.log(s)
423
+ s = xp.sum(exp_tmp, axis=axis, keepdims=True)
424
+ out = xp.log(s)
415
425
 
416
- out = tmp - out
417
- return out
426
+ return tmp - out
@@ -1,10 +1,10 @@
1
1
  from typing import (
2
2
  Any,
3
- Callable,
4
3
  Literal,
5
4
  Optional,
6
5
  overload,
7
6
  )
7
+ from collections.abc import Callable
8
8
 
9
9
  import numpy as np
10
10
 
Binary file
@@ -1,5 +1,5 @@
1
1
  from functools import wraps
2
- from scipy._lib._util import _lazywhere
2
+ import scipy._lib.array_api_extra as xpx
3
3
  import numpy as np
4
4
  from ._ufuncs import (_spherical_jn, _spherical_yn, _spherical_in,
5
5
  _spherical_kn, _spherical_jn_d, _spherical_yn_d,
@@ -28,9 +28,9 @@ def use_reflection(sign_n_even=None, reflection_fun=None):
28
28
  return fun(n, z, derivative) # complex dtype just works
29
29
 
30
30
  f2 = standard_reflection if reflection_fun is None else reflection_fun
31
- return _lazywhere(z.real >= 0, (n, z),
32
- f=lambda n, z: fun(n, z, derivative),
33
- f2=lambda n, z: f2(n, z, derivative))[()]
31
+ return xpx.apply_where(z.real >= 0, (n, z),
32
+ lambda n, z: fun(n, z, derivative),
33
+ lambda n, z: f2(n, z, derivative))[()]
34
34
  return wrapper
35
35
  return decorator
36
36