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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (759) hide show
  1. scipy/__config__.py +8 -8
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cp313-win_amd64.dll.a +0 -0
  4. scipy/_cyutility.cp313-win_amd64.pyd +0 -0
  5. scipy/_lib/_array_api.py +486 -161
  6. scipy/_lib/_array_api_compat_vendor.py +9 -0
  7. scipy/_lib/_bunch.py +4 -0
  8. scipy/_lib/_ccallback_c.cp313-win_amd64.dll.a +0 -0
  9. scipy/_lib/_ccallback_c.cp313-win_amd64.pyd +0 -0
  10. scipy/_lib/_docscrape.py +1 -1
  11. scipy/_lib/_elementwise_iterative_method.py +15 -26
  12. scipy/_lib/_fpumode.cp313-win_amd64.dll.a +0 -0
  13. scipy/_lib/_fpumode.cp313-win_amd64.pyd +0 -0
  14. scipy/_lib/_sparse.py +41 -0
  15. scipy/_lib/_test_ccallback.cp313-win_amd64.dll.a +0 -0
  16. scipy/_lib/_test_ccallback.cp313-win_amd64.pyd +0 -0
  17. scipy/_lib/_test_deprecation_call.cp313-win_amd64.dll.a +0 -0
  18. scipy/_lib/_test_deprecation_call.cp313-win_amd64.pyd +0 -0
  19. scipy/_lib/_test_deprecation_def.cp313-win_amd64.dll.a +0 -0
  20. scipy/_lib/_test_deprecation_def.cp313-win_amd64.pyd +0 -0
  21. scipy/_lib/_testutils.py +6 -2
  22. scipy/_lib/_uarray/_uarray.cp313-win_amd64.dll.a +0 -0
  23. scipy/_lib/_uarray/_uarray.cp313-win_amd64.pyd +0 -0
  24. scipy/_lib/_util.py +222 -125
  25. scipy/_lib/array_api_compat/__init__.py +4 -4
  26. scipy/_lib/array_api_compat/_internal.py +19 -6
  27. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  28. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  29. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  30. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  31. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  32. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  33. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  34. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  35. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  36. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  37. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  38. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  39. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  40. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  41. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  42. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  43. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  44. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  45. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  46. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  47. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  48. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  49. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  50. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  51. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  52. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  53. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  54. scipy/_lib/array_api_extra/__init__.py +26 -3
  55. scipy/_lib/array_api_extra/_delegation.py +171 -0
  56. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  57. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  58. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  59. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  60. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  61. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  62. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  63. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  64. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  65. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  66. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  67. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  68. scipy/_lib/array_api_extra/testing.py +359 -0
  69. scipy/_lib/decorator.py +2 -2
  70. scipy/_lib/doccer.py +1 -7
  71. scipy/_lib/messagestream.cp313-win_amd64.dll.a +0 -0
  72. scipy/_lib/messagestream.cp313-win_amd64.pyd +0 -0
  73. scipy/_lib/pyprima/__init__.py +212 -0
  74. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  75. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  76. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  77. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  78. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  79. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  80. scipy/_lib/pyprima/cobyla/update.py +289 -0
  81. scipy/_lib/pyprima/common/__init__.py +0 -0
  82. scipy/_lib/pyprima/common/_bounds.py +34 -0
  83. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  84. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  85. scipy/_lib/pyprima/common/_project.py +173 -0
  86. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  87. scipy/_lib/pyprima/common/consts.py +47 -0
  88. scipy/_lib/pyprima/common/evaluate.py +99 -0
  89. scipy/_lib/pyprima/common/history.py +38 -0
  90. scipy/_lib/pyprima/common/infos.py +30 -0
  91. scipy/_lib/pyprima/common/linalg.py +435 -0
  92. scipy/_lib/pyprima/common/message.py +290 -0
  93. scipy/_lib/pyprima/common/powalg.py +131 -0
  94. scipy/_lib/pyprima/common/preproc.py +277 -0
  95. scipy/_lib/pyprima/common/present.py +5 -0
  96. scipy/_lib/pyprima/common/ratio.py +54 -0
  97. scipy/_lib/pyprima/common/redrho.py +47 -0
  98. scipy/_lib/pyprima/common/selectx.py +296 -0
  99. scipy/_lib/tests/test__util.py +105 -121
  100. scipy/_lib/tests/test_array_api.py +166 -35
  101. scipy/_lib/tests/test_bunch.py +7 -0
  102. scipy/_lib/tests/test_ccallback.py +2 -10
  103. scipy/_lib/tests/test_public_api.py +13 -0
  104. scipy/cluster/_hierarchy.cp313-win_amd64.dll.a +0 -0
  105. scipy/cluster/_hierarchy.cp313-win_amd64.pyd +0 -0
  106. scipy/cluster/_optimal_leaf_ordering.cp313-win_amd64.dll.a +0 -0
  107. scipy/cluster/_optimal_leaf_ordering.cp313-win_amd64.pyd +0 -0
  108. scipy/cluster/_vq.cp313-win_amd64.dll.a +0 -0
  109. scipy/cluster/_vq.cp313-win_amd64.pyd +0 -0
  110. scipy/cluster/hierarchy.py +393 -223
  111. scipy/cluster/tests/test_hierarchy.py +273 -335
  112. scipy/cluster/tests/test_vq.py +45 -61
  113. scipy/cluster/vq.py +39 -35
  114. scipy/conftest.py +263 -157
  115. scipy/constants/_constants.py +4 -1
  116. scipy/constants/tests/test_codata.py +2 -2
  117. scipy/constants/tests/test_constants.py +11 -18
  118. scipy/datasets/_download_all.py +15 -1
  119. scipy/datasets/_fetchers.py +7 -1
  120. scipy/datasets/_utils.py +1 -1
  121. scipy/differentiate/_differentiate.py +25 -25
  122. scipy/differentiate/tests/test_differentiate.py +24 -25
  123. scipy/fft/_basic.py +20 -0
  124. scipy/fft/_helper.py +3 -34
  125. scipy/fft/_pocketfft/helper.py +29 -1
  126. scipy/fft/_pocketfft/pypocketfft.cp313-win_amd64.dll.a +0 -0
  127. scipy/fft/_pocketfft/pypocketfft.cp313-win_amd64.pyd +0 -0
  128. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  129. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  130. scipy/fft/_realtransforms.py +13 -0
  131. scipy/fft/tests/test_basic.py +27 -25
  132. scipy/fft/tests/test_fftlog.py +16 -7
  133. scipy/fft/tests/test_helper.py +18 -34
  134. scipy/fft/tests/test_real_transforms.py +8 -10
  135. scipy/fftpack/convolve.cp313-win_amd64.dll.a +0 -0
  136. scipy/fftpack/convolve.cp313-win_amd64.pyd +0 -0
  137. scipy/fftpack/tests/test_basic.py +2 -4
  138. scipy/fftpack/tests/test_real_transforms.py +8 -9
  139. scipy/integrate/_bvp.py +9 -3
  140. scipy/integrate/_cubature.py +3 -2
  141. scipy/integrate/_dop.cp313-win_amd64.dll.a +0 -0
  142. scipy/integrate/_dop.cp313-win_amd64.pyd +0 -0
  143. scipy/integrate/_lsoda.cp313-win_amd64.dll.a +0 -0
  144. scipy/integrate/_lsoda.cp313-win_amd64.pyd +0 -0
  145. scipy/integrate/_ode.py +9 -2
  146. scipy/integrate/_odepack.cp313-win_amd64.dll.a +0 -0
  147. scipy/integrate/_odepack.cp313-win_amd64.pyd +0 -0
  148. scipy/integrate/_quad_vec.py +21 -29
  149. scipy/integrate/_quadpack.cp313-win_amd64.dll.a +0 -0
  150. scipy/integrate/_quadpack.cp313-win_amd64.pyd +0 -0
  151. scipy/integrate/_quadpack_py.py +11 -7
  152. scipy/integrate/_quadrature.py +3 -3
  153. scipy/integrate/_rules/_base.py +2 -2
  154. scipy/integrate/_tanhsinh.py +48 -47
  155. scipy/integrate/_test_multivariate.cp313-win_amd64.dll.a +0 -0
  156. scipy/integrate/_test_multivariate.cp313-win_amd64.pyd +0 -0
  157. scipy/integrate/_test_odeint_banded.cp313-win_amd64.dll.a +0 -0
  158. scipy/integrate/_test_odeint_banded.cp313-win_amd64.pyd +0 -0
  159. scipy/integrate/_vode.cp313-win_amd64.dll.a +0 -0
  160. scipy/integrate/_vode.cp313-win_amd64.pyd +0 -0
  161. scipy/integrate/tests/test__quad_vec.py +0 -6
  162. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  163. scipy/integrate/tests/test_cubature.py +21 -35
  164. scipy/integrate/tests/test_quadrature.py +6 -8
  165. scipy/integrate/tests/test_tanhsinh.py +56 -48
  166. scipy/interpolate/__init__.py +70 -58
  167. scipy/interpolate/_bary_rational.py +22 -22
  168. scipy/interpolate/_bsplines.py +119 -66
  169. scipy/interpolate/_cubic.py +65 -50
  170. scipy/interpolate/_dfitpack.cp313-win_amd64.dll.a +0 -0
  171. scipy/interpolate/_dfitpack.cp313-win_amd64.pyd +0 -0
  172. scipy/interpolate/_dierckx.cp313-win_amd64.dll.a +0 -0
  173. scipy/interpolate/_dierckx.cp313-win_amd64.pyd +0 -0
  174. scipy/interpolate/_fitpack.cp313-win_amd64.dll.a +0 -0
  175. scipy/interpolate/_fitpack.cp313-win_amd64.pyd +0 -0
  176. scipy/interpolate/_fitpack2.py +9 -6
  177. scipy/interpolate/_fitpack_impl.py +32 -26
  178. scipy/interpolate/_fitpack_repro.py +23 -19
  179. scipy/interpolate/_interpnd.cp313-win_amd64.dll.a +0 -0
  180. scipy/interpolate/_interpnd.cp313-win_amd64.pyd +0 -0
  181. scipy/interpolate/_interpolate.py +30 -12
  182. scipy/interpolate/_ndbspline.py +13 -18
  183. scipy/interpolate/_ndgriddata.py +5 -8
  184. scipy/interpolate/_polyint.py +95 -31
  185. scipy/interpolate/_ppoly.cp313-win_amd64.dll.a +0 -0
  186. scipy/interpolate/_ppoly.cp313-win_amd64.pyd +0 -0
  187. scipy/interpolate/_rbf.py +2 -2
  188. scipy/interpolate/_rbfinterp.py +1 -1
  189. scipy/interpolate/_rbfinterp_pythran.cp313-win_amd64.dll.a +0 -0
  190. scipy/interpolate/_rbfinterp_pythran.cp313-win_amd64.pyd +0 -0
  191. scipy/interpolate/_rgi.py +31 -26
  192. scipy/interpolate/_rgi_cython.cp313-win_amd64.dll.a +0 -0
  193. scipy/interpolate/_rgi_cython.cp313-win_amd64.pyd +0 -0
  194. scipy/interpolate/dfitpack.py +0 -20
  195. scipy/interpolate/interpnd.py +1 -2
  196. scipy/interpolate/tests/test_bary_rational.py +2 -2
  197. scipy/interpolate/tests/test_bsplines.py +97 -1
  198. scipy/interpolate/tests/test_fitpack2.py +39 -1
  199. scipy/interpolate/tests/test_interpnd.py +32 -20
  200. scipy/interpolate/tests/test_interpolate.py +48 -4
  201. scipy/interpolate/tests/test_rgi.py +2 -1
  202. scipy/io/_fast_matrix_market/__init__.py +2 -0
  203. scipy/io/_fast_matrix_market/_fmm_core.cp313-win_amd64.dll.a +0 -0
  204. scipy/io/_fast_matrix_market/_fmm_core.cp313-win_amd64.pyd +0 -0
  205. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  206. scipy/io/_harwell_boeing/hb.py +7 -11
  207. scipy/io/_idl.py +5 -7
  208. scipy/io/_netcdf.py +15 -5
  209. scipy/io/_test_fortran.cp313-win_amd64.dll.a +0 -0
  210. scipy/io/_test_fortran.cp313-win_amd64.pyd +0 -0
  211. scipy/io/arff/tests/test_arffread.py +3 -3
  212. scipy/io/matlab/__init__.py +5 -3
  213. scipy/io/matlab/_mio.py +4 -1
  214. scipy/io/matlab/_mio5.py +19 -13
  215. scipy/io/matlab/_mio5_utils.cp313-win_amd64.dll.a +0 -0
  216. scipy/io/matlab/_mio5_utils.cp313-win_amd64.pyd +0 -0
  217. scipy/io/matlab/_mio_utils.cp313-win_amd64.dll.a +0 -0
  218. scipy/io/matlab/_mio_utils.cp313-win_amd64.pyd +0 -0
  219. scipy/io/matlab/_miobase.py +4 -1
  220. scipy/io/matlab/_streams.cp313-win_amd64.dll.a +0 -0
  221. scipy/io/matlab/_streams.cp313-win_amd64.pyd +0 -0
  222. scipy/io/matlab/tests/test_mio.py +46 -18
  223. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  224. scipy/io/tests/test_mmio.py +7 -1
  225. scipy/io/tests/test_wavfile.py +41 -0
  226. scipy/io/wavfile.py +57 -10
  227. scipy/linalg/_basic.py +113 -86
  228. scipy/linalg/_cythonized_array_utils.cp313-win_amd64.dll.a +0 -0
  229. scipy/linalg/_cythonized_array_utils.cp313-win_amd64.pyd +0 -0
  230. scipy/linalg/_decomp.py +22 -9
  231. scipy/linalg/_decomp_cholesky.py +28 -13
  232. scipy/linalg/_decomp_cossin.py +45 -30
  233. scipy/linalg/_decomp_interpolative.cp313-win_amd64.dll.a +0 -0
  234. scipy/linalg/_decomp_interpolative.cp313-win_amd64.pyd +0 -0
  235. scipy/linalg/_decomp_ldl.py +4 -1
  236. scipy/linalg/_decomp_lu.py +18 -6
  237. scipy/linalg/_decomp_lu_cython.cp313-win_amd64.dll.a +0 -0
  238. scipy/linalg/_decomp_lu_cython.cp313-win_amd64.pyd +0 -0
  239. scipy/linalg/_decomp_polar.py +2 -0
  240. scipy/linalg/_decomp_qr.py +6 -2
  241. scipy/linalg/_decomp_qz.py +3 -0
  242. scipy/linalg/_decomp_schur.py +3 -1
  243. scipy/linalg/_decomp_svd.py +13 -2
  244. scipy/linalg/_decomp_update.cp313-win_amd64.dll.a +0 -0
  245. scipy/linalg/_decomp_update.cp313-win_amd64.pyd +0 -0
  246. scipy/linalg/_expm_frechet.py +4 -0
  247. scipy/linalg/_fblas.cp313-win_amd64.dll.a +0 -0
  248. scipy/linalg/_fblas.cp313-win_amd64.pyd +0 -0
  249. scipy/linalg/_flapack.cp313-win_amd64.dll.a +0 -0
  250. scipy/linalg/_flapack.cp313-win_amd64.pyd +0 -0
  251. scipy/linalg/_linalg_pythran.cp313-win_amd64.dll.a +0 -0
  252. scipy/linalg/_linalg_pythran.cp313-win_amd64.pyd +0 -0
  253. scipy/linalg/_matfuncs.py +187 -4
  254. scipy/linalg/_matfuncs_expm.cp313-win_amd64.dll.a +0 -0
  255. scipy/linalg/_matfuncs_expm.cp313-win_amd64.pyd +0 -0
  256. scipy/linalg/_matfuncs_schur_sqrtm.cp313-win_amd64.dll.a +0 -0
  257. scipy/linalg/_matfuncs_schur_sqrtm.cp313-win_amd64.pyd +0 -0
  258. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  259. scipy/linalg/_matfuncs_sqrtm_triu.cp313-win_amd64.dll.a +0 -0
  260. scipy/linalg/_matfuncs_sqrtm_triu.cp313-win_amd64.pyd +0 -0
  261. scipy/linalg/_procrustes.py +2 -0
  262. scipy/linalg/_sketches.py +17 -6
  263. scipy/linalg/_solve_toeplitz.cp313-win_amd64.dll.a +0 -0
  264. scipy/linalg/_solve_toeplitz.cp313-win_amd64.pyd +0 -0
  265. scipy/linalg/_solvers.py +7 -2
  266. scipy/linalg/_special_matrices.py +26 -36
  267. scipy/linalg/cython_blas.cp313-win_amd64.dll.a +0 -0
  268. scipy/linalg/cython_blas.cp313-win_amd64.pyd +0 -0
  269. scipy/linalg/cython_lapack.cp313-win_amd64.dll.a +0 -0
  270. scipy/linalg/cython_lapack.cp313-win_amd64.pyd +0 -0
  271. scipy/linalg/lapack.py +22 -2
  272. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  273. scipy/linalg/tests/test_basic.py +31 -16
  274. scipy/linalg/tests/test_batch.py +588 -0
  275. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  276. scipy/linalg/tests/test_decomp.py +40 -3
  277. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  278. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  279. scipy/linalg/tests/test_lapack.py +115 -7
  280. scipy/linalg/tests/test_matfuncs.py +157 -102
  281. scipy/linalg/tests/test_procrustes.py +0 -7
  282. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  283. scipy/linalg/tests/test_special_matrices.py +1 -5
  284. scipy/ndimage/__init__.py +1 -0
  285. scipy/ndimage/_ctest.cp313-win_amd64.dll.a +0 -0
  286. scipy/ndimage/_ctest.cp313-win_amd64.pyd +0 -0
  287. scipy/ndimage/_cytest.cp313-win_amd64.dll.a +0 -0
  288. scipy/ndimage/_cytest.cp313-win_amd64.pyd +0 -0
  289. scipy/ndimage/_delegators.py +8 -2
  290. scipy/ndimage/_filters.py +453 -5
  291. scipy/ndimage/_interpolation.py +36 -6
  292. scipy/ndimage/_measurements.py +4 -2
  293. scipy/ndimage/_morphology.py +5 -0
  294. scipy/ndimage/_nd_image.cp313-win_amd64.dll.a +0 -0
  295. scipy/ndimage/_nd_image.cp313-win_amd64.pyd +0 -0
  296. scipy/ndimage/_ni_docstrings.py +5 -1
  297. scipy/ndimage/_ni_label.cp313-win_amd64.dll.a +0 -0
  298. scipy/ndimage/_ni_label.cp313-win_amd64.pyd +0 -0
  299. scipy/ndimage/_ni_support.py +1 -5
  300. scipy/ndimage/_rank_filter_1d.cp313-win_amd64.dll.a +0 -0
  301. scipy/ndimage/_rank_filter_1d.cp313-win_amd64.pyd +0 -0
  302. scipy/ndimage/_support_alternative_backends.py +18 -6
  303. scipy/ndimage/tests/test_filters.py +370 -259
  304. scipy/ndimage/tests/test_fourier.py +7 -9
  305. scipy/ndimage/tests/test_interpolation.py +68 -61
  306. scipy/ndimage/tests/test_measurements.py +18 -35
  307. scipy/ndimage/tests/test_morphology.py +143 -131
  308. scipy/ndimage/tests/test_splines.py +1 -3
  309. scipy/odr/__odrpack.cp313-win_amd64.dll.a +0 -0
  310. scipy/odr/__odrpack.cp313-win_amd64.pyd +0 -0
  311. scipy/optimize/_basinhopping.py +13 -7
  312. scipy/optimize/_bglu_dense.cp313-win_amd64.dll.a +0 -0
  313. scipy/optimize/_bglu_dense.cp313-win_amd64.pyd +0 -0
  314. scipy/optimize/_bracket.py +17 -24
  315. scipy/optimize/_chandrupatla.py +9 -10
  316. scipy/optimize/_cobyla_py.py +104 -123
  317. scipy/optimize/_constraints.py +14 -10
  318. scipy/optimize/_differentiable_functions.py +371 -230
  319. scipy/optimize/_differentialevolution.py +4 -3
  320. scipy/optimize/_direct.cp313-win_amd64.dll.a +0 -0
  321. scipy/optimize/_direct.cp313-win_amd64.pyd +0 -0
  322. scipy/optimize/_dual_annealing.py +1 -1
  323. scipy/optimize/_elementwise.py +1 -4
  324. scipy/optimize/_group_columns.cp313-win_amd64.dll.a +0 -0
  325. scipy/optimize/_group_columns.cp313-win_amd64.pyd +0 -0
  326. scipy/optimize/_highspy/_core.cp313-win_amd64.dll.a +0 -0
  327. scipy/optimize/_highspy/_core.cp313-win_amd64.pyd +0 -0
  328. scipy/optimize/_highspy/_highs_options.cp313-win_amd64.dll.a +0 -0
  329. scipy/optimize/_highspy/_highs_options.cp313-win_amd64.pyd +0 -0
  330. scipy/optimize/_lbfgsb.cp313-win_amd64.dll.a +0 -0
  331. scipy/optimize/_lbfgsb.cp313-win_amd64.pyd +0 -0
  332. scipy/optimize/_lbfgsb_py.py +57 -16
  333. scipy/optimize/_linprog_doc.py +2 -2
  334. scipy/optimize/_linprog_highs.py +2 -2
  335. scipy/optimize/_linprog_ip.py +25 -10
  336. scipy/optimize/_linprog_util.py +14 -16
  337. scipy/optimize/_lsap.cp313-win_amd64.dll.a +0 -0
  338. scipy/optimize/_lsap.cp313-win_amd64.pyd +0 -0
  339. scipy/optimize/_lsq/common.py +3 -3
  340. scipy/optimize/_lsq/dogbox.py +16 -2
  341. scipy/optimize/_lsq/givens_elimination.cp313-win_amd64.dll.a +0 -0
  342. scipy/optimize/_lsq/givens_elimination.cp313-win_amd64.pyd +0 -0
  343. scipy/optimize/_lsq/least_squares.py +198 -126
  344. scipy/optimize/_lsq/lsq_linear.py +6 -6
  345. scipy/optimize/_lsq/trf.py +35 -8
  346. scipy/optimize/_milp.py +3 -1
  347. scipy/optimize/_minimize.py +105 -36
  348. scipy/optimize/_minpack.cp313-win_amd64.dll.a +0 -0
  349. scipy/optimize/_minpack.cp313-win_amd64.pyd +0 -0
  350. scipy/optimize/_minpack_py.py +21 -14
  351. scipy/optimize/_moduleTNC.cp313-win_amd64.dll.a +0 -0
  352. scipy/optimize/_moduleTNC.cp313-win_amd64.pyd +0 -0
  353. scipy/optimize/_nnls.py +20 -21
  354. scipy/optimize/_nonlin.py +34 -3
  355. scipy/optimize/_numdiff.py +288 -110
  356. scipy/optimize/_optimize.py +86 -48
  357. scipy/optimize/_pava_pybind.cp313-win_amd64.dll.a +0 -0
  358. scipy/optimize/_pava_pybind.cp313-win_amd64.pyd +0 -0
  359. scipy/optimize/_remove_redundancy.py +5 -5
  360. scipy/optimize/_root_scalar.py +1 -1
  361. scipy/optimize/_shgo.py +6 -0
  362. scipy/optimize/_shgo_lib/_complex.py +1 -1
  363. scipy/optimize/_slsqp_py.py +216 -124
  364. scipy/optimize/_slsqplib.cp313-win_amd64.dll.a +0 -0
  365. scipy/optimize/_slsqplib.cp313-win_amd64.pyd +0 -0
  366. scipy/optimize/_spectral.py +1 -1
  367. scipy/optimize/_tnc.py +8 -1
  368. scipy/optimize/_trlib/_trlib.cp313-win_amd64.dll.a +0 -0
  369. scipy/optimize/_trlib/_trlib.cp313-win_amd64.pyd +0 -0
  370. scipy/optimize/_trustregion.py +20 -6
  371. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  372. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  373. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  374. scipy/optimize/_trustregion_constr/projections.py +12 -8
  375. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  376. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  377. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  378. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  379. scipy/optimize/_trustregion_exact.py +0 -1
  380. scipy/optimize/_zeros.cp313-win_amd64.dll.a +0 -0
  381. scipy/optimize/_zeros.cp313-win_amd64.pyd +0 -0
  382. scipy/optimize/_zeros_py.py +97 -17
  383. scipy/optimize/cython_optimize/_zeros.cp313-win_amd64.dll.a +0 -0
  384. scipy/optimize/cython_optimize/_zeros.cp313-win_amd64.pyd +0 -0
  385. scipy/optimize/slsqp.py +0 -1
  386. scipy/optimize/tests/test__basinhopping.py +1 -1
  387. scipy/optimize/tests/test__differential_evolution.py +4 -4
  388. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  389. scipy/optimize/tests/test__numdiff.py +66 -22
  390. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  391. scipy/optimize/tests/test__shgo.py +9 -1
  392. scipy/optimize/tests/test_bracket.py +36 -46
  393. scipy/optimize/tests/test_chandrupatla.py +133 -135
  394. scipy/optimize/tests/test_cobyla.py +74 -45
  395. scipy/optimize/tests/test_constraints.py +1 -1
  396. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  397. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  398. scipy/optimize/tests/test_least_squares.py +125 -13
  399. scipy/optimize/tests/test_linear_assignment.py +3 -3
  400. scipy/optimize/tests/test_linprog.py +3 -3
  401. scipy/optimize/tests/test_lsq_linear.py +6 -6
  402. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  403. scipy/optimize/tests/test_minpack.py +4 -4
  404. scipy/optimize/tests/test_nnls.py +43 -3
  405. scipy/optimize/tests/test_nonlin.py +36 -0
  406. scipy/optimize/tests/test_optimize.py +95 -17
  407. scipy/optimize/tests/test_slsqp.py +36 -4
  408. scipy/optimize/tests/test_zeros.py +34 -1
  409. scipy/signal/__init__.py +12 -23
  410. scipy/signal/_delegators.py +568 -0
  411. scipy/signal/_filter_design.py +459 -241
  412. scipy/signal/_fir_filter_design.py +262 -90
  413. scipy/signal/_lti_conversion.py +3 -2
  414. scipy/signal/_ltisys.py +118 -91
  415. scipy/signal/_max_len_seq_inner.cp313-win_amd64.dll.a +0 -0
  416. scipy/signal/_max_len_seq_inner.cp313-win_amd64.pyd +0 -0
  417. scipy/signal/_peak_finding_utils.cp313-win_amd64.dll.a +0 -0
  418. scipy/signal/_peak_finding_utils.cp313-win_amd64.pyd +0 -0
  419. scipy/signal/_polyutils.py +172 -0
  420. scipy/signal/_short_time_fft.py +519 -70
  421. scipy/signal/_signal_api.py +30 -0
  422. scipy/signal/_signaltools.py +719 -399
  423. scipy/signal/_sigtools.cp313-win_amd64.dll.a +0 -0
  424. scipy/signal/_sigtools.cp313-win_amd64.pyd +0 -0
  425. scipy/signal/_sosfilt.cp313-win_amd64.dll.a +0 -0
  426. scipy/signal/_sosfilt.cp313-win_amd64.pyd +0 -0
  427. scipy/signal/_spectral_py.py +230 -50
  428. scipy/signal/_spline.cp313-win_amd64.dll.a +0 -0
  429. scipy/signal/_spline.cp313-win_amd64.pyd +0 -0
  430. scipy/signal/_spline_filters.py +108 -68
  431. scipy/signal/_support_alternative_backends.py +73 -0
  432. scipy/signal/_upfirdn.py +4 -1
  433. scipy/signal/_upfirdn_apply.cp313-win_amd64.dll.a +0 -0
  434. scipy/signal/_upfirdn_apply.cp313-win_amd64.pyd +0 -0
  435. scipy/signal/_waveforms.py +2 -11
  436. scipy/signal/_wavelets.py +1 -1
  437. scipy/signal/fir_filter_design.py +1 -0
  438. scipy/signal/spline.py +4 -11
  439. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  440. scipy/signal/tests/test_bsplines.py +114 -79
  441. scipy/signal/tests/test_cont2discrete.py +9 -2
  442. scipy/signal/tests/test_filter_design.py +721 -481
  443. scipy/signal/tests/test_fir_filter_design.py +332 -140
  444. scipy/signal/tests/test_savitzky_golay.py +4 -3
  445. scipy/signal/tests/test_short_time_fft.py +221 -3
  446. scipy/signal/tests/test_signaltools.py +2144 -1348
  447. scipy/signal/tests/test_spectral.py +50 -6
  448. scipy/signal/tests/test_splines.py +161 -96
  449. scipy/signal/tests/test_upfirdn.py +84 -50
  450. scipy/signal/tests/test_waveforms.py +20 -0
  451. scipy/signal/tests/test_windows.py +607 -466
  452. scipy/signal/windows/_windows.py +287 -148
  453. scipy/sparse/__init__.py +23 -4
  454. scipy/sparse/_base.py +270 -108
  455. scipy/sparse/_bsr.py +7 -4
  456. scipy/sparse/_compressed.py +59 -231
  457. scipy/sparse/_construct.py +90 -38
  458. scipy/sparse/_coo.py +115 -181
  459. scipy/sparse/_csc.py +4 -4
  460. scipy/sparse/_csparsetools.cp313-win_amd64.dll.a +0 -0
  461. scipy/sparse/_csparsetools.cp313-win_amd64.pyd +0 -0
  462. scipy/sparse/_csr.py +2 -2
  463. scipy/sparse/_data.py +48 -48
  464. scipy/sparse/_dia.py +105 -18
  465. scipy/sparse/_dok.py +0 -23
  466. scipy/sparse/_index.py +4 -4
  467. scipy/sparse/_matrix.py +23 -0
  468. scipy/sparse/_sparsetools.cp313-win_amd64.dll.a +0 -0
  469. scipy/sparse/_sparsetools.cp313-win_amd64.pyd +0 -0
  470. scipy/sparse/_sputils.py +37 -22
  471. scipy/sparse/base.py +0 -9
  472. scipy/sparse/bsr.py +0 -14
  473. scipy/sparse/compressed.py +0 -23
  474. scipy/sparse/construct.py +0 -6
  475. scipy/sparse/coo.py +0 -14
  476. scipy/sparse/csc.py +0 -3
  477. scipy/sparse/csgraph/_flow.cp313-win_amd64.dll.a +0 -0
  478. scipy/sparse/csgraph/_flow.cp313-win_amd64.pyd +0 -0
  479. scipy/sparse/csgraph/_matching.cp313-win_amd64.dll.a +0 -0
  480. scipy/sparse/csgraph/_matching.cp313-win_amd64.pyd +0 -0
  481. scipy/sparse/csgraph/_min_spanning_tree.cp313-win_amd64.dll.a +0 -0
  482. scipy/sparse/csgraph/_min_spanning_tree.cp313-win_amd64.pyd +0 -0
  483. scipy/sparse/csgraph/_reordering.cp313-win_amd64.dll.a +0 -0
  484. scipy/sparse/csgraph/_reordering.cp313-win_amd64.pyd +0 -0
  485. scipy/sparse/csgraph/_shortest_path.cp313-win_amd64.dll.a +0 -0
  486. scipy/sparse/csgraph/_shortest_path.cp313-win_amd64.pyd +0 -0
  487. scipy/sparse/csgraph/_tools.cp313-win_amd64.dll.a +0 -0
  488. scipy/sparse/csgraph/_tools.cp313-win_amd64.pyd +0 -0
  489. scipy/sparse/csgraph/_traversal.cp313-win_amd64.dll.a +0 -0
  490. scipy/sparse/csgraph/_traversal.cp313-win_amd64.pyd +0 -0
  491. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  492. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  493. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  494. scipy/sparse/csr.py +0 -5
  495. scipy/sparse/data.py +1 -6
  496. scipy/sparse/dia.py +0 -7
  497. scipy/sparse/dok.py +0 -10
  498. scipy/sparse/linalg/_dsolve/_superlu.cp313-win_amd64.dll.a +0 -0
  499. scipy/sparse/linalg/_dsolve/_superlu.cp313-win_amd64.pyd +0 -0
  500. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  501. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  502. scipy/sparse/linalg/_eigen/arpack/_arpack.cp313-win_amd64.dll.a +0 -0
  503. scipy/sparse/linalg/_eigen/arpack/_arpack.cp313-win_amd64.pyd +0 -0
  504. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  505. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  506. scipy/sparse/linalg/_interface.py +17 -18
  507. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  508. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  509. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  510. scipy/sparse/linalg/_isolve/minres.py +5 -5
  511. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  512. scipy/sparse/linalg/_isolve/utils.py +2 -8
  513. scipy/sparse/linalg/_matfuncs.py +1 -1
  514. scipy/sparse/linalg/_norm.py +1 -1
  515. scipy/sparse/linalg/_propack/_cpropack.cp313-win_amd64.dll.a +0 -0
  516. scipy/sparse/linalg/_propack/_cpropack.cp313-win_amd64.pyd +0 -0
  517. scipy/sparse/linalg/_propack/_dpropack.cp313-win_amd64.dll.a +0 -0
  518. scipy/sparse/linalg/_propack/_dpropack.cp313-win_amd64.pyd +0 -0
  519. scipy/sparse/linalg/_propack/_spropack.cp313-win_amd64.dll.a +0 -0
  520. scipy/sparse/linalg/_propack/_spropack.cp313-win_amd64.pyd +0 -0
  521. scipy/sparse/linalg/_propack/_zpropack.cp313-win_amd64.dll.a +0 -0
  522. scipy/sparse/linalg/_propack/_zpropack.cp313-win_amd64.pyd +0 -0
  523. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  524. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  525. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  526. scipy/sparse/tests/test_base.py +214 -42
  527. scipy/sparse/tests/test_common1d.py +7 -7
  528. scipy/sparse/tests/test_construct.py +1 -1
  529. scipy/sparse/tests/test_coo.py +272 -4
  530. scipy/sparse/tests/test_sparsetools.py +5 -0
  531. scipy/sparse/tests/test_sputils.py +36 -7
  532. scipy/spatial/_ckdtree.cp313-win_amd64.dll.a +0 -0
  533. scipy/spatial/_ckdtree.cp313-win_amd64.pyd +0 -0
  534. scipy/spatial/_distance_pybind.cp313-win_amd64.dll.a +0 -0
  535. scipy/spatial/_distance_pybind.cp313-win_amd64.pyd +0 -0
  536. scipy/spatial/_distance_wrap.cp313-win_amd64.dll.a +0 -0
  537. scipy/spatial/_distance_wrap.cp313-win_amd64.pyd +0 -0
  538. scipy/spatial/_hausdorff.cp313-win_amd64.dll.a +0 -0
  539. scipy/spatial/_hausdorff.cp313-win_amd64.pyd +0 -0
  540. scipy/spatial/_qhull.cp313-win_amd64.dll.a +0 -0
  541. scipy/spatial/_qhull.cp313-win_amd64.pyd +0 -0
  542. scipy/spatial/_voronoi.cp313-win_amd64.dll.a +0 -0
  543. scipy/spatial/_voronoi.cp313-win_amd64.pyd +0 -0
  544. scipy/spatial/distance.py +49 -42
  545. scipy/spatial/tests/test_distance.py +15 -1
  546. scipy/spatial/tests/test_kdtree.py +1 -0
  547. scipy/spatial/tests/test_qhull.py +7 -2
  548. scipy/spatial/transform/__init__.py +5 -3
  549. scipy/spatial/transform/_rigid_transform.cp313-win_amd64.dll.a +0 -0
  550. scipy/spatial/transform/_rigid_transform.cp313-win_amd64.pyd +0 -0
  551. scipy/spatial/transform/_rotation.cp313-win_amd64.dll.a +0 -0
  552. scipy/spatial/transform/_rotation.cp313-win_amd64.pyd +0 -0
  553. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  554. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  555. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  556. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  557. scipy/special/__init__.py +1 -47
  558. scipy/special/_add_newdocs.py +34 -772
  559. scipy/special/_basic.py +22 -25
  560. scipy/special/_comb.cp313-win_amd64.dll.a +0 -0
  561. scipy/special/_comb.cp313-win_amd64.pyd +0 -0
  562. scipy/special/_ellip_harm_2.cp313-win_amd64.dll.a +0 -0
  563. scipy/special/_ellip_harm_2.cp313-win_amd64.pyd +0 -0
  564. scipy/special/_gufuncs.cp313-win_amd64.dll.a +0 -0
  565. scipy/special/_gufuncs.cp313-win_amd64.pyd +0 -0
  566. scipy/special/_logsumexp.py +67 -58
  567. scipy/special/_orthogonal.pyi +1 -1
  568. scipy/special/_specfun.cp313-win_amd64.dll.a +0 -0
  569. scipy/special/_specfun.cp313-win_amd64.pyd +0 -0
  570. scipy/special/_special_ufuncs.cp313-win_amd64.dll.a +0 -0
  571. scipy/special/_special_ufuncs.cp313-win_amd64.pyd +0 -0
  572. scipy/special/_spherical_bessel.py +4 -4
  573. scipy/special/_support_alternative_backends.py +212 -119
  574. scipy/special/_test_internal.cp313-win_amd64.dll.a +0 -0
  575. scipy/special/_test_internal.cp313-win_amd64.pyd +0 -0
  576. scipy/special/_testutils.py +4 -4
  577. scipy/special/_ufuncs.cp313-win_amd64.dll.a +0 -0
  578. scipy/special/_ufuncs.cp313-win_amd64.pyd +0 -0
  579. scipy/special/_ufuncs.pyi +1 -0
  580. scipy/special/_ufuncs.pyx +215 -1400
  581. scipy/special/_ufuncs_cxx.cp313-win_amd64.dll.a +0 -0
  582. scipy/special/_ufuncs_cxx.cp313-win_amd64.pyd +0 -0
  583. scipy/special/_ufuncs_cxx.pxd +2 -15
  584. scipy/special/_ufuncs_cxx.pyx +5 -44
  585. scipy/special/_ufuncs_cxx_defs.h +2 -16
  586. scipy/special/_ufuncs_defs.h +0 -8
  587. scipy/special/cython_special.cp313-win_amd64.dll.a +0 -0
  588. scipy/special/cython_special.cp313-win_amd64.pyd +0 -0
  589. scipy/special/cython_special.pxd +1 -1
  590. scipy/special/tests/_cython_examples/meson.build +10 -1
  591. scipy/special/tests/test_basic.py +153 -20
  592. scipy/special/tests/test_boost_ufuncs.py +3 -0
  593. scipy/special/tests/test_cdflib.py +35 -11
  594. scipy/special/tests/test_gammainc.py +16 -0
  595. scipy/special/tests/test_hyp2f1.py +2 -2
  596. scipy/special/tests/test_log1mexp.py +85 -0
  597. scipy/special/tests/test_logsumexp.py +206 -64
  598. scipy/special/tests/test_mpmath.py +1 -0
  599. scipy/special/tests/test_nan_inputs.py +1 -1
  600. scipy/special/tests/test_orthogonal.py +17 -18
  601. scipy/special/tests/test_sf_error.py +3 -2
  602. scipy/special/tests/test_sph_harm.py +6 -7
  603. scipy/special/tests/test_support_alternative_backends.py +211 -76
  604. scipy/stats/__init__.py +4 -1
  605. scipy/stats/_ansari_swilk_statistics.cp313-win_amd64.dll.a +0 -0
  606. scipy/stats/_ansari_swilk_statistics.cp313-win_amd64.pyd +0 -0
  607. scipy/stats/_axis_nan_policy.py +5 -12
  608. scipy/stats/_biasedurn.cp313-win_amd64.dll.a +0 -0
  609. scipy/stats/_biasedurn.cp313-win_amd64.pyd +0 -0
  610. scipy/stats/_continued_fraction.py +387 -0
  611. scipy/stats/_continuous_distns.py +277 -310
  612. scipy/stats/_correlation.py +1 -1
  613. scipy/stats/_covariance.py +6 -3
  614. scipy/stats/_discrete_distns.py +39 -32
  615. scipy/stats/_distn_infrastructure.py +39 -12
  616. scipy/stats/_distribution_infrastructure.py +900 -238
  617. scipy/stats/_entropy.py +9 -10
  618. scipy/{_lib → stats}/_finite_differences.py +1 -1
  619. scipy/stats/_hypotests.py +83 -50
  620. scipy/stats/_kde.py +53 -49
  621. scipy/stats/_ksstats.py +1 -1
  622. scipy/stats/_levy_stable/__init__.py +7 -15
  623. scipy/stats/_levy_stable/levyst.cp313-win_amd64.dll.a +0 -0
  624. scipy/stats/_levy_stable/levyst.cp313-win_amd64.pyd +0 -0
  625. scipy/stats/_morestats.py +118 -73
  626. scipy/stats/_mstats_basic.py +13 -17
  627. scipy/stats/_mstats_extras.py +8 -8
  628. scipy/stats/_multivariate.py +89 -113
  629. scipy/stats/_new_distributions.py +97 -20
  630. scipy/stats/_page_trend_test.py +12 -5
  631. scipy/stats/_probability_distribution.py +265 -43
  632. scipy/stats/_qmc.py +14 -9
  633. scipy/stats/_qmc_cy.cp313-win_amd64.dll.a +0 -0
  634. scipy/stats/_qmc_cy.cp313-win_amd64.pyd +0 -0
  635. scipy/stats/_qmvnt.py +16 -95
  636. scipy/stats/_qmvnt_cy.cp313-win_amd64.dll.a +0 -0
  637. scipy/stats/_qmvnt_cy.cp313-win_amd64.pyd +0 -0
  638. scipy/stats/_quantile.py +335 -0
  639. scipy/stats/_rcont/rcont.cp313-win_amd64.dll.a +0 -0
  640. scipy/stats/_rcont/rcont.cp313-win_amd64.pyd +0 -0
  641. scipy/stats/_resampling.py +4 -29
  642. scipy/stats/_sampling.py +1 -1
  643. scipy/stats/_sobol.cp313-win_amd64.dll.a +0 -0
  644. scipy/stats/_sobol.cp313-win_amd64.pyd +0 -0
  645. scipy/stats/_stats.cp313-win_amd64.dll.a +0 -0
  646. scipy/stats/_stats.cp313-win_amd64.pyd +0 -0
  647. scipy/stats/_stats_mstats_common.py +21 -2
  648. scipy/stats/_stats_py.py +550 -476
  649. scipy/stats/_stats_pythran.cp313-win_amd64.dll.a +0 -0
  650. scipy/stats/_stats_pythran.cp313-win_amd64.pyd +0 -0
  651. scipy/stats/_unuran/unuran_wrapper.cp313-win_amd64.dll.a +0 -0
  652. scipy/stats/_unuran/unuran_wrapper.cp313-win_amd64.pyd +0 -0
  653. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  654. scipy/stats/_variation.py +6 -8
  655. scipy/stats/_wilcoxon.py +13 -7
  656. scipy/stats/tests/common_tests.py +6 -4
  657. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  658. scipy/stats/tests/test_continued_fraction.py +173 -0
  659. scipy/stats/tests/test_continuous.py +379 -60
  660. scipy/stats/tests/test_continuous_basic.py +18 -12
  661. scipy/stats/tests/test_discrete_basic.py +14 -8
  662. scipy/stats/tests/test_discrete_distns.py +16 -16
  663. scipy/stats/tests/test_distributions.py +95 -75
  664. scipy/stats/tests/test_entropy.py +40 -48
  665. scipy/stats/tests/test_fit.py +4 -3
  666. scipy/stats/tests/test_hypotests.py +153 -24
  667. scipy/stats/tests/test_kdeoth.py +109 -41
  668. scipy/stats/tests/test_marray.py +289 -0
  669. scipy/stats/tests/test_morestats.py +79 -47
  670. scipy/stats/tests/test_mstats_basic.py +3 -3
  671. scipy/stats/tests/test_multivariate.py +434 -83
  672. scipy/stats/tests/test_qmc.py +13 -10
  673. scipy/stats/tests/test_quantile.py +199 -0
  674. scipy/stats/tests/test_rank.py +119 -112
  675. scipy/stats/tests/test_resampling.py +47 -56
  676. scipy/stats/tests/test_sampling.py +9 -4
  677. scipy/stats/tests/test_stats.py +799 -939
  678. scipy/stats/tests/test_variation.py +8 -6
  679. scipy/version.py +2 -2
  680. scipy-1.16.0rc2.dist-info/DELVEWHEEL +2 -0
  681. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  682. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  683. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +685 -693
  684. scipy/_lib/array_api_extra/_funcs.py +0 -484
  685. scipy/_lib/array_api_extra/_typing.py +0 -8
  686. scipy/interpolate/_bspl.cp313-win_amd64.dll.a +0 -0
  687. scipy/interpolate/_bspl.cp313-win_amd64.pyd +0 -0
  688. scipy/optimize/_cobyla.cp313-win_amd64.dll.a +0 -0
  689. scipy/optimize/_cobyla.cp313-win_amd64.pyd +0 -0
  690. scipy/optimize/_cython_nnls.cp313-win_amd64.dll.a +0 -0
  691. scipy/optimize/_cython_nnls.cp313-win_amd64.pyd +0 -0
  692. scipy/optimize/_slsqp.cp313-win_amd64.dll.a +0 -0
  693. scipy/optimize/_slsqp.cp313-win_amd64.pyd +0 -0
  694. scipy/spatial/qhull_src/COPYING.txt +0 -38
  695. scipy/special/libsf_error_state.dll +0 -0
  696. scipy/special/libsf_error_state.dll.a +0 -0
  697. scipy/special/tests/test_log_softmax.py +0 -109
  698. scipy/special/tests/test_xsf_cuda.py +0 -114
  699. scipy/special/xsf/binom.h +0 -89
  700. scipy/special/xsf/cdflib.h +0 -100
  701. scipy/special/xsf/cephes/airy.h +0 -307
  702. scipy/special/xsf/cephes/besselpoly.h +0 -51
  703. scipy/special/xsf/cephes/beta.h +0 -257
  704. scipy/special/xsf/cephes/cbrt.h +0 -131
  705. scipy/special/xsf/cephes/chbevl.h +0 -85
  706. scipy/special/xsf/cephes/chdtr.h +0 -193
  707. scipy/special/xsf/cephes/const.h +0 -87
  708. scipy/special/xsf/cephes/ellie.h +0 -293
  709. scipy/special/xsf/cephes/ellik.h +0 -251
  710. scipy/special/xsf/cephes/ellpe.h +0 -107
  711. scipy/special/xsf/cephes/ellpk.h +0 -117
  712. scipy/special/xsf/cephes/expn.h +0 -260
  713. scipy/special/xsf/cephes/gamma.h +0 -398
  714. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  715. scipy/special/xsf/cephes/hyperg.h +0 -361
  716. scipy/special/xsf/cephes/i0.h +0 -149
  717. scipy/special/xsf/cephes/i1.h +0 -158
  718. scipy/special/xsf/cephes/igam.h +0 -421
  719. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  720. scipy/special/xsf/cephes/igami.h +0 -313
  721. scipy/special/xsf/cephes/j0.h +0 -225
  722. scipy/special/xsf/cephes/j1.h +0 -198
  723. scipy/special/xsf/cephes/jv.h +0 -715
  724. scipy/special/xsf/cephes/k0.h +0 -164
  725. scipy/special/xsf/cephes/k1.h +0 -163
  726. scipy/special/xsf/cephes/kn.h +0 -243
  727. scipy/special/xsf/cephes/lanczos.h +0 -112
  728. scipy/special/xsf/cephes/ndtr.h +0 -275
  729. scipy/special/xsf/cephes/poch.h +0 -85
  730. scipy/special/xsf/cephes/polevl.h +0 -167
  731. scipy/special/xsf/cephes/psi.h +0 -194
  732. scipy/special/xsf/cephes/rgamma.h +0 -111
  733. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  734. scipy/special/xsf/cephes/shichi.h +0 -248
  735. scipy/special/xsf/cephes/sici.h +0 -224
  736. scipy/special/xsf/cephes/sindg.h +0 -221
  737. scipy/special/xsf/cephes/tandg.h +0 -139
  738. scipy/special/xsf/cephes/trig.h +0 -58
  739. scipy/special/xsf/cephes/unity.h +0 -186
  740. scipy/special/xsf/cephes/zeta.h +0 -172
  741. scipy/special/xsf/config.h +0 -304
  742. scipy/special/xsf/digamma.h +0 -205
  743. scipy/special/xsf/error.h +0 -57
  744. scipy/special/xsf/evalpoly.h +0 -47
  745. scipy/special/xsf/expint.h +0 -266
  746. scipy/special/xsf/hyp2f1.h +0 -694
  747. scipy/special/xsf/iv_ratio.h +0 -173
  748. scipy/special/xsf/lambertw.h +0 -150
  749. scipy/special/xsf/loggamma.h +0 -163
  750. scipy/special/xsf/sici.h +0 -200
  751. scipy/special/xsf/tools.h +0 -427
  752. scipy/special/xsf/trig.h +0 -164
  753. scipy/special/xsf/wright_bessel.h +0 -843
  754. scipy/special/xsf/zlog1.h +0 -35
  755. scipy/stats/_mvn.cp313-win_amd64.dll.a +0 -0
  756. scipy/stats/_mvn.cp313-win_amd64.pyd +0 -0
  757. scipy-1.15.3.dist-info/DELVEWHEEL +0 -2
  758. /scipy-1.15.3-cp313-cp313-win_amd64.whl → /scipy-1.16.0rc2-cp313-cp313-win_amd64.whl +0 -0
  759. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
