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
@@ -1,4 +1,5 @@
1
1
  from itertools import product
2
+ from multiprocessing import Pool
2
3
 
3
4
  import numpy as np
4
5
  from numpy.linalg import norm
@@ -6,13 +7,14 @@ from numpy.testing import (assert_, assert_allclose,
6
7
  assert_equal, suppress_warnings)
7
8
  import pytest
8
9
  from pytest import raises as assert_raises
9
- from scipy.sparse import issparse, lil_matrix
10
+ from scipy.sparse import issparse, lil_array
10
11
  from scipy.sparse.linalg import aslinearoperator
11
12
 
12
13
  from scipy.optimize import least_squares, Bounds
13
14
  from scipy.optimize._lsq.least_squares import IMPLEMENTED_LOSSES
14
15
  from scipy.optimize._lsq.common import EPS, make_strictly_feasible, CL_scaling_vector
15
16
 
17
+ from scipy.optimize import OptimizeResult
16
18
 
17
19
  def fun_trivial(x, a=0):
18
20
  return (x - a)**2 + 5.0
@@ -34,6 +36,15 @@ def fun_rosenbrock(x):
34
36
  return np.array([10 * (x[1] - x[0]**2), (1 - x[0])])
35
37
 
36
38
 
39
+ class Fun_Rosenbrock:
40
+ def __init__(self):
41
+ self.nfev = 0
42
+
43
+ def __call__(self, x, a=0):
44
+ self.nfev += 1
45
+ return fun_rosenbrock(x)
46
+
47
+
37
48
  def jac_rosenbrock(x):
