scipy 1.15.3__cp311-cp311-win_amd64.whl → 1.16.0rc2__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 (759) 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 +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.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/cython_blas.cp311-win_amd64.dll.a +0 -0
  268. scipy/linalg/cython_blas.cp311-win_amd64.pyd +0 -0
  269. scipy/linalg/cython_lapack.cp311-win_amd64.dll.a +0 -0
  270. scipy/linalg/cython_lapack.cp311-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.cp311-win_amd64.dll.a +0 -0
  286. scipy/ndimage/_ctest.cp311-win_amd64.pyd +0 -0
  287. scipy/ndimage/_cytest.cp311-win_amd64.dll.a +0 -0
  288. scipy/ndimage/_cytest.cp311-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.cp311-win_amd64.dll.a +0 -0
  295. scipy/ndimage/_nd_image.cp311-win_amd64.pyd +0 -0
  296. scipy/ndimage/_ni_docstrings.py +5 -1
  297. scipy/ndimage/_ni_label.cp311-win_amd64.dll.a +0 -0
  298. scipy/ndimage/_ni_label.cp311-win_amd64.pyd +0 -0
  299. scipy/ndimage/_ni_support.py +1 -5
  300. scipy/ndimage/_rank_filter_1d.cp311-win_amd64.dll.a +0 -0
  301. scipy/ndimage/_rank_filter_1d.cp311-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.cp311-win_amd64.dll.a +0 -0
  310. scipy/odr/__odrpack.cp311-win_amd64.pyd +0 -0
  311. scipy/optimize/_basinhopping.py +13 -7
  312. scipy/optimize/_bglu_dense.cp311-win_amd64.dll.a +0 -0
  313. scipy/optimize/_bglu_dense.cp311-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.cp311-win_amd64.dll.a +0 -0
  321. scipy/optimize/_direct.cp311-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.cp311-win_amd64.dll.a +0 -0
  325. scipy/optimize/_group_columns.cp311-win_amd64.pyd +0 -0
  326. scipy/optimize/_highspy/_core.cp311-win_amd64.dll.a +0 -0
  327. scipy/optimize/_highspy/_core.cp311-win_amd64.pyd +0 -0
  328. scipy/optimize/_highspy/_highs_options.cp311-win_amd64.dll.a +0 -0
  329. scipy/optimize/_highspy/_highs_options.cp311-win_amd64.pyd +0 -0
  330. scipy/optimize/_lbfgsb.cp311-win_amd64.dll.a +0 -0
  331. scipy/optimize/_lbfgsb.cp311-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.cp311-win_amd64.dll.a +0 -0
  338. scipy/optimize/_lsap.cp311-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.cp311-win_amd64.dll.a +0 -0
  342. scipy/optimize/_lsq/givens_elimination.cp311-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.cp311-win_amd64.dll.a +0 -0
  349. scipy/optimize/_minpack.cp311-win_amd64.pyd +0 -0
  350. scipy/optimize/_minpack_py.py +21 -14
  351. scipy/optimize/_moduleTNC.cp311-win_amd64.dll.a +0 -0
  352. scipy/optimize/_moduleTNC.cp311-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.cp311-win_amd64.dll.a +0 -0
  358. scipy/optimize/_pava_pybind.cp311-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.cp311-win_amd64.dll.a +0 -0
  365. scipy/optimize/_slsqplib.cp311-win_amd64.pyd +0 -0
  366. scipy/optimize/_spectral.py +1 -1
  367. scipy/optimize/_tnc.py +8 -1
  368. scipy/optimize/_trlib/_trlib.cp311-win_amd64.dll.a +0 -0
  369. scipy/optimize/_trlib/_trlib.cp311-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.cp311-win_amd64.dll.a +0 -0
  381. scipy/optimize/_zeros.cp311-win_amd64.pyd +0 -0
  382. scipy/optimize/_zeros_py.py +97 -17
  383. scipy/optimize/cython_optimize/_zeros.cp311-win_amd64.dll.a +0 -0
  384. scipy/optimize/cython_optimize/_zeros.cp311-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.cp311-win_amd64.dll.a +0 -0
  416. scipy/signal/_max_len_seq_inner.cp311-win_amd64.pyd +0 -0
  417. scipy/signal/_peak_finding_utils.cp311-win_amd64.dll.a +0 -0
  418. scipy/signal/_peak_finding_utils.cp311-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.cp311-win_amd64.dll.a +0 -0
  424. scipy/signal/_sigtools.cp311-win_amd64.pyd +0 -0
  425. scipy/signal/_sosfilt.cp311-win_amd64.dll.a +0 -0
  426. scipy/signal/_sosfilt.cp311-win_amd64.pyd +0 -0
  427. scipy/signal/_spectral_py.py +230 -50
  428. scipy/signal/_spline.cp311-win_amd64.dll.a +0 -0
  429. scipy/signal/_spline.cp311-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.cp311-win_amd64.dll.a +0 -0
  434. scipy/signal/_upfirdn_apply.cp311-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.cp311-win_amd64.dll.a +0 -0
  461. scipy/sparse/_csparsetools.cp311-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.cp311-win_amd64.dll.a +0 -0
  469. scipy/sparse/_sparsetools.cp311-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.cp311-win_amd64.dll.a +0 -0
  478. scipy/sparse/csgraph/_flow.cp311-win_amd64.pyd +0 -0
  479. scipy/sparse/csgraph/_matching.cp311-win_amd64.dll.a +0 -0
  480. scipy/sparse/csgraph/_matching.cp311-win_amd64.pyd +0 -0
  481. scipy/sparse/csgraph/_min_spanning_tree.cp311-win_amd64.dll.a +0 -0
  482. scipy/sparse/csgraph/_min_spanning_tree.cp311-win_amd64.pyd +0 -0
  483. scipy/sparse/csgraph/_reordering.cp311-win_amd64.dll.a +0 -0
  484. scipy/sparse/csgraph/_reordering.cp311-win_amd64.pyd +0 -0
  485. scipy/sparse/csgraph/_shortest_path.cp311-win_amd64.dll.a +0 -0
  486. scipy/sparse/csgraph/_shortest_path.cp311-win_amd64.pyd +0 -0
  487. scipy/sparse/csgraph/_tools.cp311-win_amd64.dll.a +0 -0
  488. scipy/sparse/csgraph/_tools.cp311-win_amd64.pyd +0 -0
  489. scipy/sparse/csgraph/_traversal.cp311-win_amd64.dll.a +0 -0
  490. scipy/sparse/csgraph/_traversal.cp311-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.cp311-win_amd64.dll.a +0 -0
  499. scipy/sparse/linalg/_dsolve/_superlu.cp311-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.cp311-win_amd64.dll.a +0 -0
  503. scipy/sparse/linalg/_eigen/arpack/_arpack.cp311-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.cp311-win_amd64.dll.a +0 -0
  516. scipy/sparse/linalg/_propack/_cpropack.cp311-win_amd64.pyd +0 -0
  517. scipy/sparse/linalg/_propack/_dpropack.cp311-win_amd64.dll.a +0 -0
  518. scipy/sparse/linalg/_propack/_dpropack.cp311-win_amd64.pyd +0 -0
  519. scipy/sparse/linalg/_propack/_spropack.cp311-win_amd64.dll.a +0 -0
  520. scipy/sparse/linalg/_propack/_spropack.cp311-win_amd64.pyd +0 -0
  521. scipy/sparse/linalg/_propack/_zpropack.cp311-win_amd64.dll.a +0 -0
  522. scipy/sparse/linalg/_propack/_zpropack.cp311-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.cp311-win_amd64.dll.a +0 -0
  533. scipy/spatial/_ckdtree.cp311-win_amd64.pyd +0 -0
  534. scipy/spatial/_distance_pybind.cp311-win_amd64.dll.a +0 -0
  535. scipy/spatial/_distance_pybind.cp311-win_amd64.pyd +0 -0
  536. scipy/spatial/_distance_wrap.cp311-win_amd64.dll.a +0 -0
  537. scipy/spatial/_distance_wrap.cp311-win_amd64.pyd +0 -0
  538. scipy/spatial/_hausdorff.cp311-win_amd64.dll.a +0 -0
  539. scipy/spatial/_hausdorff.cp311-win_amd64.pyd +0 -0
  540. scipy/spatial/_qhull.cp311-win_amd64.dll.a +0 -0
  541. scipy/spatial/_qhull.cp311-win_amd64.pyd +0 -0
  542. scipy/spatial/_voronoi.cp311-win_amd64.dll.a +0 -0
  543. scipy/spatial/_voronoi.cp311-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.cp311-win_amd64.dll.a +0 -0
  550. scipy/spatial/transform/_rigid_transform.cp311-win_amd64.pyd +0 -0
  551. scipy/spatial/transform/_rotation.cp311-win_amd64.dll.a +0 -0
  552. scipy/spatial/transform/_rotation.cp311-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.cp311-win_amd64.dll.a +0 -0
  561. scipy/special/_comb.cp311-win_amd64.pyd +0 -0
  562. scipy/special/_ellip_harm_2.cp311-win_amd64.dll.a +0 -0
  563. scipy/special/_ellip_harm_2.cp311-win_amd64.pyd +0 -0
  564. scipy/special/_gufuncs.cp311-win_amd64.dll.a +0 -0
  565. scipy/special/_gufuncs.cp311-win_amd64.pyd +0 -0
  566. scipy/special/_logsumexp.py +67 -58
  567. scipy/special/_orthogonal.pyi +1 -1
  568. scipy/special/_specfun.cp311-win_amd64.dll.a +0 -0
  569. scipy/special/_specfun.cp311-win_amd64.pyd +0 -0
  570. scipy/special/_special_ufuncs.cp311-win_amd64.dll.a +0 -0
  571. scipy/special/_special_ufuncs.cp311-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.cp311-win_amd64.dll.a +0 -0
  575. scipy/special/_test_internal.cp311-win_amd64.pyd +0 -0
  576. scipy/special/_testutils.py +4 -4
  577. scipy/special/_ufuncs.cp311-win_amd64.dll.a +0 -0
  578. scipy/special/_ufuncs.cp311-win_amd64.pyd +0 -0
  579. scipy/special/_ufuncs.pyi +1 -0
  580. scipy/special/_ufuncs.pyx +215 -1400
  581. scipy/special/_ufuncs_cxx.cp311-win_amd64.dll.a +0 -0
  582. scipy/special/_ufuncs_cxx.cp311-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.cp311-win_amd64.dll.a +0 -0
  588. scipy/special/cython_special.cp311-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.cp311-win_amd64.dll.a +0 -0
  606. scipy/stats/_ansari_swilk_statistics.cp311-win_amd64.pyd +0 -0
  607. scipy/stats/_axis_nan_policy.py +5 -12
  608. scipy/stats/_biasedurn.cp311-win_amd64.dll.a +0 -0
  609. scipy/stats/_biasedurn.cp311-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.cp311-win_amd64.dll.a +0 -0
  624. scipy/stats/_levy_stable/levyst.cp311-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.cp311-win_amd64.dll.a +0 -0
  634. scipy/stats/_qmc_cy.cp311-win_amd64.pyd +0 -0
  635. scipy/stats/_qmvnt.py +16 -95
  636. scipy/stats/_qmvnt_cy.cp311-win_amd64.dll.a +0 -0
  637. scipy/stats/_qmvnt_cy.cp311-win_amd64.pyd +0 -0
  638. scipy/stats/_quantile.py +335 -0
  639. scipy/stats/_rcont/rcont.cp311-win_amd64.dll.a +0 -0
  640. scipy/stats/_rcont/rcont.cp311-win_amd64.pyd +0 -0
  641. scipy/stats/_resampling.py +4 -29
  642. scipy/stats/_sampling.py +1 -1
  643. scipy/stats/_sobol.cp311-win_amd64.dll.a +0 -0
  644. scipy/stats/_sobol.cp311-win_amd64.pyd +0 -0
  645. scipy/stats/_stats.cp311-win_amd64.dll.a +0 -0
  646. scipy/stats/_stats.cp311-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.cp311-win_amd64.dll.a +0 -0
  650. scipy/stats/_stats_pythran.cp311-win_amd64.pyd +0 -0
  651. scipy/stats/_unuran/unuran_wrapper.cp311-win_amd64.dll.a +0 -0
  652. scipy/stats/_unuran/unuran_wrapper.cp311-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.cp311-win_amd64.dll.a +0 -0
  687. scipy/interpolate/_bspl.cp311-win_amd64.pyd +0 -0
  688. scipy/optimize/_cobyla.cp311-win_amd64.dll.a +0 -0
  689. scipy/optimize/_cobyla.cp311-win_amd64.pyd +0 -0
  690. scipy/optimize/_cython_nnls.cp311-win_amd64.dll.a +0 -0
  691. scipy/optimize/_cython_nnls.cp311-win_amd64.pyd +0 -0
  692. scipy/optimize/_slsqp.cp311-win_amd64.dll.a +0 -0
  693. scipy/optimize/_slsqp.cp311-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.cp311-win_amd64.dll.a +0 -0
  756. scipy/stats/_mvn.cp311-win_amd64.pyd +0 -0
  757. scipy-1.15.3.dist-info/DELVEWHEEL +0 -2
  758. /scipy-1.15.3-cp311-cp311-win_amd64.whl → /scipy-1.16.0rc2-cp311-cp311-win_amd64.whl +0 -0
  759. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