@@ -2,25 +2,26 @@ from multiprocessing import Pool
2
2
  from multiprocessing.pool import Pool as PWL
3
3
  import re
4
4
  import math
5
+ import functools
5
6
  from fractions import Fraction
6
7
 
7
8
  import numpy as np
8
9
  from numpy.testing import assert_equal, assert_
9
10
  import pytest
10
11
  from pytest import raises as assert_raises
11
- import hypothesis.extra.numpy as npst
12
- from hypothesis import given, strategies, reproduce_failure # noqa: F401
13
- from scipy.conftest import array_api_compatible, skip_xp_invalid_arg
12
+ from scipy.conftest import skip_xp_invalid_arg
14
13
 
15
- from scipy._lib._array_api import (xp_assert_equal, xp_assert_close, is_numpy,
16
- xp_copy, is_array_api_strict)
14
+ from scipy._lib._array_api import xp_assert_equal, is_numpy
17
15
  from scipy._lib._util import (_aligned_zeros, check_random_state, MapWrapper,
18
16
  getfullargspec_no_self, FullArgSpec,
19
17
  rng_integers, _validate_int, _rename_parameter,
20
- _contains_nan, _rng_html_rewrite, _lazywhere)
18
+ _contains_nan, _rng_html_rewrite, _workers_wrapper)
19
+ import scipy._lib.array_api_extra as xpx
20
+ from scipy._lib.array_api_extra.testing import lazy_xp_function
21
21
  from scipy import cluster, interpolate, linalg, optimize, sparse, spatial, stats