38
49
  return np.array([
39
50
  [-20 * x[0], 10],
@@ -92,7 +103,7 @@ class BroydenTridiagonal:
92
103
  self.x0 = make_strictly_feasible(self.x0, self.lb, self.ub)
93
104
 
94
105
  if mode == 'sparse':
95
- self.sparsity = lil_matrix((n, n), dtype=int)
106
+ self.sparsity = lil_array((n, n), dtype=int)
96
107
  i = np.arange(n)
97
108
  self.sparsity[i, i] = 1
98
109
  i = np.arange(1, n)
@@ -116,7 +127,7 @@ class BroydenTridiagonal:
116
127
  return f
117
128
 
118
129
  def _jac(self, x):
119
- J = lil_matrix((self.n, self.n))
130
+ J = lil_array((self.n, self.n))
120
131
  i = np.arange(self.n)
121
132
  J[i, i] = 3 - 2 * x
122
133
  i = np.arange(1, self.n)
@@ -227,25 +238,17 @@ class BaseMixin:
227
238
  2.0, x_scale='auto', method=self.method)
228
239
  assert_raises(ValueError, least_squares, fun_trivial,
229
240
  2.0, x_scale=-1.0, method=self.method)
230
- assert_raises(ValueError, least_squares, fun_trivial,
231
- 2.0, x_scale=None, method=self.method)
232
241
  assert_raises(ValueError, least_squares, fun_trivial,
233
242
  2.0, x_scale=1.0+2.0j, method=self.method)
234
243
 
235
244
  def test_diff_step(self):
236
- # res1 and res2 should be equivalent.
237
- # res2 and res3 should be different.
238
245
  res1 = least_squares(fun_trivial, 2.0, diff_step=1e-1,
239
246
  method=self.method)
240
- res2 = least_squares(fun_trivial, 2.0, diff_step=-1e-1,
241
- method=self.method)
242
247
  res3 = least_squares(fun_trivial, 2.0,
243
248
  diff_step=None, method=self.method)
244
249
  assert_allclose(res1.x, 0, atol=1e-4)
245
- assert_allclose(res2.x, 0, atol=1e-4)
246
250
  assert_allclose(res3.x, 0, atol=1e-4)
247
- assert_equal(res1.x, res2.x)
248
- assert_equal(res1.nfev, res2.nfev)
251
+
249
252
 
250
253
  def test_incorrect_options_usage(self):
251
254
  assert_raises(TypeError, least_squares, fun_trivial, 2.0,
@@ -265,7 +268,6 @@ class BaseMixin:
265
268
  assert_allclose(res.optimality, 0, atol=1e-2)
266
269
  assert_equal(res.active_mask, 0)
267
270
  if self.method == 'lm':
268
- assert_(res.nfev < 30)
269
271
  assert_(res.njev is None)
270
272
  else:
271
273
  assert_(res.nfev < 10)
@@ -293,6 +295,17 @@ class BaseMixin:
293
295
  assert_equal(res.status, 0)
294
296
  assert_equal(res.success, 0)
295
297
 
298
+ def test_nfev(self):
299
+ # checks that the true number of nfev are being consumed
300
+ for i in range(1, 3):
301
+ rng = np.random.default_rng(128908)
302
+ x0 = rng.uniform(size=2) * 10
303
+ ftrivial = Fun_Rosenbrock()
304
+ res = least_squares(
305
+ ftrivial, x0, jac=jac_rosenbrock, method=self.method, max_nfev=i
306
+ )
307
+ assert res.nfev == ftrivial.nfev
308
+
296
309
  def test_rosenbrock(self):
297
310
  x0 = [-2, 1]
298
311
  x_opt = [1, 1]
@@ -387,6 +400,27 @@ class BaseMixin:
387
400
  method=self.method)
388
401
  assert_allclose(res.x, x_opt)
389
402
 
403
+ @pytest.mark.fail_slow(5.0)
404
+ def test_workers(self):
405
+ serial = least_squares(fun_trivial, 2.0, method=self.method)
406
+
407
+ reses = []
408
+ for workers in [None, 2]:
409
+ res = least_squares(
410
+ fun_trivial, 2.0, method=self.method, workers=workers
411
+ )
412
+ reses.append(res)
413
+ with Pool() as workers:
414
+ res = least_squares(
415
+ fun_trivial, 2.0, method=self.method, workers=workers.map
416
+ )
417
+ reses.append(res)
418
+ for res in reses:
419
+ assert res.success
420
+ assert_equal(res.x, serial.x)
421
+ assert_equal(res.nfev, serial.nfev)
422
+ assert_equal(res.njev, serial.njev)
423
+
390
424
 
391
425
  class BoundsMixin:
392
426
  def test_inconsistent(self):
@@ -779,6 +813,17 @@ class TestLM(BaseMixin):
779
813
 
780
814
  assert_raises(ValueError, least_squares, fun_trivial, 2.0,
781
815
  method='lm', loss='huber')
816
+
817
+ def test_callback_with_lm_method(self):
818
+ def callback(x):
819
+ assert(False) # Dummy callback function
820
+
821
+ with suppress_warnings() as sup:
822
+ sup.filter(
823
+ UserWarning,
824
+ "Callback function specified, but not supported with `lm` method."
825
+ )
826
+ least_squares(fun_trivial, x0=[0], method='lm', callback=callback)
782
827
 
783
828
 
784
829
  def test_basic():
@@ -787,6 +832,73 @@ def test_basic():
787
832
  assert_allclose(res.x, 0, atol=1e-10)
788
833
 
789
834
 
835
+ def test_callback():
836
+ # test that callback function works as expected
837
+
838
+ results = []
839
+
840
+ def my_callback_optimresult(intermediate_result: OptimizeResult):
841
+ results.append(intermediate_result)
842
+
843
+ def my_callback_x(x):
844
+ r = OptimizeResult()
845
+ r.nit = 1
846
+ r.x = x
847
+ results.append(r)
848
+ return False
849
+
850
+ def my_callback_optimresult_stop_exception(
851
+ intermediate_result: OptimizeResult):
852
+ results.append(intermediate_result)
853
+ raise StopIteration
854
+
855
+ def my_callback_x_stop_exception(x):
856
+ r = OptimizeResult()
857
+ r.nit = 1
858
+ r.x = x
859
+ results.append(r)
860
+ raise StopIteration
861
+
862
+ # Try for different function signatures and stop methods
863
+ callbacks_nostop = [my_callback_optimresult, my_callback_x]
864
+ callbacks_stop = [my_callback_optimresult_stop_exception,
865
+ my_callback_x_stop_exception]
866
+
867
+ # Try for all the implemented methods: trf, trf_bounds and dogbox
868
+ calls = [
869
+ lambda callback: least_squares(fun_trivial, 5.0, method='trf',
870
+ callback=callback),
871
+ lambda callback: least_squares(fun_trivial, 5.0, method='trf',
872
+ bounds=(-8.0, 8.0), callback=callback),
873
+ lambda callback: least_squares(fun_trivial, 5.0, method='dogbox',
874
+ callback=callback)
875
+ ]
876
+
877
+ for mycallback, call in product(callbacks_nostop, calls):
878
+ results.clear()
879
+ # Call the different implemented methods
880
+ res = call(mycallback)
881
+ # Check that callback was called
882
+ assert len(results) > 0
883
+ # Check that results data makes sense
884
+ assert results[-1].nit > 0
885
+ # Check that it didn't stop because of the callback
886
+ assert res.status != -2
887
+ # final callback x should be same as final result
888
+ assert_allclose(results[-1].x, res.x)
889
+
890
+ for mycallback, call in product(callbacks_stop, calls):
891
+ results.clear()
892
+ # Call the different implemented methods
893
+ res = call(mycallback)
894
+ # Check that callback was called
895
+ assert len(results) > 0
896
+ # Check that only one iteration was run
897
+ assert results[-1].nit == 1
898
+ # Check that it stopped because of the callback
899
+ assert res.status == -2
900
+
901
+
790
902
  def test_small_tolerances_for_lm():
791
903
  for ftol, xtol, gtol in [(None, 1e-13, 1e-13),
792
904
  (1e-13, None, 1e-13),
@@ -7,7 +7,7 @@ import pytest
7
7
  import numpy as np
8
8
 
9
9
  from scipy.optimize import linear_sum_assignment
10
- from scipy.sparse import random
10
+ from scipy.sparse import random_array
11
11
  from scipy.sparse._sputils import matrix
12
12
  from scipy.sparse.csgraph import min_weight_full_bipartite_matching
13
13
  from scipy.sparse.csgraph.tests.test_matching import (
@@ -93,8 +93,8 @@ def test_two_methods_give_same_result_on_many_sparse_inputs():
93
93
  for _ in range(100):
94
94
  lsa_raises = False
95
95
  mwfbm_raises = False
96
- sparse = random(100, 100, density=0.06,
97
- data_rvs=lambda size: np.random.randint(1, 100, size))
96
+ sparse = random_array((100, 100), density=0.06,
97
+ data_sampler=lambda size: np.random.randint(1, 100, size))
98
98
  # In csgraph, zeros correspond to missing edges, so we explicitly
99
99
  # replace those with infinities
100
100
  dense = np.full(sparse.shape, np.inf)
@@ -5,6 +5,7 @@ import sys
5
5
  import platform
6
6
 
7
7
  import numpy as np
8
+ from numpy.exceptions import VisibleDeprecationWarning
8
9
  from numpy.testing import (assert_, assert_allclose, assert_equal,
9
10
  assert_array_less, assert_warns, suppress_warnings)
10
11
  from pytest import raises as assert_raises
@@ -12,7 +13,6 @@ from scipy.optimize import linprog, OptimizeWarning
12
13
  from scipy.optimize._numdiff import approx_derivative
13
14
  from scipy.sparse.linalg import MatrixRankWarning
14
15
  from scipy.linalg import LinAlgWarning
15
- from scipy._lib._util import VisibleDeprecationWarning
16
16
  import scipy.sparse
17
17
  import pytest
18
18
 
@@ -220,7 +220,7 @@ def l1_regression_prob(seed=0, m=8, d=9, n=100):
220
220
  # construct the problem
221
221
  c = np.ones(m+n)
222
222
  c[:m] = 0
223
- A_ub = scipy.sparse.lil_matrix((2*n, n+m))
223
+ A_ub = scipy.sparse.lil_array((2*n, n+m))
224
224
  idx = 0
225
225
  for ii in range(n):
226
226
  A_ub[idx, :m] = phi @ x[:, ii]
@@ -519,7 +519,7 @@ class LinprogCommonTests:
519
519
  rng = np.random.RandomState(0)
520
520
  m = 100
521
521
  n = 150
522
- A_eq = scipy.sparse.rand(m, n, 0.5)
522
+ A_eq = scipy.sparse.random_array((m, n), density=0.5)
523
523
  x_valid = rng.randn(n)
524
524
  c = rng.randn(n)
525
525
  ub = x_valid + rng.rand(n)
@@ -4,7 +4,7 @@ import numpy as np
4
4
  from numpy.linalg import lstsq
5
5
  from numpy.testing import assert_allclose, assert_equal, assert_
6
6
 
7
- from scipy.sparse import rand, coo_matrix
7
+ from scipy.sparse import random_array, coo_array
8
8
  from scipy.sparse.linalg import aslinearoperator
9
9
  from scipy.optimize import lsq_linear
10
10
  from scipy.optimize._minimize import Bounds
@@ -177,7 +177,7 @@ class BaseMixin:
177
177
 
178
178
  assert_(abs(cost_bvls - cost_trf) < cost_trf*1e-10)
179
179
 
180
- def test_convergence_small_matrix(self):
180
+ def test_convergence_small_array(self):
181
181
  A = np.array([[49.0, 41.0, -32.0],
182
182
  [-19.0, -32.0, -8.0],
183
183
  [-13.0, 10.0, 69.0]])
@@ -199,7 +199,7 @@ class SparseMixin:
199
199
  m = 5000
200
200
  n = 1000
201
201
  rng = np.random.RandomState(0)
202
- A = rand(m, n, random_state=rng)
202
+ A = random_array((m, n), random_state=rng)
203
203
  b = rng.randn(m)
204
204
  res = lsq_linear(A, b)
205
205
  assert_allclose(res.optimality, 0, atol=1e-6)
@@ -213,7 +213,7 @@ class SparseMixin:
213
213
  m = 5000
214
214
  n = 1000
215
215
  rng = np.random.RandomState(0)
216
- A = rand(m, n, random_state=rng)
216
+ A = random_array((m, n), random_state=rng)
217
217
  b = rng.randn(m)
218
218
  lb = rng.randn(n)
219
219
  ub = lb + 1
@@ -232,14 +232,14 @@ class SparseMixin:
232
232
  data = np.array([1., 1., 1., 1. + 1e-6, 1.])
233
233
  row = np.array([0, 0, 1, 2, 2])
234
234
  col = np.array([0, 2, 1, 0, 2])
235
- A = coo_matrix((data, (row, col)), shape=(3, 3))
235
+ A = coo_array((data, (row, col)), shape=(3, 3))
236
236
 
237
237
  # Get the exact solution
238
238
  exact_sol = lsq_linear(A.toarray(), b, lsq_solver='exact')
239
239
 
240
240
  # Default lsmr arguments should not fully converge the solution
241
241
  default_lsmr_sol = lsq_linear(A, b, lsq_solver='lsmr')
242
- with pytest.raises(AssertionError, match=""):
242
+ with pytest.raises(AssertionError):
243
243
  assert_allclose(exact_sol.x, default_lsmr_sol.x)
244
244
 
245
245
  # By increasing the maximum lsmr iters, it will converge
@@ -1,7 +1,7 @@
1
1
  import numpy as np
2
2
  import pytest
3
3
  from scipy.linalg import block_diag
4
- from scipy.sparse import csc_matrix
4
+ from scipy.sparse import csc_array
5
5
  from numpy.testing import (assert_array_almost_equal,
6
6
  assert_array_less, assert_,
7
7
  suppress_warnings)
@@ -430,7 +430,7 @@ class Elec:
430
430
  Jx = 2 * np.diag(x_coord)
431
431
  Jy = 2 * np.diag(y_coord)
432
432
  Jz = 2 * np.diag(z_coord)
433
- return csc_matrix(np.hstack((Jx, Jy, Jz)))
433
+ return csc_array(np.hstack((Jx, Jy, Jz)))
434
434
  else:
435
435
  jac = self.constr_jac
436
436
 
@@ -308,7 +308,7 @@ class TestLeastSq:
308
308
  p0 = array([0,0,0])
309
309
  params_fit, ier = leastsq(self.residuals, p0,
310
310
  args=(self.y_meas, self.x))
311
- assert_(ier in (1,2,3,4), 'solution not found (ier=%d)' % ier)
311
+ assert_(ier in (1, 2, 3, 4), f'solution not found (ier={ier})')
312
312
  # low precision due to random
313
313
  assert_array_almost_equal(params_fit, self.abc, decimal=2)
314
314
 
@@ -317,7 +317,7 @@ class TestLeastSq:
317
317
  params_fit, ier = leastsq(self.residuals, p0,
318
318
  args=(self.y_meas, self.x),
319
319
  Dfun=self.residuals_jacobian)
320
- assert_(ier in (1,2,3,4), 'solution not found (ier=%d)' % ier)
320
+ assert_(ier in (1, 2, 3, 4), f'solution not found (ier={ier})')
321
321
  # low precision due to random
322
322
  assert_array_almost_equal(params_fit, self.abc, decimal=2)
323
323
 
@@ -405,7 +405,7 @@ class TestLeastSq:
405
405
  p0 = array([0,0,0])
406
406
  params_fit, ier = leastsq(func, p0,
407
407
  args=(self.y_meas, self.x))
408
- assert_(ier in (1,2,3,4), 'solution not found (ier=%d)' % ier)
408
+ assert_(ier in (1, 2, 3, 4), f'solution not found (ier={ier})')
409
409
  # low precision due to random
410
410
  assert_array_almost_equal(params_fit, self.abc, decimal=2)
411
411
 
@@ -418,7 +418,7 @@ class TestLeastSq:
418
418
  params_fit, ier = leastsq(self.residuals, p0,
419
419
  args=(self.y_meas, self.x),
420
420
  Dfun=deriv_func)
421
- assert_(ier in (1,2,3,4), 'solution not found (ier=%d)' % ier)
421
+ assert_(ier in (1, 2, 3, 4), f'solution not found (ier={ier})')
422
422
  # low precision due to random
423
423
  assert_array_almost_equal(params_fit, self.abc, decimal=2)
424
424
 
@@ -2,6 +2,7 @@ import numpy as np
2
2
  from numpy.testing import assert_allclose
3
3
  from pytest import raises as assert_raises
4
4
  from scipy.optimize import nnls
5
+ import pytest
5
6
 
6
7
 
7
8
  class TestNNLS:
@@ -21,7 +22,7 @@ class TestNNLS:
21
22
  x = np.abs(self.rng.uniform(low=-2, high=2, size=[10]))
22
23
  x[::2] = 0
23
24
  b = a @ x
24
- xact, rnorm = nnls(a, b, atol=500*np.linalg.norm(a, 1)*np.spacing(1.))
25
+ xact, rnorm = nnls(a, b)
25
26
  assert_allclose(xact, x, rtol=0., atol=1e-10)
26
27
  assert rnorm < 1e-12
27
28
 
@@ -32,7 +33,7 @@ class TestNNLS:
32
33
  x = np.abs(self.rng.uniform(low=-2, high=2, size=[120]))
33
34
  x[::2] = 0
34
35
  b = a @ x
35
- xact, rnorm = nnls(a, b, atol=500*np.linalg.norm(a, 1)*np.spacing(1.))
36
+ xact, rnorm = nnls(a, b)
36
37
  assert_allclose(xact, x, rtol=0., atol=1e-10)
37
38
  assert rnorm < 1e-12
38
39
 
@@ -153,7 +154,7 @@ class TestNNLS:
153
154
  k[nz] = 0
154
155
  W = np.diag(w)
155
156
 
156
- dact, _ = nnls(W @ A, W @ k, atol=1e-7)
157
+ dact, _ = nnls(W @ A, W @ k)
157
158
 
158
159
  p = np.cumsum(dact)
159
160
  assert np.all(dact >= 0)
@@ -427,3 +428,42 @@ class TestNNLS:
427
428
  assert_allclose(sol, np.array([0.0, 0.0, 76.3611306173957, 0.0, 0.0]),
428
429
  atol=5e-14)
429
430
  assert np.abs(np.linalg.norm(A@sol - b) - res) < 5e-14
431
+
432
+ def test_atol_deprecation_warning(self):
433
+ """Test that using atol parameter triggers deprecation warning"""
434
+ a = np.array([[1, 0], [1, 0], [0, 1]])
435
+ b = np.array([2, 1, 1])
436
+
437
+ with pytest.warns(DeprecationWarning, match="{'atol'}"):
438
+ nnls(a, b, atol=1e-8)
439
+
440
+ def test_2D_singleton_RHS_input(self):
441
+ # Test that a 2D singleton RHS input is accepted
442
+ A = np.array([[1.0, 0.5, -1.],
443
+ [1.0, 0.5, 0.0],
444
+ [-1., 0.0, 1.0]])
445
+ b = np.array([[-1.0, 2.0, 2.0]]).T
446
+ x, r = nnls(A, b)
447
+ assert_allclose(x, np.array([1.0, 2.0, 3.0]))
448
+ assert_allclose(r, 0.0)
449
+
450
+ def test_2D_not_singleton_RHS_input_2(self):
451
+ # Test that a 2D but not a column vector RHS input is rejected
452
+ A = np.array([[1.0, 0.5, -1.],
453
+ [1.0, 0.5, 0.0],
454
+ [1.0, 0.5, 0.0],
455
+ [0.0, 0.0, 1.0]])
456
+ b = np.ones(shape=[4, 2], dtype=np.float64)
457
+ with pytest.raises(ValueError, match="Expected a 1D array"):
458
+ nnls(A, b)
459
+
460
+ def test_gh_22791_32bit(self):
461
+ # Scikit-learn got hit by this problem on 32-bit arch.
462
+ desired = [0, 0, 1.05617285, 0, 0, 0, 0, 0.23123048, 0, 0, 0, 0.26128651]
463
+ rng = np.random.RandomState(42)
464
+ n_samples, n_features = 5, 12
465
+ X = rng.randn(n_samples, n_features)
466
+ X[:2, :] = 0
467
+ y = rng.randn(n_samples)
468
+ coef, _ = nnls(X, y)
469
+ assert_allclose(coef, desired)
@@ -12,6 +12,7 @@ from numpy import diag, dot
12
12
  from numpy.linalg import inv
13
13
  import numpy as np
14
14
  import scipy
15
+ from scipy.sparse.linalg import minres
15
16
 
16
17
  from .test_minpack import pressure_network
17
18
 
@@ -217,6 +218,41 @@ class TestNonlin:
217
218
  with pytest.raises(scipy.optimize.NoConvergence):
218
219
  nonlin.newton_krylov(wont_converge, xin=[0], maxiter=1)
219
220
 
221
+ def test_warnings_invalid_inner_param(self):
222
+ """
223
+ Test for ENH #21986, for behavior of `nonlin.newton_krylov`
224
+ Test the following scenarios:
225
+ 1. Raise warning for invalid inner param
226
+ 2. No warning for valid inner param
227
+ 3. No warning for user-provided callable method
228
+ """
229
+ # This should raise exactly one warning
230
+ # (`inner_atol` is not valid for `minres`)
231
+ with pytest.warns(UserWarning,
232
+ match="Please check inner method documentation"):
233
+ nonlin.newton_krylov(F, F.xin, method="minres", inner_atol=1e-5)
234
+
235
+ # This should not raise a warning (`minres` without `inner_atol`,
236
+ # but with `inner_maxiter` which is valid)
237
+ nonlin.newton_krylov(F, F.xin, method="minres", inner_maxiter=100,
238
+ inner_callback= lambda _ : ...)
239
+
240
+ # Test newton_krylov with a user-provided callable method
241
+ def user_provided_callable_method_enh_21986(op, rhs, **kwargs):
242
+ """A dummy user-provided callable method for testing."""
243
+ # Return a dummy result (mimicking minres)
244
+ return minres(op, rhs, **kwargs)
245
+ # This should not raise any warnings
246
+ nonlin.newton_krylov(F, F.xin,
247
+ method=user_provided_callable_method_enh_21986)
248
+
249
+ def test_non_inner_prefix(self):
250
+ with pytest.raises(ValueError,
251
+ match="Unknown parameter"
252
+ ):
253
+ # Pass a parameter without 'inner_' prefix
254
+ nonlin.newton_krylov(F, F.xin, method="minres", invalid_param=1e-5)
255
+
220
256
 
221
257
  class TestSecant:
222
258
  """Check that some Jacobian approximations satisfy the secant condition"""