@@ -243,8 +243,7 @@ class _Interpolator1DWithDerivatives(_Interpolator1D):
243
243
 
244
244
 
245
245
  class KroghInterpolator(_Interpolator1DWithDerivatives):
246
- """
247
- Interpolating polynomial for a set of points.
246
+ """Krogh interpolator (C∞ smooth).
248
247
 
249
248
  The polynomial passes through all the pairs ``(xi, yi)``. One may
250
249
  additionally specify a number of derivatives at each point `xi`;
@@ -391,8 +390,7 @@ class KroghInterpolator(_Interpolator1DWithDerivatives):
391
390
 
392
391
 
393
392
  def krogh_interpolate(xi, yi, x, der=0, axis=0):
394
- """
395
- Convenience function for polynomial interpolation.
393
+ """Convenience function for Krogh interpolation.
396
394
 
397
395
  See `KroghInterpolator` for more details.
398
396
 
@@ -533,27 +531,23 @@ def approximate_taylor_polynomial(f,x,degree,scale,order=None):
533
531
 
534
532
 
535
533
  class BarycentricInterpolator(_Interpolator1DWithDerivatives):
536
- r"""Interpolating polynomial for a set of points.
534
+ r"""Barycentric (Lagrange with improved stability) interpolator (C∞ smooth).
537
535
 