22
22
 
23
- skip_xp_backends = pytest.mark.skip_xp_backends
23
+
24
+ lazy_xp_function(_contains_nan)
24
25
 
25
26
 
26
27
  @pytest.mark.slow
@@ -147,6 +148,36 @@ def test_mapwrapper_parallel():
147
148
  assert_equal(list(out), out_arg)
148
149
 
149
150
 
151
+ @_workers_wrapper
152
+ def user_of_workers(x, b=1, workers=None):
153
+ assert workers is not None
154
+ assert isinstance(workers, MapWrapper)
155
+ return np.array(list(workers(np.sin, x * b)))
156
+
157
+
158
+ def test__workers_wrapper():
159
+ arr = np.linspace(0, np.pi)
160
+ req = np.sin(arr * 2.0)
161
+
162
+ with Pool(2) as p:
163
+ v = user_of_workers(arr, workers=p.map, b=2)
164
+ assert_equal(v, req)
165
+
166
+ v = user_of_workers(arr, workers=None, b=2)
167
+ assert_equal(v, req)
168
+
169
+ v = user_of_workers(arr, workers=2, b=2)
170
+ assert_equal(v, req)
171
+
172
+ # assess if decorator works with partial functions
173
+ part_f = functools.partial(user_of_workers, b=2)
174
+ assert_equal(part_f(arr), req)
175
+
176
+ with Pool(2) as p:
177
+ part_f = functools.partial(user_of_workers, b=2, workers=p.map)
178
+ assert_equal(part_f(arr), req)
179
+
180
+
150
181
  def test_rng_integers():
151
182
  rng = np.random.RandomState()
152
183
 
@@ -296,86 +327,103 @@ class TestRenameParameter:
296
327
  self.old_keyword_deprecated(new=10, old=10)
297
328
 
298
329
 
299
- class TestContainsNaNTest:
300
-
330
+ class TestContainsNaN:
301
331
  def test_policy(self):
302
332
  data = np.array([1, 2, 3, np.nan])
303
333
 
304
- contains_nan, nan_policy = _contains_nan(data, nan_policy="propagate")
305
- assert contains_nan
306
- assert nan_policy == "propagate"
307
-
308
- contains_nan, nan_policy = _contains_nan(data, nan_policy="omit")
309
- assert contains_nan
310
- assert nan_policy == "omit"
334
+ assert _contains_nan(data) # default policy is "propagate"
335
+ assert _contains_nan(data, nan_policy="propagate")
336
+ assert _contains_nan(data, nan_policy="omit")
337
+ assert not _contains_nan(data[:3])
338
+ assert not _contains_nan(data[:3], nan_policy="propagate")
339
+ assert not _contains_nan(data[:3], nan_policy="omit")
311
340
 
312
- msg = "The input contains nan values"
313
- with pytest.raises(ValueError, match=msg):
341
+ with pytest.raises(ValueError, match="The input contains nan values"):
314
342
  _contains_nan(data, nan_policy="raise")