538
536
  Constructs a polynomial that passes through a given set of points.
539
537
  Allows evaluation of the polynomial and all its derivatives,
540
538
  efficient changing of the y-values to be interpolated,
541
- and updating by adding more x- and y-values.
539
+ and updating by adding more x- and y-values. For numerical stability, a barycentric
540
+ representation is used rather than computing the coefficients of the polynomial
541
+ directly.
542
542
 
543
- For reasons of numerical stability, this function does not compute
544
- the coefficients of the polynomial.
545
-
546
- The values `yi` need to be provided before the function is
547
- evaluated, but none of the preprocessing depends on them, so rapid
548
- updates are possible.
549
543
 
550
544
  Parameters
551
545
  ----------
552
546
  xi : array_like, shape (npoints, )
553
- 1-D array of x coordinates of the points the polynomial
547
+ 1-D array of x-coordinates of the points the polynomial
554
548
  should pass through
555
549
  yi : array_like, shape (..., npoints, ...), optional
556
- N-D array of y coordinates of the points the polynomial should pass through.
550
+ N-D array of y-coordinates of the points the polynomial should pass through.
557
551
  If None, the y values will be supplied later via the `set_y` method.
558
552
  The length of `yi` along the interpolation axis must be equal to the length
559
553
  of `xi`. Use the ``axis`` parameter to select correct axis.
@@ -564,7 +558,9 @@ class BarycentricInterpolator(_Interpolator1DWithDerivatives):
564
558
  The barycentric weights for the chosen interpolation points `xi`.