343
+ assert not _contains_nan(data[:3], nan_policy="raise")
315
344
 
316
- msg = "nan_policy must be one of"
317
- with pytest.raises(ValueError, match=msg):
345
+ with pytest.raises(ValueError, match="nan_policy must be one of"):
318
346
  _contains_nan(data, nan_policy="nan")
319
347
 
320
348
  def test_contains_nan(self):
321
- data1 = np.array([1, 2, 3])
322
- assert not _contains_nan(data1)[0]
323
-
324
- data2 = np.array([1, 2, 3, np.nan])
325
- assert _contains_nan(data2)[0]
326
-
327
- data3 = np.array([np.nan, 2, 3, np.nan])
328
- assert _contains_nan(data3)[0]
329
-
330
- data4 = np.array([[1, 2], [3, 4]])
331
- assert not _contains_nan(data4)[0]
332
-
333
- data5 = np.array([[1, 2], [3, np.nan]])
334
- assert _contains_nan(data5)[0]
349
+ # Special case: empty array
350
+ assert not _contains_nan(np.array([], dtype=float))
351
+
352
+ # Integer arrays cannot contain NaN
353
+ assert not _contains_nan(np.array([1, 2, 3]))
354
+ assert not _contains_nan(np.array([[1, 2], [3, 4]]))
355
+
356
+ assert not _contains_nan(np.array([1., 2., 3.]))
357
+ assert not _contains_nan(np.array([1., 2.j, 3.]))
358
+ assert _contains_nan(np.array([1., 2.j, np.nan]))
359
+ assert _contains_nan(np.array([1., 2., np.nan]))
360
+ assert _contains_nan(np.array([np.nan, 2., np.nan]))
361
+ assert not _contains_nan(np.array([[1., 2.], [3., 4.]]))
362
+ assert _contains_nan(np.array([[1., 2.], [3., np.nan]]))
335
363
 
336
364
  @skip_xp_invalid_arg
337
365
  def test_contains_nan_with_strings(self):
338
366
  data1 = np.array([1, 2, "3", np.nan]) # converted to string "nan"
339
- assert not _contains_nan(data1)[0]
367
+ assert not _contains_nan(data1)
340
368
 
341
369
  data2 = np.array([1, 2, "3", np.nan], dtype='object')
342
- assert _contains_nan(data2)[0]
370
+ assert _contains_nan(data2)
343
371
 
344
372
  data3 = np.array([["1", 2], [3, np.nan]]) # converted to string "nan"
345
- assert not _contains_nan(data3)[0]
373
+ assert not _contains_nan(data3)
346
374
 
347
375
  data4 = np.array([["1", 2], [3, np.nan]], dtype='object')
348
- assert _contains_nan(data4)[0]
376
+ assert _contains_nan(data4)
349
377
 
350
- @skip_xp_backends('jax.numpy',
351
- reason="JAX arrays do not support item assignment")
352
- @pytest.mark.usefixtures("skip_xp_backends")
353
- @array_api_compatible
378
+ @pytest.mark.skip_xp_backends(eager_only=True,
379
+ reason="lazy backends tested separately")
354
380
  @pytest.mark.parametrize("nan_policy", ['propagate', 'omit', 'raise'])
355
381
  def test_array_api(self, xp, nan_policy):
356
382
  rng = np.random.default_rng(932347235892482)
357
383
  x0 = rng.random(size=(2, 3, 4))
358
384
  x = xp.asarray(x0)
359
- x_nan = xp_copy(x, xp=xp)
360
- x_nan[1, 2, 1] = np.nan
385
+ assert not _contains_nan(x, nan_policy)
361
386
 
362
- contains_nan, nan_policy_out = _contains_nan(x, nan_policy=nan_policy)
363
- assert not contains_nan
364
- assert nan_policy_out == nan_policy
387
+ x = xpx.at(x)[1, 2, 1].set(np.nan)
365
388
 
366
389
  if nan_policy == 'raise':
367
- message = 'The input contains...'
368
- with pytest.raises(ValueError, match=message):
369
- _contains_nan(x_nan, nan_policy=nan_policy)
390
+ with pytest.raises(ValueError, match="The input contains nan values"):
391
+ _contains_nan(x, nan_policy)
370
392
  elif nan_policy == 'omit' and not is_numpy(xp):
371
- message = "`nan_policy='omit' is incompatible..."
372
- with pytest.raises(ValueError, match=message):
373
- _contains_nan(x_nan, nan_policy=nan_policy)
393
+ with pytest.raises(ValueError, match="nan_policy='omit' is incompatible"):
394
+ _contains_nan(x, nan_policy)
395
+ assert _contains_nan(x, nan_policy, xp_omit_okay=True)
374
396
  elif nan_policy == 'propagate':
375
- contains_nan, nan_policy_out = _contains_nan(
376
- x_nan, nan_policy=nan_policy)
377
- assert contains_nan
378
- assert nan_policy_out == nan_policy
397
+ assert _contains_nan(x, nan_policy)
398
+
399
+ @pytest.mark.skip_xp_backends("numpy", reason="lazy backends only")
400
+ @pytest.mark.skip_xp_backends("cupy", reason="lazy backends only")
401
+ @pytest.mark.skip_xp_backends("array_api_strict", reason="lazy backends only")
402
+ @pytest.mark.skip_xp_backends("torch", reason="lazy backends only")
403
+ def test_array_api_lazy(self, xp):
404
+ rng = np.random.default_rng(932347235892482)
405
+ x0 = rng.random(size=(2, 3, 4))
406
+ x = xp.asarray(x0)
407
+
408
+ xp_assert_equal(_contains_nan(x), xp.asarray(False))
409
+ xp_assert_equal(_contains_nan(x, "propagate"), xp.asarray(False))
410
+ xp_assert_equal(_contains_nan(x, "omit", xp_omit_okay=True), xp.asarray(False))
411
+ # Lazy arrays don't support "omit" and "raise" policies
412
+ match = "not supported for lazy arrays"
413
+ with pytest.raises(TypeError, match=match):
414
+ _contains_nan(x, "omit")
415
+ with pytest.raises(TypeError, match=match):
416
+ _contains_nan(x, "raise")
417
+
418
+ x = xpx.at(x)[1, 2, 1].set(np.nan)
419
+
420
+ xp_assert_equal(_contains_nan(x), xp.asarray(True))
421
+ xp_assert_equal(_contains_nan(x, "propagate"), xp.asarray(True))
422
+ xp_assert_equal(_contains_nan(x, "omit", xp_omit_okay=True), xp.asarray(True))
423
+ with pytest.raises(TypeError, match=match):
424
+ _contains_nan(x, "omit")
425
+ with pytest.raises(TypeError, match=match):
426
+ _contains_nan(x, "raise")
379
427
 