565
559
  If absent or None, the weights will be computed from `xi` (default).
566
560
  This allows for the reuse of the weights `wi` if several interpolants
567
- are being calculated using the same nodes `xi`, without re-computation.
561
+ are being calculated using the same nodes `xi`, without re-computation. This
562
+ also allows for computing the weights explicitly for some choices of
563
+ `xi` (see notes).
568
564
  rng : {None, int, `numpy.random.Generator`}, optional
569
565
  If `rng` is passed by keyword, types other than `numpy.random.Generator` are
570
566
  passed to `numpy.random.default_rng` to instantiate a ``Generator``.
@@ -591,21 +587,71 @@ class BarycentricInterpolator(_Interpolator1DWithDerivatives):
591
587
 
592
588
  Notes
593
589
  -----
594
- This class uses a "barycentric interpolation" method that treats
595
- the problem as a special case of rational function interpolation.
596
- This algorithm is quite stable, numerically, but even in a world of
597
- exact computation, unless the x coordinates are chosen very
598
- carefully - Chebyshev zeros (e.g., cos(i*pi/n)) are a good choice -
599
- polynomial interpolation itself is a very ill-conditioned process
600
- due to the Runge phenomenon.
590
+ This method is a variant of Lagrange polynomial interpolation [1]_ based on [2]_.
591
+ Instead of using Lagrange's or Newton's formula, the polynomial is represented by
592
+ the barycentric formula
593
+
594
+ .. math::
595
+
596
+ p(x) =
597
+ \frac{\sum_{i=1}^m\ w_i y_i / (x - x_i)}{\sum_{i=1}^m w_i / (x - x_i)},
598
+
599
+ where :math:`w_i` are the barycentric weights computed with the general formula
600
+
601
+ .. math::
602
+
603
+ w_i = \left( \prod_{k \neq i} x_i - x_k \right)^{-1}.
604
+
605
+ This is the same barycentric form used by `AAA` and `FloaterHormannInterpolator`.
606
+ However, in contrast, the weights :math:`w_i` are defined such that
607
+ :math:`p(x)` is a polynomial rather than a rational function.
608
+
609
+ The barycentric representation avoids many of the problems associated with
610
+ polynomial interpolation caused by floating-point arithmetic. However, it does not
611
+ avoid issues that are intrinsic to polynomial interpolation. Namely, if the
612
+ x-coordinates are equally spaced, then the weights can be computed explicitly using
613
+ the formula from [2]_
601
614
 
602
- Based on Berrut and Trefethen 2004, "Barycentric Lagrange Interpolation".
615
+ .. math::
616
+
617
+ w_i = (-1)^i {n \choose i},
618
+
619
+ where :math:`n` is the number of x-coordinates. As noted in [2]_, this means that
620
+ for large :math:`n` the weights vary by exponentially large factors, leading to the
621
+ Runge phenomenon.
622
+
623
+ To avoid this ill-conditioning, the x-coordinates should be clustered at the
624
+ endpoints of the interval. An excellent choice of points on the interval
625
+ :math:`[a,b]` are Chebyshev points of the second kind
626
+
627
+ .. math::
628
+
629
+ x_i = \frac{a + b}{2} + \frac{a - b}{2}\cos(i\pi/n).
630
+
631
+ in which case the weights can be computed explicitly as
632
+
633
+ .. math::
634
+
635
+ w_i = \begin{cases}
636
+ (-1)^i/2 & i = 0,n \\
637
+ (-1)^i & \text{otherwise}
638
+ \end{cases}.
639
+
640
+ See [2]_ for more infomation. Note that for large :math:`n`, computing the weights
641
+ explicitly (see examples) will be faster than the generic formula.
642
+
643
+ References
644
+ ----------
645
+ .. [1] https://en.wikipedia.org/wiki/Lagrange_polynomial
646
+ .. [2] Jean-Paul Berrut and Lloyd N. Trefethen, "Barycentric Lagrange
647
+ Interpolation", SIAM Review 2004 46:3, 501-517
648
+ :doi:`10.1137/S0036144502417715`
603
649
 
604
650
  Examples
605
651
  --------
606
652
  To produce a quintic barycentric interpolant approximating the function
607
653
  :math:`\sin x`, and its first four derivatives, using six randomly-spaced
608
- nodes in :math:`(0, \frac{\pi}{2})`:
654
+ nodes in :math:`(0, \pi/2)`:
609
655
 
610
656
  >>> import numpy as np
611
657
  >>> import matplotlib.pyplot as plt
@@ -625,15 +671,34 @@ class BarycentricInterpolator(_Interpolator1DWithDerivatives):
625
671
  >>> axs[4].set_xlabel(r"$x$")
626
672
  >>> axs[4].set_xticks([i * np.pi / 4 for i in range(5)],
627
673
  ... ["0", r"$\frac{\pi}{4}$", r"$\frac{\pi}{2}$", r"$\frac{3\pi}{4}$", r"$\pi$"])
628
- >>> axs[0].set_ylabel("$f(x)$")
629
- >>> axs[1].set_ylabel("$f'(x)$")
630
- >>> axs[2].set_ylabel("$f''(x)$")
631
- >>> axs[3].set_ylabel("$f^{(3)}(x)$")
632
- >>> axs[4].set_ylabel("$f^{(4)}(x)$")
674
+ >>> for ax, label in zip(axs, ("$f(x)$", "$f'(x)$", "$f''(x)$", "$f^{(3)}(x)$", "$f^{(4)}(x)$")):
675
+ ... ax.set_ylabel(label)
633
676
  >>> labels = ['Interpolation nodes', 'True function $f$', 'Barycentric interpolation']