380
428
 
381
429
  def test__rng_html_rewrite():
@@ -591,67 +639,3 @@ class TestTransitionToRNG:
591
639
  res3 = method(self, **{arg_name: None})
592
640
  assert_equal(res2, res1)
593
641
  assert_equal(res3, res1)
594
-
595
-
596
- class TestLazywhere:
597
- n_arrays = strategies.integers(min_value=1, max_value=3)
598
- rng_seed = strategies.integers(min_value=1000000000, max_value=9999999999)
599
- dtype = strategies.sampled_from((np.float32, np.float64))
600
- p = strategies.floats(min_value=0, max_value=1)
601
- data = strategies.data()
602
-
603
- @pytest.mark.fail_slow(10)
604
- @pytest.mark.filterwarnings('ignore::RuntimeWarning') # overflows, etc.
605
- @skip_xp_backends('jax.numpy',
606
- reason="JAX arrays do not support item assignment")
607
- @pytest.mark.usefixtures("skip_xp_backends")
608
- @array_api_compatible
609
- @given(n_arrays=n_arrays, rng_seed=rng_seed, dtype=dtype, p=p, data=data)
610
- @pytest.mark.thread_unsafe
611
- def test_basic(self, n_arrays, rng_seed, dtype, p, data, xp):
612
- mbs = npst.mutually_broadcastable_shapes(num_shapes=n_arrays+1,
613
- min_side=0)
614
- input_shapes, result_shape = data.draw(mbs)
615
- cond_shape, *shapes = input_shapes
616
- elements = {'allow_subnormal': False} # cupy/cupy#8382
617
- fillvalue = xp.asarray(data.draw(npst.arrays(dtype=dtype, shape=tuple(),
618
- elements=elements)))
619
- float_fillvalue = float(fillvalue)
620
- arrays = [xp.asarray(data.draw(npst.arrays(dtype=dtype, shape=shape)))
621
- for shape in shapes]
622
-
623
- def f(*args):
624
- return sum(arg for arg in args)
625
-
626
- def f2(*args):
627
- return sum(arg for arg in args) / 2
628
-
629
- rng = np.random.default_rng(rng_seed)
630
- cond = xp.asarray(rng.random(size=cond_shape) > p)
631
-
632
- res1 = _lazywhere(cond, arrays, f, fillvalue)
633
- res2 = _lazywhere(cond, arrays, f, f2=f2)
634
- if not is_array_api_strict(xp):
635
- res3 = _lazywhere(cond, arrays, f, float_fillvalue)
636
-
637
- # Ensure arrays are at least 1d to follow sane type promotion rules.
638
- # This can be removed when minimum supported NumPy is 2.0
639
- if xp == np:
640
- cond, fillvalue, *arrays = np.atleast_1d(cond, fillvalue, *arrays)
641
-
642
- ref1 = xp.where(cond, f(*arrays), fillvalue)
643
- ref2 = xp.where(cond, f(*arrays), f2(*arrays))
644
- if not is_array_api_strict(xp):
645
- # Array API standard doesn't currently define behavior when fillvalue is a
646
- # Python scalar. When it does, test can be run with array_api_strict, too.
647
- ref3 = xp.where(cond, f(*arrays), float_fillvalue)
648
-
649
- if xp == np: # because we ensured arrays are at least 1d
650
- ref1 = ref1.reshape(result_shape)
651
- ref2 = ref2.reshape(result_shape)
652
- ref3 = ref3.reshape(result_shape)
653
-
654
- xp_assert_close(res1, ref1, rtol=2e-16)
655
- xp_assert_equal(res2, ref2)
656
- if not is_array_api_strict(xp):
657
- xp_assert_equal(res3, ref3)
@@ -1,14 +1,19 @@
1
+ import re
2
+
1
3
  import numpy as np
2
4
  import pytest
3
5
 
4
- from scipy.conftest import array_api_compatible
5
6
  from scipy._lib._array_api import (
6
7
  _GLOBAL_CONFIG, array_namespace, _asarray, xp_copy, xp_assert_equal, is_numpy,
7
- np_compat, xp_default_dtype
8
+ np_compat, xp_default_dtype, xp_result_type, is_torch
8
9
  )
10
+ from scipy._lib import array_api_extra as xpx
9
11
  from scipy._lib._array_api_no_0d import xp_assert_equal as xp_assert_equal_no_0d
12
+ from scipy._lib.array_api_extra.testing import lazy_xp_function
13
+
10
14
 
11
- skip_xp_backends = pytest.mark.skip_xp_backends
15
+ lazy_xp_function(_asarray)
16
+ lazy_xp_function(xp_copy)
12
17
 
13
18
 
14
19
  @pytest.mark.skipif(not _GLOBAL_CONFIG["SCIPY_ARRAY_API"],
@@ -25,7 +30,6 @@ class TestArrayAPI:
25
30
  assert 'array_api_compat.numpy' in xp.__name__
26
31
  _GLOBAL_CONFIG["SCIPY_ARRAY_API"] = True
27
32
 
28
- @array_api_compatible
29
33
  def test_asarray(self, xp):
30
34
  x, y = _asarray([0, 1, 2], xp=xp), _asarray(np.arange(3), xp=xp)
31
35
  ref = xp.asarray([0, 1, 2])
@@ -48,32 +52,67 @@ class TestArrayAPI:
48
52
  with pytest.raises(TypeError, match=msg):
49
53
  array_namespace('abc')
50
54
 
51
- def test_array_likes(self):
52
- # should be no exceptions
53
- array_namespace([0, 1, 2])
54
- array_namespace(1, 2, 3)
55
- array_namespace(1)
55
+ @pytest.mark.skip_xp_backends(np_only=True, reason="Array-likes")
56
+ def test_array_likes(self, xp):
57
+ """Test that if all parameters of array_namespace are Array-likes,
58
+ the output is array_api_compat.numpy
59
+ """
60
+ assert array_namespace([0, 1, 2]) is xp
61
+ assert array_namespace((0, 1, 2)) is xp
62
+ assert array_namespace(1, 2, 3) is xp
63
+ assert array_namespace(1) is xp
64
+ assert array_namespace(np.int64(1)) is xp
65
+ assert array_namespace([0, 1, 2], 3) is xp
66
+ assert array_namespace() is xp
67
+ assert array_namespace(None) is xp
68
+ assert array_namespace(1, None) is xp
69
+ assert array_namespace(None, 1) is xp
70
+
71
+ # This only works when xp is numpy!
72
+ assert array_namespace(np.asarray([1, 2]), [3, 4]) is xp
73
+ assert array_namespace(np.int64(1), [3, 4]) is xp
74
+
75
+ def test_array_and_array_likes_mix(self, xp):
76
+ """Test that if there is at least one Array API object among
77
+ the parameters of array_namespace, and all other parameters
78
+ are scalars, the output is its namespace.
79
+
80
+ If there are non-scalar Array-Likes, raise as in array-api-compat.
81
+ """
82
+ x = xp.asarray(1)
83
+ assert array_namespace(x) is xp
84
+ assert array_namespace(x, 1) is xp
85
+ assert array_namespace(1, x) is xp
86
+ assert array_namespace(None, x) is xp
87
+
88
+ if not is_numpy(xp):
89
+ with pytest.raises(TypeError, match="Multiple namespaces"):
90
+ array_namespace(x, [1, 2])
91
+ with pytest.raises(TypeError, match="Multiple namespaces"):
92
+ array_namespace(x, np.int64(1))
93
+
94
+ def test_array_api_extra_hook(self):
95
+ """Test that the `array_namespace` function used by
96
+ array-api-extra has been overridden by scipy
97
+ """
98
+ msg = "only boolean and numerical dtypes are supported"
99
+ with pytest.raises(TypeError, match=msg):
100
+ xpx.atleast_nd("abc", ndim=0)
56
101
 
57
- @skip_xp_backends('jax.numpy',
58
- reason="JAX arrays do not support item assignment")
59
- @pytest.mark.usefixtures("skip_xp_backends")
60
- @array_api_compatible
61
102
  def test_copy(self, xp):
62
103
  for _xp in [xp, None]:
63
104
  x = xp.asarray([1, 2, 3])
64
105
  y = xp_copy(x, xp=_xp)
65
106
  # with numpy we'd want to use np.shared_memory, but that's not specified
66
107
  # in the array-api
67
- x[0] = 10
68
- x[1] = 11
69
- x[2] = 12
70
-
71
- assert x[0] != y[0]
72
- assert x[1] != y[1]
73
- assert x[2] != y[2]
74
108
  assert id(x) != id(y)
75
-
76
- @array_api_compatible
109
+ try:
110
+ y[0] = 10
111
+ except (TypeError, ValueError):
112
+ pass
113
+ else:
114
+ assert x[0] != y[0]
115
+
77
116
  @pytest.mark.parametrize('dtype', ['int32', 'int64', 'float32', 'float64'])
78
117
  @pytest.mark.parametrize('shape', [(), (3,)])
79
118
  def test_strict_checks(self, xp, dtype, shape):
@@ -85,11 +124,19 @@ class TestArrayAPI:
85
124
 
86
125
  kwarg_names = ["check_namespace", "check_dtype", "check_shape", "check_0d"]
87
126
  options = dict(zip(kwarg_names, [True, False, False, False]))
88
- if xp == np:
127
+ if is_numpy(xp):
89
128
  xp_assert_equal(x, y, **options)
90
129
  else:
91
- with pytest.raises(AssertionError, match="Namespaces do not match."):
130
+ with pytest.raises(
131
+ AssertionError,
132
+ match="Namespace of desired array does not match",
133
+ ):
92
134
  xp_assert_equal(x, y, **options)
135
+ with pytest.raises(
136
+ AssertionError,
137
+ match="Namespace of actual and desired arrays do not match",
138
+ ):
139
+ xp_assert_equal(y, x, **options)
93
140
 
94
141
  options = dict(zip(kwarg_names, [False, True, False, False]))
95
142
  if y.dtype.name in str(x.dtype):
@@ -112,12 +159,8 @@ class TestArrayAPI:
112
159
  with pytest.raises(AssertionError, match="Array-ness does not match."):
113
160
  xp_assert_equal(x, y, **options)
114
161
 
115
-
116
- @array_api_compatible
162
+ @pytest.mark.skip_xp_backends(np_only=True, reason="Scalars only exist in NumPy")
117
163
  def test_check_scalar(self, xp):
118
- if not is_numpy(xp):
119
- pytest.skip("Scalars only exist in NumPy")
120
-
121
164
  # identity always passes
122
165
  xp_assert_equal(xp.float64(0), xp.float64(0))
123
166
  xp_assert_equal(xp.asarray(0.), xp.asarray(0.))
@@ -147,12 +190,8 @@ class TestArrayAPI:
147
190
  # as an alternative to `check_0d=False`, explicitly expect scalar
148
191
  xp_assert_equal(xp.float64(0), xp.asarray(0.)[()])
149
192
 
150
-
151
- @array_api_compatible
193
+ @pytest.mark.skip_xp_backends(np_only=True, reason="Scalars only exist in NumPy")
152
194
  def test_check_scalar_no_0d(self, xp):
153
- if not is_numpy(xp):
154
- pytest.skip("Scalars only exist in NumPy")
155
-
156
195
  # identity passes, if first argument is not 0d (or check_0d=True)
157
196
  xp_assert_equal_no_0d(xp.float64(0), xp.float64(0))
158
197
  xp_assert_equal_no_0d(xp.float64(0), xp.float64(0), check_0d=True)
@@ -186,6 +225,98 @@ class TestArrayAPI:
186
225
  xp_assert_equal_no_0d(0., xp.asarray(0.))
187
226
  xp_assert_equal_no_0d(42, xp.asarray(42))
188
227
 
189
- @array_api_compatible
190
228
  def test_default_dtype(self, xp):
191
229
  assert xp_default_dtype(xp) == xp.asarray(1.).dtype
230
+
231
+
232
+ scalars = [1, 1., 1. + 1j]
233
+ lists = [[1], [1.], [1. + 1j]]
234
+ types = ('int8 int16 int32 int64 '
235
+ 'uint8 uint16 uint32 uint64 '
236
+ 'float32 float64 complex64 complex128').split()
237
+ arrays = [np.asarray([1], dtype=getattr(np, t)) for t in types]
238
+
239
+
240
+ def convert_type(x, xp):
241
+ # Convert NumPy array to xp-array
242
+ # Convert string to indicated dtype from xp
243
+ # Return Python scalars unchanged
244
+ if isinstance(x, np.ndarray):
245
+ return xp.asarray(x)
246
+ elif isinstance(x, str):
247
+ return getattr(xp, x)
248
+ return x
249
+
250
+
251
+ def is_inexact(x, xp):
252
+ # Determine whether `x` is of inexact (real of complex floating) dtype
253
+ x = xp.asarray(x) if np.isscalar(x) or isinstance(x, list) else x
254
+ dtype = getattr(x, 'dtype', x)
255
+ return xp.isdtype(dtype, ('real floating', 'complex floating'))
256
+
257
+
258
+ @pytest.mark.parametrize('x', scalars + lists + types + arrays)
259
+ @pytest.mark.parametrize('y', scalars + lists + types + arrays)
260
+ def test_xp_result_type_no_force(x, y, xp):
261
+ # When force_floating==False (default), behavior of `xp_result_type`
262
+ # should match that of `xp.result_type` on the same arguments after
263
+ # converting lists to arrays of type `xp`.
264
+ x = convert_type(x, xp)
265
+ y = convert_type(y, xp)
266
+ x_ref = xp.asarray(x) if isinstance(x, list) else x
267
+ y_ref = xp.asarray(y) if isinstance(y, list) else y
268
+
269
+ try:
270
+ dtype_ref = xp.result_type(x_ref, y_ref)
271
+ expected_error = None
272
+ except Exception as e:
273
+ expected_error = (type(e), str(e))
274
+
275
+ if expected_error is not None:
276
+ with pytest.raises(expected_error[0], match=re.escape(expected_error[1])):
277
+ xp_result_type(x, y, xp=xp)
278
+ return
279
+
280
+ dtype_res = xp_result_type(x, y, xp=xp)
281
+ assert dtype_res == dtype_ref
282
+
283
+
284
+ @pytest.mark.parametrize('x', scalars + lists + types + arrays)
285
+ @pytest.mark.parametrize('y', scalars + lists + types + arrays)
286
+ def test_xp_result_type_force_floating(x, y, xp):
287
+ # When `force_floating==True`, behavior of `xp_result_type`
288
+ # should match that of `xp.result_type` with `1.0` appended to the set of
289
+ # arguments (after converting lists to arrays of type `xp`).
290
+ # If this raises a `TypeError`, which is the case when the result
291
+ # type is not defined by the standard, the result type should be
292
+ # the result type of any inexact (real or complex floating) arguments
293
+ # and the default floating point type.
294
+ if (is_torch(xp) and not(isinstance(x, str) or isinstance(y, str))
295
+ and np.isscalar(x) and np.isscalar(y)):
296
+ pytest.skip("See 3/27/2024 comment at data-apis/array-api-compat#277")
297
+
298
+ x = convert_type(x, xp)
299
+ y = convert_type(y, xp)
300
+ x_ref = xp.asarray(x) if isinstance(x, list) else x
301
+ y_ref = xp.asarray(y) if isinstance(y, list) else y
302
+
303
+ expected_error = None
304
+ try:
305
+ dtype_ref = xp.result_type(x_ref, y_ref, 1.0)
306
+ except TypeError:
307
+ args = []
308
+ if is_inexact(x_ref, xp):
309
+ args.append(x_ref)
310
+ if is_inexact(y_ref, xp):
311
+ args.append(y_ref)
312
+ dtype_ref = xp.result_type(*args, xp.asarray(1.0))
313
+ except Exception as e:
314
+ expected_error = (type(e), str(e))
315
+
316
+ if expected_error is not None:
317
+ with pytest.raises(expected_error[0], match=expected_error[1]):
318
+ xp_result_type(x, y, xp=xp)
319
+ return
320
+
321
+ dtype_res = xp_result_type(x, y, force_floating=True, xp=xp)
322
+ assert dtype_res == dtype_ref
@@ -127,6 +127,13 @@ class TestMakeTupleBunch:
127
127
  assert_equal(Foo.__module__, m)
128
128
  assert_equal(foo.__module__, m)
129
129
 
130
+ def test_passes_polars_checks(self):
131
+ # gh-22450
132
+ Square = _make_tuple_bunch('Square', ['width', 'height'])
133
+ assert hasattr(Square, '_replace')
134
+ assert hasattr(Square, '_field_defaults')
135
+
136
+
130
137
  # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
131
138
  # Argument validation
132
139
  # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -9,12 +9,6 @@ from scipy._lib import _ccallback_c as _test_ccallback_cython
9
9
  from scipy._lib import _test_ccallback
10
10
  from scipy._lib._ccallback import LowLevelCallable
11
11
 
12
- try:
13
- import cffi
14
- HAVE_CFFI = True
15
- except ImportError:
16
- HAVE_CFFI = False
17
-
18
12
 
19
13
  ERROR_VALUE = 2.0
20
14
 
@@ -29,8 +23,7 @@ def callback_python(a, user_data=None):
29
23
  return a + user_data
30
24
 
31
25
  def _get_cffi_func(base, signature):
32
- if not HAVE_CFFI:
33
- pytest.skip("cffi not installed")
26
+ cffi = pytest.importorskip("cffi")
34
27
 
35
28
  # Get function address
36
29
  voidp = ctypes.cast(base, ctypes.c_void_p)
@@ -48,8 +41,7 @@ def _get_ctypes_data():
48
41
 
49
42
 
50
43
  def _get_cffi_data():
51
- if not HAVE_CFFI:
52
- pytest.skip("cffi not installed")
44
+ cffi = pytest.importorskip("cffi")
53
45
  ffi = cffi.FFI()
54
46
  return ffi.new('double *', 2.0)
55
47
 
@@ -357,6 +357,7 @@ def test_api_importable():
357
357
  ('scipy.integrate.odepack', None),
358
358
  ('scipy.integrate.quadpack', None),
359
359
  ('scipy.integrate.vode', None),
360
+ ('scipy.interpolate.dfitpack', None),
360
361
  ('scipy.interpolate.fitpack', None),
361
362
  ('scipy.interpolate.fitpack2', None),
362
363
  ('scipy.interpolate.interpolate', None),
@@ -412,9 +413,21 @@ def test_api_importable():
412
413
  ('scipy.signal.ltisys', None),
413
414
  ('scipy.signal.signaltools', None),
414
415
  ('scipy.signal.spectral', None),
416
+ ('scipy.signal.spline', None),
415
417
  ('scipy.signal.waveforms', None),
416
418
  ('scipy.signal.wavelets', None),
417
419
  ('scipy.signal.windows.windows', 'windows'),
420
+ ('scipy.sparse.base', None),
421
+ ('scipy.sparse.bsr', None),
422
+ ('scipy.sparse.compressed', None),
423
+ ('scipy.sparse.construct', None),
424
+ ('scipy.sparse.coo', None),
425
+ ('scipy.sparse.csc', None),
426
+ ('scipy.sparse.csr', None),
427
+ ('scipy.sparse.data', None),
428
+ ('scipy.sparse.dia', None),
429
+ ('scipy.sparse.dok', None),
430
+ ('scipy.sparse.extract', None),
418
431
  ('scipy.sparse.lil', None),
419
432
  ('scipy.sparse.linalg.dsolve', 'linalg'),
420
433
  ('scipy.sparse.linalg.eigen', 'linalg'),
Binary file
Binary file