634
677
  >>> axs[0].legend(axs[0].get_lines()[::-1], labels, bbox_to_anchor=(0., 1.02, 1., .102),
635
678
  ... loc='lower left', ncols=3, mode="expand", borderaxespad=0., frameon=False)
636
679
  >>> plt.show()
680
+
681
+ Next, we show how using Chebyshev points of the second kind avoids the avoids the
682
+ Runge phenomenon. In this example, we also compute the weights explicitly.
683
+
684
+ >>> n = 20
685
+ >>> def f(x): return np.abs(x) + 0.5*x - x**2
686
+ >>> i = np.arange(n)
687
+ >>> x_cheb = np.cos(i*np.pi/(n - 1)) # Chebyshev points on [-1, 1]
688
+ >>> w_i_cheb = (-1.)**i # Explicit formula for weights of Chebyshev points
689
+ >>> w_i_cheb[[0, -1]] /= 2
690
+ >>> p_cheb = BarycentricInterpolator(x_cheb, f(x_cheb), wi=w_i_cheb)
691
+ >>> x_equi = np.linspace(-1, 1, n)
692
+ >>> p_equi = BarycentricInterpolator(x_equi, f(x_equi))
693
+ >>> xx = np.linspace(-1, 1, 1000)
694
+ >>> fig, ax = plt.subplots()
695
+ >>> ax.plot(xx, f(xx), label="Original Function")
696
+ >>> ax.plot(xx, p_cheb(xx), "--", label="Chebshev Points")
697
+ >>> ax.plot(xx, p_equi(xx), "--", label="Equally Spaced Points")
698
+ >>> ax.set(xlabel="$x$", ylabel="$f(x)$", xlim=[-1, 1])
699
+ >>> ax.legend()
700
+ >>> plt.show()
701
+
637
702
  """ # numpy/numpydoc#87 # noqa: E501
638
703
 
639
704
  @_transition_to_rng("random_state", replace_doc=False)
@@ -881,8 +946,7 @@ class BarycentricInterpolator(_Interpolator1DWithDerivatives):
881
946
 
882
947
 
883
948
  def barycentric_interpolate(xi, yi, x, axis=0, *, der=0, rng=None):
884
- """
885
- Convenience function for polynomial interpolation.
949
+ """Convenience function for barycentric interpolation.
886
950
 
887
951
  Constructs a polynomial that passes through a given set of points,
888
952
  then evaluates the polynomial. For reasons of numerical stability,
scipy/interpolate/_rbf.py CHANGED
@@ -56,8 +56,8 @@ class Rbf:
56
56
  """
57
57
  Rbf(*args, **kwargs)
58
58
 
59
- A class for radial basis function interpolation of functions from
60
- N-D scattered data to an M-D domain.
59
+ Class for radial basis function interpolation of functions from
60
+ N-D scattered data to an M-D domain (legacy).
61
61
 
62
62
  .. legacy:: class
63
63
 
@@ -132,7 +132,7 @@ def _build_and_solve_system(y, d, smoothing, kernel, epsilon, powers):
132
132
 
133
133
 
134
134
  class RBFInterpolator:
135
- """Radial basis function (RBF) interpolation in N dimensions.
135
+ """Radial basis function interpolator in N ≥ 1 dimensions.
136
136
 
137
137
  Parameters
138
138
  ----------
scipy/interpolate/_rgi.py CHANGED
@@ -28,8 +28,9 @@ def _check_points(points):
28
28
  p = np.flip(p)
29
29
  else:
30
30
  raise ValueError(
31
- "The points in dimension %d must be strictly "
32
- "ascending or descending" % i)
31
+ f"The points in dimension {i} must be strictly ascending or "
32
+ f"descending"
33
+ )
33
34
  # see https://github.com/scipy/scipy/issues/17716
34
35
  p = np.ascontiguousarray(p)
35
36
  grid.append(p)
@@ -38,20 +39,22 @@ def _check_points(points):
38
39
 
39
40
  def _check_dimensionality(points, values):
40
41
  if len(points) > values.ndim:
41
- raise ValueError("There are %d point arrays, but values has %d "
42
- "dimensions" % (len(points), values.ndim))
42
+ raise ValueError(
43
+ f"There are {len(points)} point arrays, but values has "
44
+ f"{values.ndim} dimensions"
45
+ )
43
46
  for i, p in enumerate(points):
44
47
  if not np.asarray(p).ndim == 1:
45
- raise ValueError("The points in dimension %d must be "
46
- "1-dimensional" % i)
48
+ raise ValueError(f"The points in dimension {i} must be 1-dimensional")
47
49
  if not values.shape[i] == len(p):
48
- raise ValueError("There are %d points and %d values in "
49
- "dimension %d" % (len(p), values.shape[i], i))
50
+ raise ValueError(
51
+ f"There are {len(p)} points and {values.shape[i]} values in "
52
+ f"dimension {i}"
53
+ )
50
54
 
51
55
 
52
56
  class RegularGridInterpolator:
53
- """
54
- Interpolator on a regular or rectilinear grid in arbitrary dimensions.
57
+ """Interpolator of specified order on a rectilinear grid in N ≥ 1 dimensions.
55
58
 
56
59
  The data must be defined on a rectilinear grid; that is, a rectangular
57
60
  grid with even or uneven spacing. Linear, nearest-neighbor, spline
@@ -154,6 +157,11 @@ class RegularGridInterpolator:
154
157
  "cubic_legacy" and "quintic_legacy". These methods allow faster construction
155
158
  but evaluations will be much slower.
156
159
 
160
+ **Rounding rule at half points with `nearest` method**
161
+
162
+ The rounding rule with the `nearest` method at half points is rounding *down*.
163
+
164
+
157
165
  Examples
158
166
  --------
159
167
  **Evaluate a function on the points of a 3-D grid**
@@ -459,8 +467,9 @@ class RegularGridInterpolator:
459
467
  for i, p in enumerate(xi.T):
460
468
  if not np.logical_and(np.all(self.grid[i][0] <= p),
461
469
  np.all(p <= self.grid[i][-1])):
462
- raise ValueError("One of the requested xi is out of bounds "
463
- "in dimension %d" % i)
470
+ raise ValueError(
471
+ f"One of the requested xi is out of bounds in dimension {i}"
472
+ )
464
473
  out_of_bounds = None
465
474
  else:
466
475
  out_of_bounds = self._find_out_of_bounds(xi.T)
@@ -611,13 +620,6 @@ def interpn(points, values, xi, method="linear", bounds_error=True,
611
620
  values : array_like, shape (m1, ..., mn, ...)
612
621
  The data on the regular grid in n dimensions. Complex data is
613
622
  accepted.
614
-
615
- .. deprecated:: 1.13.0
616
- Complex data is deprecated with ``method="pchip"`` and will raise an
617
- error in SciPy 1.15.0. This is because ``PchipInterpolator`` only
618
- works with real values. If you are trying to use the real components of
619
- the passed array, use ``np.real`` on ``values``.
620
-
621
623
  xi : ndarray of shape (..., ndim)
622
624
  The coordinates to sample the gridded data at
623
625
 
@@ -710,8 +712,9 @@ def interpn(points, values, xi, method="linear", bounds_error=True,
710
712
 
711
713
  # sanity check consistency of input dimensions
712
714
  if len(points) > ndim:
713
- raise ValueError("There are %d point arrays, but values has %d "
714
- "dimensions" % (len(points), ndim))
715
+ raise ValueError(
716
+ f"There are {len(points)} point arrays, but values has {ndim} dimensions"
717
+ )
715
718
  if len(points) != ndim and method == 'splinef2d':
716
719
  raise ValueError("The method splinef2d can only be used for "
717
720
  "scalar data with one point per coordinate")
@@ -722,16 +725,18 @@ def interpn(points, values, xi, method="linear", bounds_error=True,
722
725
  # sanity check requested xi
723
726
  xi = _ndim_coords_from_arrays(xi, ndim=len(grid))
724
727
  if xi.shape[-1] != len(grid):
725
- raise ValueError("The requested sample points xi have dimension "
726
- "%d, but this RegularGridInterpolator has "
727
- "dimension %d" % (xi.shape[-1], len(grid)))
728
+ raise ValueError(
729
+ f"The requested sample points xi have dimension {xi.shape[-1]}, "
730
+ f"but this RegularGridInterpolator has dimension {len(grid)}"
731
+ )
728
732
 
729
733
  if bounds_error:
730
734
  for i, p in enumerate(xi.T):
731
735
  if not np.logical_and(np.all(grid[i][0] <= p),
732
736
  np.all(p <= grid[i][-1])):
733
- raise ValueError("One of the requested xi is out of bounds "
734
- "in dimension %d" % i)
737
+ raise ValueError(
738
+ f"One of the requested xi is out of bounds in dimension {i}"
739
+ )
735
740
 
736
741
  # perform interpolation
737
742
  if method in RegularGridInterpolator._ALL_METHODS:
@@ -6,31 +6,11 @@ from scipy._lib.deprecation import _sub_module_deprecation
6
6
 
7
7
 
8
8
  __all__ = [ # noqa: F822
9
- 'bispeu',
10
- 'bispev',
11
- 'curfit',
12
- 'dblint',
13
- 'fpchec',
14
- 'fpcurf0',
15
- 'fpcurf1',
16
- 'fpcurfm1',
17
- 'parcur',
18
- 'parder',
19
- 'pardeu',
20
- 'pardtc',
21
- 'percur',
22
- 'regrid_smth',
23
- 'regrid_smth_spher',
24
9
  'spalde',
25
- 'spherfit_lsq',
26
- 'spherfit_smth',
27
10
  'splder',
28
11
  'splev',
29
12
  'splint',
30
13
  'sproot',
31
- 'surfit_lsq',
32
- 'surfit_smth',
33
- 'types',
34
14
  ]
35
15
 
36
16
 
@@ -21,5 +21,4 @@ def __dir__():
21
21
  def __getattr__(name):
22
22
  return _sub_module_deprecation(sub_package="interpolate", module="interpnd",
23
23
  private_modules=["_interpnd"], all=__all__,
24
- attribute=name)
25
-
24
+ attribute=name, dep_version="1.17.0")
@@ -200,8 +200,8 @@ class TestAAA:
200
200
  @pytest.mark.parametrize("func,atol,rtol",
201
201
  [(lambda x: np.abs(x + 0.5 + 0.01j), 5e-13, 1e-7),
202
202
  (lambda x: np.sin(1/(1.05 - x)), 2e-13, 1e-7),
203
- (lambda x: np.exp(-1/(x**2)), 3.5e-13, 0),
204
- (lambda x: np.exp(-100*x**2), 8e-13, 0),
203
+ (lambda x: np.exp(-1/(x**2)), 3.5e-12, 0),
204
+ (lambda x: np.exp(-100*x**2), 2e-12, 0),
205
205
  (lambda x: np.exp(-10/(1.2 - x)), 1e-14, 0),
206
206
  (lambda x: 1/(1+np.exp(100*(x + 0.5))), 2e-13, 1e-7),
207
207
  (lambda x: np.abs(x - 0.95), 1e-6, 1e-7)])
@@ -3,6 +3,7 @@ import operator
3
3
  import itertools
4
4
  import math
5
5
  import threading
6
+ import copy
6
7
 
7
8
  import numpy as np
8
9
  from numpy.testing import suppress_warnings
@@ -671,6 +672,7 @@ class TestBSpline:
671
672
 
672
673
  xp_assert_close(b(xx), expected)
673
674
 
675
+
674
676
  class TestInsert:
675
677
 
676
678
  @pytest.mark.parametrize('xval', [0.0, 1.0, 2.5, 4, 6.5, 7.0])
@@ -2165,7 +2167,7 @@ class TestSmoothingSpline:
2165
2167
  # using an iterative algorithm for minimizing the GCV criteria. These
2166
2168
  # algorithms may vary, so the tolerance should be rather low.
2167
2169
  # Not checking dtypes as gcvspl.npz stores little endian arrays, which
2168
- # result in conflicting dtypes on big endian systems.
2170
+ # result in conflicting dtypes on big endian systems.
2169
2171
  xp_assert_close(y_compr, y_GCVSPL, atol=1e-4, rtol=1e-4, check_dtype=False)
2170
2172
 
2171
2173
  def test_non_regularized_case(self):
@@ -2375,6 +2377,11 @@ class TestNdBSpline:
2375
2377
  xp_assert_close(bspl2(xi),
2376
2378
  target, atol=1e-14)
2377
2379
 
2380
+ # test that a nan in -> nan out
2381
+ xi = np.asarray(xi)
2382
+ xi[0, 1] = np.nan
2383
+ xp_assert_equal(np.isnan(bspl2(xi)), np.asarray([True, False, False]))
2384
+
2378
2385
  # now check on a multidim xi
2379
2386
  rng = np.random.default_rng(12345)
2380
2387
  xi = rng.uniform(size=(4, 3, 2)) * 5
@@ -2826,6 +2833,15 @@ class TestMakeND:
2826
2833
  bspl = make_ndbspl((x, y), values, k=k, solver=ssl.spsolve)
2827
2834
  xp_assert_close(bspl(xi), values.ravel(), atol=1e-15)
2828
2835
 
2836
+ def test_2D_nans(self):
2837
+ x = np.arange(6)
2838
+ y = np.arange(6) + 0.5
2839
+ y[-1] = np.nan
2840
+ values = x[:, None]**3 * (y**3 + 2*y)[None, :]
2841
+
2842
+ with assert_raises(ValueError):
2843
+ make_ndbspl((x, y), values, k=1)
2844
+
2829
2845
  def _get_sample_2d_data(self):
2830
2846
  # from test_rgi.py::TestIntepN
2831
2847
  x = np.array([.5, 2., 3., 4., 5.5, 6.])
@@ -3517,6 +3533,20 @@ class TestMakeSplrep:
3517
3533
  xp_assert_close(np.r_[spl.c, [0]*(spl.k+1)],
3518
3534
  tck[1], atol=5e-13)
3519
3535
 
3536
+ def test_issue_22704(self):
3537
+ # Reference - https://github.com/scipy/scipy/issues/22704
3538
+ x = np.asarray([20.00, 153.81, 175.57, 202.47, 237.11,
3539
+ 253.61, 258.56, 273.40, 284.54, 293.61,
3540
+ 298.56, 301.86, 305.57, 307.22, 308.45,
3541
+ 310.10, 310.10, 310.50], dtype=np.float64)
3542
+ y = np.asarray([53.00, 49.50, 48.60, 46.80, 43.20,
3543
+ 40.32, 39.60, 36.00, 32.40, 28.80,
3544
+ 25.20, 21.60, 18.00, 14.40, 10.80,
3545
+ 7.20, 3.60, 0.0], dtype=np.float64)
3546
+ w = np.asarray([1.38723] * y.shape[0], dtype=np.float64)
3547
+ with assert_raises(ValueError):
3548
+ make_splrep(x, y, w=w, k=2, s=12)
3549
+
3520
3550
  def test_shape(self):
3521
3551
  # make sure coefficients have the right shape (not extra dims)
3522
3552
  n, k = 10, 3
@@ -3656,3 +3686,69 @@ class TestMakeSplprep:
3656
3686
  assert spl(u).shape == (1, 8)
3657
3687
  xp_assert_close(spl(u), [x], atol=1e-15)
3658
3688
 
3689
+
3690
+ class BatchSpline:
3691
+ # BSpline-line class with reference batch behavior
3692
+ def __init__(self, x, y, axis, *, spline, **kwargs):
3693
+ y = np.moveaxis(y, axis, -1)
3694
+ self._batch_shape = y.shape[:-1]
3695
+ self._splines = [spline(x, yi, **kwargs) for yi in y.reshape(-1, y.shape[-1])]
3696
+ self._axis = axis
3697
+
3698
+ def __call__(self, x):
3699
+ y = [spline(x) for spline in self._splines]
3700
+ y = np.reshape(y, self._batch_shape + x.shape)
3701
+ return np.moveaxis(y, -1, self._axis) if x.shape else y
3702
+
3703
+ def integrate(self, a, b, extrapolate=None):
3704
+ y = [spline.integrate(a, b, extrapolate) for spline in self._splines]
3705
+ return np.reshape(y, self._batch_shape)
3706
+
3707
+ def derivative(self, nu):
3708
+ res = copy.deepcopy(self)
3709
+ res._splines = [spline.derivative(nu) for spline in res._splines]
3710
+ return res
3711
+
3712
+ def antiderivative(self, nu):
3713
+ res = copy.deepcopy(self)
3714
+ res._splines = [spline.antiderivative(nu) for spline in res._splines]
3715
+ return res
3716
+
3717
+
3718
+ class TestBatch:
3719
+ @pytest.mark.parametrize('make_spline, kwargs',
3720
+ [(make_interp_spline, {}),
3721
+ (make_smoothing_spline, {}),
3722
+ (make_smoothing_spline, {'lam': 1.0}),
3723
+ (make_lsq_spline, {'method': "norm-eq"}),
3724
+ (make_lsq_spline, {'method': "qr"}),
3725
+ ])
3726
+ @pytest.mark.parametrize('eval_shape', [(), (1,), (3,)])
3727
+ @pytest.mark.parametrize('axis', [-1, 0, 1])
3728
+ def test_batch(self, make_spline, kwargs, axis, eval_shape):
3729
+ rng = np.random.default_rng(4329872134985134)
3730
+ n = 10
3731
+ shape = (2, 3, 4, n)
3732
+ domain = (0, 10)
3733
+
3734
+ x = np.linspace(*domain, n)
3735
+ y = np.moveaxis(rng.random(shape), -1, axis)
3736
+
3737
+ if make_spline == make_lsq_spline:
3738
+ k = 3 # spline degree, if needed
3739
+ t = (x[0],) * (k + 1) + (x[-1],) * (k + 1) # valid knots, if needed
3740
+ kwargs = kwargs | dict(t=t, k=k)
3741
+
3742
+ res = make_spline(x, y, axis=axis, **kwargs)
3743
+ ref = BatchSpline(x, y, axis=axis, spline=make_spline, **kwargs)
3744
+
3745
+ x = rng.uniform(*domain, size=eval_shape)
3746
+ np.testing.assert_allclose(res(x), ref(x))
3747
+
3748
+ res, ref = res.antiderivative(1), ref.antiderivative(1)
3749
+ np.testing.assert_allclose(res(x), ref(x))
3750
+
3751
+ res, ref = res.derivative(2), ref.derivative(2)
3752
+ np.testing.assert_allclose(res(x), ref(x))
3753
+
3754
+ np.testing.assert_allclose(res.integrate(*domain), ref.integrate(*domain))
@@ -1,6 +1,6 @@
1
1
  # Created by Pearu Peterson, June 2003
2
2
  import itertools
3
- from threading import Lock
3
+ import sys
4
4
  import numpy as np
5
5
  from numpy.testing import suppress_warnings
6
6
  import pytest
@@ -1132,6 +1132,44 @@ class TestRectBivariateSpline:
1132
1132
  Interpolator(GridPosLats, nonGridPosLons)
1133
1133
  assert "y must be strictly increasing" in str(exc_info.value)
1134
1134
 
1135
+ def _sample_large_2d_data(self, nx, ny):
1136
+ rng = np.random.default_rng(1)
1137
+ x = np.arange(nx)
1138
+ y = np.arange(ny)
1139
+ z = rng.integers(0, 100, (nx, ny))
1140
+
1141
+ return x, y, z.astype(np.float64)
1142
+
1143
+ @pytest.mark.slow()
1144
+ @pytest.mark.parametrize('shape', [(350, 850), (2000, 170)])
1145
+ @pytest.mark.parametrize('s_tols', [(0, 1e-12, 1e-7),
1146
+ (1, 7e-3, 1e-4),
1147
+ (3, 2e-2, 1e-4)])
1148
+ def test_spline_large_2d(self, shape, s_tols):
1149
+ # Reference - https://github.com/scipy/scipy/issues/17787
1150
+ nx, ny = shape
1151
+ s, atol, rtol = s_tols
1152
+ x, y, z = self._sample_large_2d_data(nx, ny)
1153
+
1154
+ spl = RectBivariateSpline(x, y, z, s=s)
1155
+ z_spl = spl(x, y)
1156
+ assert(not np.isnan(z_spl).any())
1157
+ xp_assert_close(z_spl, z, atol=atol, rtol=rtol)
1158
+
1159
+ @pytest.mark.slow()
1160
+ @pytest.mark.skipif(sys.maxsize <= 2**32, reason="Segfaults on 32-bit system "
1161
+ "due to large input data")
1162
+ def test_spline_large_2d_maxit(self):
1163
+ # Reference - for https://github.com/scipy/scipy/issues/17787
1164
+ nx, ny = 1000, 1700
1165
+ s, atol, rtol = 2, 2e-2, 1e-12
1166
+ x, y, z = self._sample_large_2d_data(nx, ny)
1167
+
1168
+ spl = RectBivariateSpline(x, y, z, s=s, maxit=25)
1169
+ z_spl = spl(x, y)
1170
+ assert(not np.isnan(z_spl).any())
1171
+ xp_assert_close(z_spl, z, atol=atol, rtol=rtol)
1172
+
1135
1173
 
1136
1174
  class TestRectSphereBivariateSpline:
1137
1175
  def test_defaults(self):