scipy 1.15.3__cp312-cp312-win_amd64.whl → 1.16.0__cp312-cp312-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (760) hide show
  1. scipy/__config__.py +8 -8
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cp312-win_amd64.dll.a +0 -0
  4. scipy/_cyutility.cp312-win_amd64.pyd +0 -0
  5. scipy/_lib/_array_api.py +486 -161
  6. scipy/_lib/_array_api_compat_vendor.py +9 -0
  7. scipy/_lib/_bunch.py +4 -0
  8. scipy/_lib/_ccallback_c.cp312-win_amd64.dll.a +0 -0
  9. scipy/_lib/_ccallback_c.cp312-win_amd64.pyd +0 -0
  10. scipy/_lib/_docscrape.py +1 -1
  11. scipy/_lib/_elementwise_iterative_method.py +15 -26
  12. scipy/_lib/_fpumode.cp312-win_amd64.dll.a +0 -0
  13. scipy/_lib/_fpumode.cp312-win_amd64.pyd +0 -0
  14. scipy/_lib/_sparse.py +41 -0
  15. scipy/_lib/_test_ccallback.cp312-win_amd64.dll.a +0 -0
  16. scipy/_lib/_test_ccallback.cp312-win_amd64.pyd +0 -0
  17. scipy/_lib/_test_deprecation_call.cp312-win_amd64.dll.a +0 -0
  18. scipy/_lib/_test_deprecation_call.cp312-win_amd64.pyd +0 -0
  19. scipy/_lib/_test_deprecation_def.cp312-win_amd64.dll.a +0 -0
  20. scipy/_lib/_test_deprecation_def.cp312-win_amd64.pyd +0 -0
  21. scipy/_lib/_testutils.py +6 -2
  22. scipy/_lib/_uarray/_uarray.cp312-win_amd64.dll.a +0 -0
  23. scipy/_lib/_uarray/_uarray.cp312-win_amd64.pyd +0 -0
  24. scipy/_lib/_util.py +222 -125
  25. scipy/_lib/array_api_compat/__init__.py +4 -4
  26. scipy/_lib/array_api_compat/_internal.py +19 -6
  27. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  28. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  29. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  30. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  31. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  32. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  33. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  34. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  35. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  36. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  37. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  38. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  39. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  40. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  41. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  42. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  43. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  44. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  45. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  46. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  47. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  48. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  49. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  50. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  51. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  52. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  53. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  54. scipy/_lib/array_api_extra/__init__.py +26 -3
  55. scipy/_lib/array_api_extra/_delegation.py +171 -0
  56. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  57. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  58. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  59. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  60. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  61. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  62. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  63. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  64. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  65. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  66. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  67. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  68. scipy/_lib/array_api_extra/testing.py +359 -0
  69. scipy/_lib/decorator.py +2 -2
  70. scipy/_lib/doccer.py +1 -7
  71. scipy/_lib/messagestream.cp312-win_amd64.dll.a +0 -0
  72. scipy/_lib/messagestream.cp312-win_amd64.pyd +0 -0
  73. scipy/_lib/pyprima/__init__.py +212 -0
  74. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  75. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  76. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  77. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  78. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  79. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  80. scipy/_lib/pyprima/cobyla/update.py +289 -0
  81. scipy/_lib/pyprima/common/__init__.py +0 -0
  82. scipy/_lib/pyprima/common/_bounds.py +34 -0
  83. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  84. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  85. scipy/_lib/pyprima/common/_project.py +173 -0
  86. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  87. scipy/_lib/pyprima/common/consts.py +47 -0
  88. scipy/_lib/pyprima/common/evaluate.py +99 -0
  89. scipy/_lib/pyprima/common/history.py +38 -0
  90. scipy/_lib/pyprima/common/infos.py +30 -0
  91. scipy/_lib/pyprima/common/linalg.py +435 -0
  92. scipy/_lib/pyprima/common/message.py +290 -0
  93. scipy/_lib/pyprima/common/powalg.py +131 -0
  94. scipy/_lib/pyprima/common/preproc.py +277 -0
  95. scipy/_lib/pyprima/common/present.py +5 -0
  96. scipy/_lib/pyprima/common/ratio.py +54 -0
  97. scipy/_lib/pyprima/common/redrho.py +47 -0
  98. scipy/_lib/pyprima/common/selectx.py +296 -0
  99. scipy/_lib/tests/test__util.py +105 -121
  100. scipy/_lib/tests/test_array_api.py +166 -35
  101. scipy/_lib/tests/test_bunch.py +7 -0
  102. scipy/_lib/tests/test_ccallback.py +2 -10
  103. scipy/_lib/tests/test_public_api.py +13 -0
  104. scipy/cluster/_hierarchy.cp312-win_amd64.dll.a +0 -0
  105. scipy/cluster/_hierarchy.cp312-win_amd64.pyd +0 -0
  106. scipy/cluster/_optimal_leaf_ordering.cp312-win_amd64.dll.a +0 -0
  107. scipy/cluster/_optimal_leaf_ordering.cp312-win_amd64.pyd +0 -0
  108. scipy/cluster/_vq.cp312-win_amd64.dll.a +0 -0
  109. scipy/cluster/_vq.cp312-win_amd64.pyd +0 -0
  110. scipy/cluster/hierarchy.py +393 -223
  111. scipy/cluster/tests/test_hierarchy.py +273 -335
  112. scipy/cluster/tests/test_vq.py +45 -61
  113. scipy/cluster/vq.py +39 -35
  114. scipy/conftest.py +282 -151
  115. scipy/constants/_constants.py +4 -1
  116. scipy/constants/tests/test_codata.py +2 -2
  117. scipy/constants/tests/test_constants.py +11 -18
  118. scipy/datasets/_download_all.py +15 -1
  119. scipy/datasets/_fetchers.py +7 -1
  120. scipy/datasets/_utils.py +1 -1
  121. scipy/differentiate/_differentiate.py +25 -25
  122. scipy/differentiate/tests/test_differentiate.py +24 -25
  123. scipy/fft/_basic.py +20 -0
  124. scipy/fft/_helper.py +3 -34
  125. scipy/fft/_pocketfft/helper.py +29 -1
  126. scipy/fft/_pocketfft/pypocketfft.cp312-win_amd64.dll.a +0 -0
  127. scipy/fft/_pocketfft/pypocketfft.cp312-win_amd64.pyd +0 -0
  128. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  129. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  130. scipy/fft/_realtransforms.py +13 -0
  131. scipy/fft/tests/test_basic.py +27 -25
  132. scipy/fft/tests/test_fftlog.py +16 -7
  133. scipy/fft/tests/test_helper.py +18 -34
  134. scipy/fft/tests/test_real_transforms.py +8 -10
  135. scipy/fftpack/convolve.cp312-win_amd64.dll.a +0 -0
  136. scipy/fftpack/convolve.cp312-win_amd64.pyd +0 -0
  137. scipy/fftpack/tests/test_basic.py +2 -4
  138. scipy/fftpack/tests/test_real_transforms.py +8 -9
  139. scipy/integrate/_bvp.py +9 -3
  140. scipy/integrate/_cubature.py +3 -2
  141. scipy/integrate/_dop.cp312-win_amd64.dll.a +0 -0
  142. scipy/integrate/_dop.cp312-win_amd64.pyd +0 -0
  143. scipy/integrate/_lsoda.cp312-win_amd64.dll.a +0 -0
  144. scipy/integrate/_lsoda.cp312-win_amd64.pyd +0 -0
  145. scipy/integrate/_ode.py +9 -2
  146. scipy/integrate/_odepack.cp312-win_amd64.dll.a +0 -0
  147. scipy/integrate/_odepack.cp312-win_amd64.pyd +0 -0
  148. scipy/integrate/_quad_vec.py +21 -29
  149. scipy/integrate/_quadpack.cp312-win_amd64.dll.a +0 -0
  150. scipy/integrate/_quadpack.cp312-win_amd64.pyd +0 -0
  151. scipy/integrate/_quadpack_py.py +11 -7
  152. scipy/integrate/_quadrature.py +3 -3
  153. scipy/integrate/_rules/_base.py +2 -2
  154. scipy/integrate/_tanhsinh.py +48 -47
  155. scipy/integrate/_test_multivariate.cp312-win_amd64.dll.a +0 -0
  156. scipy/integrate/_test_multivariate.cp312-win_amd64.pyd +0 -0
  157. scipy/integrate/_test_odeint_banded.cp312-win_amd64.dll.a +0 -0
  158. scipy/integrate/_test_odeint_banded.cp312-win_amd64.pyd +0 -0
  159. scipy/integrate/_vode.cp312-win_amd64.dll.a +0 -0
  160. scipy/integrate/_vode.cp312-win_amd64.pyd +0 -0
  161. scipy/integrate/tests/test__quad_vec.py +0 -6
  162. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  163. scipy/integrate/tests/test_cubature.py +21 -35
  164. scipy/integrate/tests/test_quadrature.py +6 -8
  165. scipy/integrate/tests/test_tanhsinh.py +56 -48
  166. scipy/interpolate/__init__.py +70 -58
  167. scipy/interpolate/_bary_rational.py +22 -22
  168. scipy/interpolate/_bsplines.py +119 -66
  169. scipy/interpolate/_cubic.py +65 -50
  170. scipy/interpolate/_dfitpack.cp312-win_amd64.dll.a +0 -0
  171. scipy/interpolate/_dfitpack.cp312-win_amd64.pyd +0 -0
  172. scipy/interpolate/_dierckx.cp312-win_amd64.dll.a +0 -0
  173. scipy/interpolate/_dierckx.cp312-win_amd64.pyd +0 -0
  174. scipy/interpolate/_fitpack.cp312-win_amd64.dll.a +0 -0
  175. scipy/interpolate/_fitpack.cp312-win_amd64.pyd +0 -0
  176. scipy/interpolate/_fitpack2.py +9 -6
  177. scipy/interpolate/_fitpack_impl.py +32 -26
  178. scipy/interpolate/_fitpack_repro.py +23 -19
  179. scipy/interpolate/_interpnd.cp312-win_amd64.dll.a +0 -0
  180. scipy/interpolate/_interpnd.cp312-win_amd64.pyd +0 -0
  181. scipy/interpolate/_interpolate.py +30 -12
  182. scipy/interpolate/_ndbspline.py +13 -18
  183. scipy/interpolate/_ndgriddata.py +5 -8
  184. scipy/interpolate/_polyint.py +95 -31
  185. scipy/interpolate/_ppoly.cp312-win_amd64.dll.a +0 -0
  186. scipy/interpolate/_ppoly.cp312-win_amd64.pyd +0 -0
  187. scipy/interpolate/_rbf.py +2 -2
  188. scipy/interpolate/_rbfinterp.py +1 -1
  189. scipy/interpolate/_rbfinterp_pythran.cp312-win_amd64.dll.a +0 -0
  190. scipy/interpolate/_rbfinterp_pythran.cp312-win_amd64.pyd +0 -0
  191. scipy/interpolate/_rgi.py +31 -26
  192. scipy/interpolate/_rgi_cython.cp312-win_amd64.dll.a +0 -0
  193. scipy/interpolate/_rgi_cython.cp312-win_amd64.pyd +0 -0
  194. scipy/interpolate/dfitpack.py +0 -20
  195. scipy/interpolate/interpnd.py +1 -2
  196. scipy/interpolate/tests/test_bary_rational.py +2 -2
  197. scipy/interpolate/tests/test_bsplines.py +97 -1
  198. scipy/interpolate/tests/test_fitpack2.py +39 -1
  199. scipy/interpolate/tests/test_interpnd.py +32 -20
  200. scipy/interpolate/tests/test_interpolate.py +48 -4
  201. scipy/interpolate/tests/test_rgi.py +2 -1
  202. scipy/io/_fast_matrix_market/__init__.py +2 -0
  203. scipy/io/_fast_matrix_market/_fmm_core.cp312-win_amd64.dll.a +0 -0
  204. scipy/io/_fast_matrix_market/_fmm_core.cp312-win_amd64.pyd +0 -0
  205. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  206. scipy/io/_harwell_boeing/hb.py +7 -11
  207. scipy/io/_idl.py +5 -7
  208. scipy/io/_netcdf.py +15 -5
  209. scipy/io/_test_fortran.cp312-win_amd64.dll.a +0 -0
  210. scipy/io/_test_fortran.cp312-win_amd64.pyd +0 -0
  211. scipy/io/arff/tests/test_arffread.py +3 -3
  212. scipy/io/matlab/__init__.py +5 -3
  213. scipy/io/matlab/_mio.py +4 -1
  214. scipy/io/matlab/_mio5.py +19 -13
  215. scipy/io/matlab/_mio5_utils.cp312-win_amd64.dll.a +0 -0
  216. scipy/io/matlab/_mio5_utils.cp312-win_amd64.pyd +0 -0
  217. scipy/io/matlab/_mio_utils.cp312-win_amd64.dll.a +0 -0
  218. scipy/io/matlab/_mio_utils.cp312-win_amd64.pyd +0 -0
  219. scipy/io/matlab/_miobase.py +4 -1
  220. scipy/io/matlab/_streams.cp312-win_amd64.dll.a +0 -0
  221. scipy/io/matlab/_streams.cp312-win_amd64.pyd +0 -0
  222. scipy/io/matlab/tests/test_mio.py +46 -18
  223. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  224. scipy/io/tests/test_mmio.py +7 -1
  225. scipy/io/tests/test_wavfile.py +41 -0
  226. scipy/io/wavfile.py +57 -10
  227. scipy/linalg/_basic.py +113 -86
  228. scipy/linalg/_cythonized_array_utils.cp312-win_amd64.dll.a +0 -0
  229. scipy/linalg/_cythonized_array_utils.cp312-win_amd64.pyd +0 -0
  230. scipy/linalg/_decomp.py +22 -9
  231. scipy/linalg/_decomp_cholesky.py +28 -13
  232. scipy/linalg/_decomp_cossin.py +45 -30
  233. scipy/linalg/_decomp_interpolative.cp312-win_amd64.dll.a +0 -0
  234. scipy/linalg/_decomp_interpolative.cp312-win_amd64.pyd +0 -0
  235. scipy/linalg/_decomp_ldl.py +4 -1
  236. scipy/linalg/_decomp_lu.py +18 -6
  237. scipy/linalg/_decomp_lu_cython.cp312-win_amd64.dll.a +0 -0
  238. scipy/linalg/_decomp_lu_cython.cp312-win_amd64.pyd +0 -0
  239. scipy/linalg/_decomp_polar.py +2 -0
  240. scipy/linalg/_decomp_qr.py +6 -2
  241. scipy/linalg/_decomp_qz.py +3 -0
  242. scipy/linalg/_decomp_schur.py +3 -1
  243. scipy/linalg/_decomp_svd.py +13 -2
  244. scipy/linalg/_decomp_update.cp312-win_amd64.dll.a +0 -0
  245. scipy/linalg/_decomp_update.cp312-win_amd64.pyd +0 -0
  246. scipy/linalg/_expm_frechet.py +4 -0
  247. scipy/linalg/_fblas.cp312-win_amd64.dll.a +0 -0
  248. scipy/linalg/_fblas.cp312-win_amd64.pyd +0 -0
  249. scipy/linalg/_flapack.cp312-win_amd64.dll.a +0 -0
  250. scipy/linalg/_flapack.cp312-win_amd64.pyd +0 -0
  251. scipy/linalg/_linalg_pythran.cp312-win_amd64.dll.a +0 -0
  252. scipy/linalg/_linalg_pythran.cp312-win_amd64.pyd +0 -0
  253. scipy/linalg/_matfuncs.py +187 -4
  254. scipy/linalg/_matfuncs_expm.cp312-win_amd64.dll.a +0 -0
  255. scipy/linalg/_matfuncs_expm.cp312-win_amd64.pyd +0 -0
  256. scipy/linalg/_matfuncs_schur_sqrtm.cp312-win_amd64.dll.a +0 -0
  257. scipy/linalg/_matfuncs_schur_sqrtm.cp312-win_amd64.pyd +0 -0
  258. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  259. scipy/linalg/_matfuncs_sqrtm_triu.cp312-win_amd64.dll.a +0 -0
  260. scipy/linalg/_matfuncs_sqrtm_triu.cp312-win_amd64.pyd +0 -0
  261. scipy/linalg/_procrustes.py +2 -0
  262. scipy/linalg/_sketches.py +17 -6
  263. scipy/linalg/_solve_toeplitz.cp312-win_amd64.dll.a +0 -0
  264. scipy/linalg/_solve_toeplitz.cp312-win_amd64.pyd +0 -0
  265. scipy/linalg/_solvers.py +7 -2
  266. scipy/linalg/_special_matrices.py +26 -36
  267. scipy/linalg/blas.py +35 -24
  268. scipy/linalg/cython_blas.cp312-win_amd64.dll.a +0 -0
  269. scipy/linalg/cython_blas.cp312-win_amd64.pyd +0 -0
  270. scipy/linalg/cython_lapack.cp312-win_amd64.dll.a +0 -0
  271. scipy/linalg/cython_lapack.cp312-win_amd64.pyd +0 -0
  272. scipy/linalg/lapack.py +22 -2
  273. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  274. scipy/linalg/tests/test_basic.py +31 -16
  275. scipy/linalg/tests/test_batch.py +588 -0
  276. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  277. scipy/linalg/tests/test_decomp.py +40 -3
  278. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  279. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  280. scipy/linalg/tests/test_lapack.py +115 -7
  281. scipy/linalg/tests/test_matfuncs.py +157 -102
  282. scipy/linalg/tests/test_procrustes.py +0 -7
  283. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  284. scipy/linalg/tests/test_special_matrices.py +1 -5
  285. scipy/ndimage/__init__.py +1 -0
  286. scipy/ndimage/_ctest.cp312-win_amd64.dll.a +0 -0
  287. scipy/ndimage/_ctest.cp312-win_amd64.pyd +0 -0
  288. scipy/ndimage/_cytest.cp312-win_amd64.dll.a +0 -0
  289. scipy/ndimage/_cytest.cp312-win_amd64.pyd +0 -0
  290. scipy/ndimage/_delegators.py +8 -2
  291. scipy/ndimage/_filters.py +453 -5
  292. scipy/ndimage/_interpolation.py +36 -6
  293. scipy/ndimage/_measurements.py +4 -2
  294. scipy/ndimage/_morphology.py +5 -0
  295. scipy/ndimage/_nd_image.cp312-win_amd64.dll.a +0 -0
  296. scipy/ndimage/_nd_image.cp312-win_amd64.pyd +0 -0
  297. scipy/ndimage/_ni_docstrings.py +5 -1
  298. scipy/ndimage/_ni_label.cp312-win_amd64.dll.a +0 -0
  299. scipy/ndimage/_ni_label.cp312-win_amd64.pyd +0 -0
  300. scipy/ndimage/_ni_support.py +1 -5
  301. scipy/ndimage/_rank_filter_1d.cp312-win_amd64.dll.a +0 -0
  302. scipy/ndimage/_rank_filter_1d.cp312-win_amd64.pyd +0 -0
  303. scipy/ndimage/_support_alternative_backends.py +18 -6
  304. scipy/ndimage/tests/test_filters.py +370 -259
  305. scipy/ndimage/tests/test_fourier.py +7 -9
  306. scipy/ndimage/tests/test_interpolation.py +68 -61
  307. scipy/ndimage/tests/test_measurements.py +18 -35
  308. scipy/ndimage/tests/test_morphology.py +143 -131
  309. scipy/ndimage/tests/test_splines.py +1 -3
  310. scipy/odr/__odrpack.cp312-win_amd64.dll.a +0 -0
  311. scipy/odr/__odrpack.cp312-win_amd64.pyd +0 -0
  312. scipy/optimize/_basinhopping.py +13 -7
  313. scipy/optimize/_bglu_dense.cp312-win_amd64.dll.a +0 -0
  314. scipy/optimize/_bglu_dense.cp312-win_amd64.pyd +0 -0
  315. scipy/optimize/_bracket.py +17 -24
  316. scipy/optimize/_chandrupatla.py +9 -10
  317. scipy/optimize/_cobyla_py.py +104 -123
  318. scipy/optimize/_constraints.py +14 -10
  319. scipy/optimize/_differentiable_functions.py +371 -230
  320. scipy/optimize/_differentialevolution.py +4 -3
  321. scipy/optimize/_direct.cp312-win_amd64.dll.a +0 -0
  322. scipy/optimize/_direct.cp312-win_amd64.pyd +0 -0
  323. scipy/optimize/_dual_annealing.py +1 -1
  324. scipy/optimize/_elementwise.py +1 -4
  325. scipy/optimize/_group_columns.cp312-win_amd64.dll.a +0 -0
  326. scipy/optimize/_group_columns.cp312-win_amd64.pyd +0 -0
  327. scipy/optimize/_highspy/_core.cp312-win_amd64.dll.a +0 -0
  328. scipy/optimize/_highspy/_core.cp312-win_amd64.pyd +0 -0
  329. scipy/optimize/_highspy/_highs_options.cp312-win_amd64.dll.a +0 -0
  330. scipy/optimize/_highspy/_highs_options.cp312-win_amd64.pyd +0 -0
  331. scipy/optimize/_lbfgsb.cp312-win_amd64.dll.a +0 -0
  332. scipy/optimize/_lbfgsb.cp312-win_amd64.pyd +0 -0
  333. scipy/optimize/_lbfgsb_py.py +80 -24
  334. scipy/optimize/_linprog_doc.py +2 -2
  335. scipy/optimize/_linprog_highs.py +2 -2
  336. scipy/optimize/_linprog_ip.py +25 -10
  337. scipy/optimize/_linprog_util.py +14 -16
  338. scipy/optimize/_lsap.cp312-win_amd64.dll.a +0 -0
  339. scipy/optimize/_lsap.cp312-win_amd64.pyd +0 -0
  340. scipy/optimize/_lsq/common.py +3 -3
  341. scipy/optimize/_lsq/dogbox.py +16 -2
  342. scipy/optimize/_lsq/givens_elimination.cp312-win_amd64.dll.a +0 -0
  343. scipy/optimize/_lsq/givens_elimination.cp312-win_amd64.pyd +0 -0
  344. scipy/optimize/_lsq/least_squares.py +198 -126
  345. scipy/optimize/_lsq/lsq_linear.py +6 -6
  346. scipy/optimize/_lsq/trf.py +35 -8
  347. scipy/optimize/_milp.py +3 -1
  348. scipy/optimize/_minimize.py +105 -36
  349. scipy/optimize/_minpack.cp312-win_amd64.dll.a +0 -0
  350. scipy/optimize/_minpack.cp312-win_amd64.pyd +0 -0
  351. scipy/optimize/_minpack_py.py +21 -14
  352. scipy/optimize/_moduleTNC.cp312-win_amd64.dll.a +0 -0
  353. scipy/optimize/_moduleTNC.cp312-win_amd64.pyd +0 -0
  354. scipy/optimize/_nnls.py +20 -21
  355. scipy/optimize/_nonlin.py +34 -3
  356. scipy/optimize/_numdiff.py +288 -110
  357. scipy/optimize/_optimize.py +86 -48
  358. scipy/optimize/_pava_pybind.cp312-win_amd64.dll.a +0 -0
  359. scipy/optimize/_pava_pybind.cp312-win_amd64.pyd +0 -0
  360. scipy/optimize/_remove_redundancy.py +5 -5
  361. scipy/optimize/_root_scalar.py +1 -1
  362. scipy/optimize/_shgo.py +6 -0
  363. scipy/optimize/_shgo_lib/_complex.py +1 -1
  364. scipy/optimize/_slsqp_py.py +216 -124
  365. scipy/optimize/_slsqplib.cp312-win_amd64.dll.a +0 -0
  366. scipy/optimize/_slsqplib.cp312-win_amd64.pyd +0 -0
  367. scipy/optimize/_spectral.py +1 -1
  368. scipy/optimize/_tnc.py +8 -1
  369. scipy/optimize/_trlib/_trlib.cp312-win_amd64.dll.a +0 -0
  370. scipy/optimize/_trlib/_trlib.cp312-win_amd64.pyd +0 -0
  371. scipy/optimize/_trustregion.py +20 -6
  372. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  373. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  374. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  375. scipy/optimize/_trustregion_constr/projections.py +12 -8
  376. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  377. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  378. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  379. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  380. scipy/optimize/_trustregion_exact.py +0 -1
  381. scipy/optimize/_zeros.cp312-win_amd64.dll.a +0 -0
  382. scipy/optimize/_zeros.cp312-win_amd64.pyd +0 -0
  383. scipy/optimize/_zeros_py.py +97 -17
  384. scipy/optimize/cython_optimize/_zeros.cp312-win_amd64.dll.a +0 -0
  385. scipy/optimize/cython_optimize/_zeros.cp312-win_amd64.pyd +0 -0
  386. scipy/optimize/slsqp.py +0 -1
  387. scipy/optimize/tests/test__basinhopping.py +1 -1
  388. scipy/optimize/tests/test__differential_evolution.py +4 -4
  389. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  390. scipy/optimize/tests/test__numdiff.py +66 -22
  391. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  392. scipy/optimize/tests/test__shgo.py +9 -1
  393. scipy/optimize/tests/test_bracket.py +36 -46
  394. scipy/optimize/tests/test_chandrupatla.py +133 -135
  395. scipy/optimize/tests/test_cobyla.py +74 -45
  396. scipy/optimize/tests/test_constraints.py +1 -1
  397. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  398. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  399. scipy/optimize/tests/test_least_squares.py +125 -13
  400. scipy/optimize/tests/test_linear_assignment.py +3 -3
  401. scipy/optimize/tests/test_linprog.py +3 -3
  402. scipy/optimize/tests/test_lsq_linear.py +6 -6
  403. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  404. scipy/optimize/tests/test_minpack.py +4 -4
  405. scipy/optimize/tests/test_nnls.py +43 -3
  406. scipy/optimize/tests/test_nonlin.py +36 -0
  407. scipy/optimize/tests/test_optimize.py +98 -20
  408. scipy/optimize/tests/test_slsqp.py +36 -4
  409. scipy/optimize/tests/test_zeros.py +34 -1
  410. scipy/signal/__init__.py +12 -23
  411. scipy/signal/_delegators.py +568 -0
  412. scipy/signal/_filter_design.py +459 -241
  413. scipy/signal/_fir_filter_design.py +262 -90
  414. scipy/signal/_lti_conversion.py +3 -2
  415. scipy/signal/_ltisys.py +118 -91
  416. scipy/signal/_max_len_seq_inner.cp312-win_amd64.dll.a +0 -0
  417. scipy/signal/_max_len_seq_inner.cp312-win_amd64.pyd +0 -0
  418. scipy/signal/_peak_finding_utils.cp312-win_amd64.dll.a +0 -0
  419. scipy/signal/_peak_finding_utils.cp312-win_amd64.pyd +0 -0
  420. scipy/signal/_polyutils.py +172 -0
  421. scipy/signal/_short_time_fft.py +519 -70
  422. scipy/signal/_signal_api.py +30 -0
  423. scipy/signal/_signaltools.py +719 -399
  424. scipy/signal/_sigtools.cp312-win_amd64.dll.a +0 -0
  425. scipy/signal/_sigtools.cp312-win_amd64.pyd +0 -0
  426. scipy/signal/_sosfilt.cp312-win_amd64.dll.a +0 -0
  427. scipy/signal/_sosfilt.cp312-win_amd64.pyd +0 -0
  428. scipy/signal/_spectral_py.py +230 -50
  429. scipy/signal/_spline.cp312-win_amd64.dll.a +0 -0
  430. scipy/signal/_spline.cp312-win_amd64.pyd +0 -0
  431. scipy/signal/_spline_filters.py +108 -68
  432. scipy/signal/_support_alternative_backends.py +73 -0
  433. scipy/signal/_upfirdn.py +4 -1
  434. scipy/signal/_upfirdn_apply.cp312-win_amd64.dll.a +0 -0
  435. scipy/signal/_upfirdn_apply.cp312-win_amd64.pyd +0 -0
  436. scipy/signal/_waveforms.py +2 -11
  437. scipy/signal/_wavelets.py +1 -1
  438. scipy/signal/fir_filter_design.py +1 -0
  439. scipy/signal/spline.py +4 -11
  440. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  441. scipy/signal/tests/test_bsplines.py +114 -79
  442. scipy/signal/tests/test_cont2discrete.py +9 -2
  443. scipy/signal/tests/test_filter_design.py +721 -481
  444. scipy/signal/tests/test_fir_filter_design.py +332 -140
  445. scipy/signal/tests/test_savitzky_golay.py +4 -3
  446. scipy/signal/tests/test_short_time_fft.py +221 -3
  447. scipy/signal/tests/test_signaltools.py +2145 -1349
  448. scipy/signal/tests/test_spectral.py +50 -6
  449. scipy/signal/tests/test_splines.py +161 -96
  450. scipy/signal/tests/test_upfirdn.py +84 -50
  451. scipy/signal/tests/test_waveforms.py +20 -0
  452. scipy/signal/tests/test_windows.py +607 -466
  453. scipy/signal/windows/_windows.py +287 -148
  454. scipy/sparse/__init__.py +23 -4
  455. scipy/sparse/_base.py +270 -108
  456. scipy/sparse/_bsr.py +7 -4
  457. scipy/sparse/_compressed.py +59 -231
  458. scipy/sparse/_construct.py +90 -38
  459. scipy/sparse/_coo.py +115 -181
  460. scipy/sparse/_csc.py +4 -4
  461. scipy/sparse/_csparsetools.cp312-win_amd64.dll.a +0 -0
  462. scipy/sparse/_csparsetools.cp312-win_amd64.pyd +0 -0
  463. scipy/sparse/_csr.py +2 -2
  464. scipy/sparse/_data.py +48 -48
  465. scipy/sparse/_dia.py +105 -18
  466. scipy/sparse/_dok.py +0 -23
  467. scipy/sparse/_index.py +4 -4
  468. scipy/sparse/_matrix.py +23 -0
  469. scipy/sparse/_sparsetools.cp312-win_amd64.dll.a +0 -0
  470. scipy/sparse/_sparsetools.cp312-win_amd64.pyd +0 -0
  471. scipy/sparse/_sputils.py +37 -22
  472. scipy/sparse/base.py +0 -9
  473. scipy/sparse/bsr.py +0 -14
  474. scipy/sparse/compressed.py +0 -23
  475. scipy/sparse/construct.py +0 -6
  476. scipy/sparse/coo.py +0 -14
  477. scipy/sparse/csc.py +0 -3
  478. scipy/sparse/csgraph/_flow.cp312-win_amd64.dll.a +0 -0
  479. scipy/sparse/csgraph/_flow.cp312-win_amd64.pyd +0 -0
  480. scipy/sparse/csgraph/_matching.cp312-win_amd64.dll.a +0 -0
  481. scipy/sparse/csgraph/_matching.cp312-win_amd64.pyd +0 -0
  482. scipy/sparse/csgraph/_min_spanning_tree.cp312-win_amd64.dll.a +0 -0
  483. scipy/sparse/csgraph/_min_spanning_tree.cp312-win_amd64.pyd +0 -0
  484. scipy/sparse/csgraph/_reordering.cp312-win_amd64.dll.a +0 -0
  485. scipy/sparse/csgraph/_reordering.cp312-win_amd64.pyd +0 -0
  486. scipy/sparse/csgraph/_shortest_path.cp312-win_amd64.dll.a +0 -0
  487. scipy/sparse/csgraph/_shortest_path.cp312-win_amd64.pyd +0 -0
  488. scipy/sparse/csgraph/_tools.cp312-win_amd64.dll.a +0 -0
  489. scipy/sparse/csgraph/_tools.cp312-win_amd64.pyd +0 -0
  490. scipy/sparse/csgraph/_traversal.cp312-win_amd64.dll.a +0 -0
  491. scipy/sparse/csgraph/_traversal.cp312-win_amd64.pyd +0 -0
  492. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  493. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  494. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  495. scipy/sparse/csr.py +0 -5
  496. scipy/sparse/data.py +1 -6
  497. scipy/sparse/dia.py +0 -7
  498. scipy/sparse/dok.py +0 -10
  499. scipy/sparse/linalg/_dsolve/_superlu.cp312-win_amd64.dll.a +0 -0
  500. scipy/sparse/linalg/_dsolve/_superlu.cp312-win_amd64.pyd +0 -0
  501. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  502. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  503. scipy/sparse/linalg/_eigen/arpack/_arpack.cp312-win_amd64.dll.a +0 -0
  504. scipy/sparse/linalg/_eigen/arpack/_arpack.cp312-win_amd64.pyd +0 -0
  505. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  506. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  507. scipy/sparse/linalg/_interface.py +17 -18
  508. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  509. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  510. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  511. scipy/sparse/linalg/_isolve/minres.py +5 -5
  512. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  513. scipy/sparse/linalg/_isolve/utils.py +2 -8
  514. scipy/sparse/linalg/_matfuncs.py +1 -1
  515. scipy/sparse/linalg/_norm.py +1 -1
  516. scipy/sparse/linalg/_propack/_cpropack.cp312-win_amd64.dll.a +0 -0
  517. scipy/sparse/linalg/_propack/_cpropack.cp312-win_amd64.pyd +0 -0
  518. scipy/sparse/linalg/_propack/_dpropack.cp312-win_amd64.dll.a +0 -0
  519. scipy/sparse/linalg/_propack/_dpropack.cp312-win_amd64.pyd +0 -0
  520. scipy/sparse/linalg/_propack/_spropack.cp312-win_amd64.dll.a +0 -0
  521. scipy/sparse/linalg/_propack/_spropack.cp312-win_amd64.pyd +0 -0
  522. scipy/sparse/linalg/_propack/_zpropack.cp312-win_amd64.dll.a +0 -0
  523. scipy/sparse/linalg/_propack/_zpropack.cp312-win_amd64.pyd +0 -0
  524. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  525. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  526. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  527. scipy/sparse/tests/test_base.py +214 -42
  528. scipy/sparse/tests/test_common1d.py +7 -7
  529. scipy/sparse/tests/test_construct.py +1 -1
  530. scipy/sparse/tests/test_coo.py +272 -4
  531. scipy/sparse/tests/test_sparsetools.py +5 -0
  532. scipy/sparse/tests/test_sputils.py +36 -7
  533. scipy/spatial/_ckdtree.cp312-win_amd64.dll.a +0 -0
  534. scipy/spatial/_ckdtree.cp312-win_amd64.pyd +0 -0
  535. scipy/spatial/_distance_pybind.cp312-win_amd64.dll.a +0 -0
  536. scipy/spatial/_distance_pybind.cp312-win_amd64.pyd +0 -0
  537. scipy/spatial/_distance_wrap.cp312-win_amd64.dll.a +0 -0
  538. scipy/spatial/_distance_wrap.cp312-win_amd64.pyd +0 -0
  539. scipy/spatial/_hausdorff.cp312-win_amd64.dll.a +0 -0
  540. scipy/spatial/_hausdorff.cp312-win_amd64.pyd +0 -0
  541. scipy/spatial/_qhull.cp312-win_amd64.dll.a +0 -0
  542. scipy/spatial/_qhull.cp312-win_amd64.pyd +0 -0
  543. scipy/spatial/_voronoi.cp312-win_amd64.dll.a +0 -0
  544. scipy/spatial/_voronoi.cp312-win_amd64.pyd +0 -0
  545. scipy/spatial/distance.py +49 -42
  546. scipy/spatial/tests/test_distance.py +15 -1
  547. scipy/spatial/tests/test_kdtree.py +1 -0
  548. scipy/spatial/tests/test_qhull.py +7 -2
  549. scipy/spatial/transform/__init__.py +5 -3
  550. scipy/spatial/transform/_rigid_transform.cp312-win_amd64.dll.a +0 -0
  551. scipy/spatial/transform/_rigid_transform.cp312-win_amd64.pyd +0 -0
  552. scipy/spatial/transform/_rotation.cp312-win_amd64.dll.a +0 -0
  553. scipy/spatial/transform/_rotation.cp312-win_amd64.pyd +0 -0
  554. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  555. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  556. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  557. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  558. scipy/special/__init__.py +1 -47
  559. scipy/special/_add_newdocs.py +34 -772
  560. scipy/special/_basic.py +22 -25
  561. scipy/special/_comb.cp312-win_amd64.dll.a +0 -0
  562. scipy/special/_comb.cp312-win_amd64.pyd +0 -0
  563. scipy/special/_ellip_harm_2.cp312-win_amd64.dll.a +0 -0
  564. scipy/special/_ellip_harm_2.cp312-win_amd64.pyd +0 -0
  565. scipy/special/_gufuncs.cp312-win_amd64.dll.a +0 -0
  566. scipy/special/_gufuncs.cp312-win_amd64.pyd +0 -0
  567. scipy/special/_logsumexp.py +67 -58
  568. scipy/special/_orthogonal.pyi +1 -1
  569. scipy/special/_specfun.cp312-win_amd64.dll.a +0 -0
  570. scipy/special/_specfun.cp312-win_amd64.pyd +0 -0
  571. scipy/special/_special_ufuncs.cp312-win_amd64.dll.a +0 -0
  572. scipy/special/_special_ufuncs.cp312-win_amd64.pyd +0 -0
  573. scipy/special/_spherical_bessel.py +4 -4
  574. scipy/special/_support_alternative_backends.py +212 -119
  575. scipy/special/_test_internal.cp312-win_amd64.dll.a +0 -0
  576. scipy/special/_test_internal.cp312-win_amd64.pyd +0 -0
  577. scipy/special/_testutils.py +4 -4
  578. scipy/special/_ufuncs.cp312-win_amd64.dll.a +0 -0
  579. scipy/special/_ufuncs.cp312-win_amd64.pyd +0 -0
  580. scipy/special/_ufuncs.pyi +1 -0
  581. scipy/special/_ufuncs.pyx +215 -1400
  582. scipy/special/_ufuncs_cxx.cp312-win_amd64.dll.a +0 -0
  583. scipy/special/_ufuncs_cxx.cp312-win_amd64.pyd +0 -0
  584. scipy/special/_ufuncs_cxx.pxd +2 -15
  585. scipy/special/_ufuncs_cxx.pyx +5 -44
  586. scipy/special/_ufuncs_cxx_defs.h +2 -16
  587. scipy/special/_ufuncs_defs.h +0 -8
  588. scipy/special/cython_special.cp312-win_amd64.dll.a +0 -0
  589. scipy/special/cython_special.cp312-win_amd64.pyd +0 -0
  590. scipy/special/cython_special.pxd +1 -1
  591. scipy/special/tests/_cython_examples/meson.build +10 -1
  592. scipy/special/tests/test_basic.py +153 -20
  593. scipy/special/tests/test_boost_ufuncs.py +3 -0
  594. scipy/special/tests/test_cdflib.py +35 -11
  595. scipy/special/tests/test_gammainc.py +16 -0
  596. scipy/special/tests/test_hyp2f1.py +2 -2
  597. scipy/special/tests/test_log1mexp.py +85 -0
  598. scipy/special/tests/test_logsumexp.py +206 -64
  599. scipy/special/tests/test_mpmath.py +1 -0
  600. scipy/special/tests/test_nan_inputs.py +1 -1
  601. scipy/special/tests/test_orthogonal.py +17 -18
  602. scipy/special/tests/test_sf_error.py +3 -2
  603. scipy/special/tests/test_sph_harm.py +6 -7
  604. scipy/special/tests/test_support_alternative_backends.py +211 -76
  605. scipy/stats/__init__.py +4 -1
  606. scipy/stats/_ansari_swilk_statistics.cp312-win_amd64.dll.a +0 -0
  607. scipy/stats/_ansari_swilk_statistics.cp312-win_amd64.pyd +0 -0
  608. scipy/stats/_axis_nan_policy.py +5 -12
  609. scipy/stats/_biasedurn.cp312-win_amd64.dll.a +0 -0
  610. scipy/stats/_biasedurn.cp312-win_amd64.pyd +0 -0
  611. scipy/stats/_continued_fraction.py +387 -0
  612. scipy/stats/_continuous_distns.py +277 -310
  613. scipy/stats/_correlation.py +1 -1
  614. scipy/stats/_covariance.py +6 -3
  615. scipy/stats/_discrete_distns.py +39 -32
  616. scipy/stats/_distn_infrastructure.py +39 -12
  617. scipy/stats/_distribution_infrastructure.py +920 -238
  618. scipy/stats/_entropy.py +9 -10
  619. scipy/{_lib → stats}/_finite_differences.py +1 -1
  620. scipy/stats/_hypotests.py +83 -50
  621. scipy/stats/_kde.py +53 -49
  622. scipy/stats/_ksstats.py +1 -1
  623. scipy/stats/_levy_stable/__init__.py +7 -15
  624. scipy/stats/_levy_stable/levyst.cp312-win_amd64.dll.a +0 -0
  625. scipy/stats/_levy_stable/levyst.cp312-win_amd64.pyd +0 -0
  626. scipy/stats/_morestats.py +118 -73
  627. scipy/stats/_mstats_basic.py +13 -17
  628. scipy/stats/_mstats_extras.py +8 -8
  629. scipy/stats/_multivariate.py +89 -113
  630. scipy/stats/_new_distributions.py +97 -20
  631. scipy/stats/_page_trend_test.py +12 -5
  632. scipy/stats/_probability_distribution.py +265 -43
  633. scipy/stats/_qmc.py +14 -9
  634. scipy/stats/_qmc_cy.cp312-win_amd64.dll.a +0 -0
  635. scipy/stats/_qmc_cy.cp312-win_amd64.pyd +0 -0
  636. scipy/stats/_qmvnt.py +16 -95
  637. scipy/stats/_qmvnt_cy.cp312-win_amd64.dll.a +0 -0
  638. scipy/stats/_qmvnt_cy.cp312-win_amd64.pyd +0 -0
  639. scipy/stats/_quantile.py +335 -0
  640. scipy/stats/_rcont/rcont.cp312-win_amd64.dll.a +0 -0
  641. scipy/stats/_rcont/rcont.cp312-win_amd64.pyd +0 -0
  642. scipy/stats/_resampling.py +5 -30
  643. scipy/stats/_sampling.py +1 -1
  644. scipy/stats/_sobol.cp312-win_amd64.dll.a +0 -0
  645. scipy/stats/_sobol.cp312-win_amd64.pyd +0 -0
  646. scipy/stats/_stats.cp312-win_amd64.dll.a +0 -0
  647. scipy/stats/_stats.cp312-win_amd64.pyd +0 -0
  648. scipy/stats/_stats_mstats_common.py +21 -2
  649. scipy/stats/_stats_py.py +551 -477
  650. scipy/stats/_stats_pythran.cp312-win_amd64.dll.a +0 -0
  651. scipy/stats/_stats_pythran.cp312-win_amd64.pyd +0 -0
  652. scipy/stats/_unuran/unuran_wrapper.cp312-win_amd64.dll.a +0 -0
  653. scipy/stats/_unuran/unuran_wrapper.cp312-win_amd64.pyd +0 -0
  654. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  655. scipy/stats/_variation.py +6 -8
  656. scipy/stats/_wilcoxon.py +13 -7
  657. scipy/stats/tests/common_tests.py +6 -4
  658. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  659. scipy/stats/tests/test_continued_fraction.py +173 -0
  660. scipy/stats/tests/test_continuous.py +379 -60
  661. scipy/stats/tests/test_continuous_basic.py +18 -12
  662. scipy/stats/tests/test_discrete_basic.py +14 -8
  663. scipy/stats/tests/test_discrete_distns.py +16 -16
  664. scipy/stats/tests/test_distributions.py +95 -75
  665. scipy/stats/tests/test_entropy.py +40 -48
  666. scipy/stats/tests/test_fit.py +4 -3
  667. scipy/stats/tests/test_hypotests.py +153 -24
  668. scipy/stats/tests/test_kdeoth.py +109 -41
  669. scipy/stats/tests/test_marray.py +289 -0
  670. scipy/stats/tests/test_morestats.py +81 -49
  671. scipy/stats/tests/test_mstats_basic.py +3 -3
  672. scipy/stats/tests/test_multivariate.py +434 -83
  673. scipy/stats/tests/test_qmc.py +13 -10
  674. scipy/stats/tests/test_quantile.py +199 -0
  675. scipy/stats/tests/test_rank.py +119 -112
  676. scipy/stats/tests/test_resampling.py +47 -56
  677. scipy/stats/tests/test_sampling.py +9 -4
  678. scipy/stats/tests/test_stats.py +799 -939
  679. scipy/stats/tests/test_variation.py +8 -6
  680. scipy/version.py +2 -2
  681. scipy-1.16.0.dist-info/DELVEWHEEL +2 -0
  682. {scipy-1.15.3.dist-info → scipy-1.16.0.dist-info}/LICENSE.txt +4 -4
  683. {scipy-1.15.3.dist-info → scipy-1.16.0.dist-info}/METADATA +11 -11
  684. {scipy-1.15.3.dist-info → scipy-1.16.0.dist-info}/RECORD +686 -694
  685. scipy/_lib/array_api_extra/_funcs.py +0 -484
  686. scipy/_lib/array_api_extra/_typing.py +0 -8
  687. scipy/interpolate/_bspl.cp312-win_amd64.dll.a +0 -0
  688. scipy/interpolate/_bspl.cp312-win_amd64.pyd +0 -0
  689. scipy/optimize/_cobyla.cp312-win_amd64.dll.a +0 -0
  690. scipy/optimize/_cobyla.cp312-win_amd64.pyd +0 -0
  691. scipy/optimize/_cython_nnls.cp312-win_amd64.dll.a +0 -0
  692. scipy/optimize/_cython_nnls.cp312-win_amd64.pyd +0 -0
  693. scipy/optimize/_slsqp.cp312-win_amd64.dll.a +0 -0
  694. scipy/optimize/_slsqp.cp312-win_amd64.pyd +0 -0
  695. scipy/spatial/qhull_src/COPYING.txt +0 -38
  696. scipy/special/libsf_error_state.dll +0 -0
  697. scipy/special/libsf_error_state.dll.a +0 -0
  698. scipy/special/tests/test_log_softmax.py +0 -109
  699. scipy/special/tests/test_xsf_cuda.py +0 -114
  700. scipy/special/xsf/binom.h +0 -89
  701. scipy/special/xsf/cdflib.h +0 -100
  702. scipy/special/xsf/cephes/airy.h +0 -307
  703. scipy/special/xsf/cephes/besselpoly.h +0 -51
  704. scipy/special/xsf/cephes/beta.h +0 -257
  705. scipy/special/xsf/cephes/cbrt.h +0 -131
  706. scipy/special/xsf/cephes/chbevl.h +0 -85
  707. scipy/special/xsf/cephes/chdtr.h +0 -193
  708. scipy/special/xsf/cephes/const.h +0 -87
  709. scipy/special/xsf/cephes/ellie.h +0 -293
  710. scipy/special/xsf/cephes/ellik.h +0 -251
  711. scipy/special/xsf/cephes/ellpe.h +0 -107
  712. scipy/special/xsf/cephes/ellpk.h +0 -117
  713. scipy/special/xsf/cephes/expn.h +0 -260
  714. scipy/special/xsf/cephes/gamma.h +0 -398
  715. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  716. scipy/special/xsf/cephes/hyperg.h +0 -361
  717. scipy/special/xsf/cephes/i0.h +0 -149
  718. scipy/special/xsf/cephes/i1.h +0 -158
  719. scipy/special/xsf/cephes/igam.h +0 -421
  720. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  721. scipy/special/xsf/cephes/igami.h +0 -313
  722. scipy/special/xsf/cephes/j0.h +0 -225
  723. scipy/special/xsf/cephes/j1.h +0 -198
  724. scipy/special/xsf/cephes/jv.h +0 -715
  725. scipy/special/xsf/cephes/k0.h +0 -164
  726. scipy/special/xsf/cephes/k1.h +0 -163
  727. scipy/special/xsf/cephes/kn.h +0 -243
  728. scipy/special/xsf/cephes/lanczos.h +0 -112
  729. scipy/special/xsf/cephes/ndtr.h +0 -275
  730. scipy/special/xsf/cephes/poch.h +0 -85
  731. scipy/special/xsf/cephes/polevl.h +0 -167
  732. scipy/special/xsf/cephes/psi.h +0 -194
  733. scipy/special/xsf/cephes/rgamma.h +0 -111
  734. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  735. scipy/special/xsf/cephes/shichi.h +0 -248
  736. scipy/special/xsf/cephes/sici.h +0 -224
  737. scipy/special/xsf/cephes/sindg.h +0 -221
  738. scipy/special/xsf/cephes/tandg.h +0 -139
  739. scipy/special/xsf/cephes/trig.h +0 -58
  740. scipy/special/xsf/cephes/unity.h +0 -186
  741. scipy/special/xsf/cephes/zeta.h +0 -172
  742. scipy/special/xsf/config.h +0 -304
  743. scipy/special/xsf/digamma.h +0 -205
  744. scipy/special/xsf/error.h +0 -57
  745. scipy/special/xsf/evalpoly.h +0 -47
  746. scipy/special/xsf/expint.h +0 -266
  747. scipy/special/xsf/hyp2f1.h +0 -694
  748. scipy/special/xsf/iv_ratio.h +0 -173
  749. scipy/special/xsf/lambertw.h +0 -150
  750. scipy/special/xsf/loggamma.h +0 -163
  751. scipy/special/xsf/sici.h +0 -200
  752. scipy/special/xsf/tools.h +0 -427
  753. scipy/special/xsf/trig.h +0 -164
  754. scipy/special/xsf/wright_bessel.h +0 -843
  755. scipy/special/xsf/zlog1.h +0 -35
  756. scipy/stats/_mvn.cp312-win_amd64.dll.a +0 -0
  757. scipy/stats/_mvn.cp312-win_amd64.pyd +0 -0
  758. scipy-1.15.3.dist-info/DELVEWHEEL +0 -2
  759. /scipy-1.15.3-cp312-cp312-win_amd64.whl → /scipy-1.16.0-cp312-cp312-win_amd64.whl +0 -0
  760. {scipy-1.15.3.dist-info → scipy-1.16.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,290 @@
1
+ '''
2
+ This module provides some functions that print messages to terminal/files.
3
+
4
+ Translated from Zaikun Zhang's modern-Fortran reference implementation in PRIMA.
5
+
6
+ Dedicated to late Professor M. J. D. Powell FRS (1936--2015).
7
+
8
+ Python translation by Nickolai Belakovski.
9
+
10
+ N.B.:
11
+ 1. In case parallelism is desirable (especially during initialization), the functions may
12
+ have to be modified or disabled due to the IO operations.
13
+ 2. IPRINT indicates the level of verbosity, which increases with the absolute value of IPRINT.
14
+ IPRINT = +/-3 can be expensive due to high IO operations.
15
+ '''
16
+
17
+ from .consts import DEBUGGING
18
+ from .infos import FTARGET_ACHIEVED, MAXFUN_REACHED, MAXTR_REACHED, \
19
+ SMALL_TR_RADIUS, TRSUBP_FAILED, NAN_INF_F, NAN_INF_X, NAN_INF_MODEL, DAMAGING_ROUNDING, \
20
+ NO_SPACE_BETWEEN_BOUNDS, ZERO_LINEAR_CONSTRAINT, CALLBACK_TERMINATE
21
+ from .present import present
22
+ import numpy as np
23
+
24
+ spaces = ' '
25
+
26
+
27
+ def get_info_string(solver, info):
28
+ if info == FTARGET_ACHIEVED:
29
+ reason = 'the target function value is achieved.'
30
+ elif info == MAXFUN_REACHED:
31
+ reason = 'the objective function has been evaluated MAXFUN times.'
32
+ elif info == MAXTR_REACHED:
33
+ reason = 'the maximal number of trust region iterations has been reached.'
34
+ elif info == SMALL_TR_RADIUS:
35
+ reason = 'the trust region radius reaches its lower bound.'
36
+ elif info == TRSUBP_FAILED:
37
+ reason = 'a trust region step has failed to reduce the quadratic model.'
38
+ elif info == NAN_INF_X:
39
+ reason = 'NaN or Inf occurs in x.'
40
+ elif info == NAN_INF_F:
41
+ reason = 'the objective function returns NaN/+Inf.'
42
+ elif info == NAN_INF_MODEL:
43
+ reason = 'NaN or Inf occurs in the models.'
44
+ elif info == DAMAGING_ROUNDING:
45
+ reason = 'rounding errors are becoming damaging.'
46
+ elif info == NO_SPACE_BETWEEN_BOUNDS:
47
+ reason = 'there is no space between the lower and upper bounds of variable.'
48
+ elif info == ZERO_LINEAR_CONSTRAINT:
49
+ reason = 'one of the linear constraints has a zero gradient'
50
+ elif info == CALLBACK_TERMINATE:
51
+ reason = 'the callback function requested termination'
52
+ else:
53
+ reason = 'UNKNOWN EXIT FLAG'
54
+ ret_message = f'Return from {solver} because {reason.strip()}'
55
+ return ret_message
56
+
57
+
58
+ def retmsg(solver, info, iprint, nf, f, x, cstrv=None, constr=None):
59
+ '''
60
+ This function prints messages at return.
61
+ '''
62
+ # Local variables
63
+ valid_exit_codes = [FTARGET_ACHIEVED, MAXFUN_REACHED, MAXTR_REACHED,
64
+ SMALL_TR_RADIUS, TRSUBP_FAILED, NAN_INF_F, NAN_INF_X, NAN_INF_MODEL, DAMAGING_ROUNDING,
65
+ NO_SPACE_BETWEEN_BOUNDS, ZERO_LINEAR_CONSTRAINT, CALLBACK_TERMINATE]
66
+
67
+ # Preconditions
68
+ if DEBUGGING:
69
+ assert info in valid_exit_codes
70
+
71
+ #====================#
72
+ # Calculation starts #
73
+ #====================#
74
+
75
+ if abs(iprint) < 1: # No printing (iprint == 0)
76
+ return
77
+ elif iprint > 0: # Print the message to the standard out.
78
+ fname = ''
79
+ else: # Print the message to a file named FNAME.
80
+ fname = f'{solver}_output.txt'
81
+
82
+ # Decide whether the problem is truly constrained.
83
+ if present(constr):
84
+ is_constrained = (np.size(constr) > 0)
85
+ else:
86
+ is_constrained = present(cstrv)
87
+
88
+ # Decide the constraint violation.
89
+ if present(cstrv):
90
+ cstrv_loc = cstrv
91
+ elif present(constr):
92
+ cstrv_loc = np.max(np.append(0, -constr)) # N.B.: We assume that the constraint is CONSTR >= 0.
93
+ else:
94
+ cstrv_loc = 0
95
+
96
+ # Decide the return message.
97
+ ret_message = get_info_string(solver, info)
98
+
99
+ if np.size(x) <= 2:
100
+ x_message = f'\nThe corresponding X is: {x}' # Printed in one line
101
+ else:
102
+ x_message = f'\nThe corresponding X is:\n{x}'
103
+
104
+ if is_constrained:
105
+ nf_message = (f'\nNumber of function values = {nf}{spaces}'
106
+ f'Least value of F = {f}{spaces}Constraint violation = {cstrv_loc}')
107
+ else:
108
+ nf_message = f'\nNumber of function values = {nf}{spaces}Least value of F = {f}'
109
+
110
+ if is_constrained and present(constr):
111
+ if np.size(constr) <= 2:
112
+ constr_message = f'\nThe constraint value is: {constr}' # Printed in one line
113
+ else:
114
+ constr_message = f'\nThe constraint value is:\n{constr}'
115
+ else:
116
+ constr_message = ''
117
+
118
+ # Print the message.
119
+ if abs(iprint) >= 2:
120
+ message = f'\n{ret_message}{nf_message}{x_message}{constr_message}\n'
121
+ else:
122
+ message = f'{ret_message}{nf_message}{x_message}{constr_message}\n'
123
+ if len(fname) > 0:
124
+ with open(fname, 'a') as f: f.write(message)
125
+ else:
126
+ print(message)
127
+
128
+
129
+ def rhomsg(solver, iprint, nf, delta, f, rho, x, cstrv=None, constr=None, cpen=None):
130
+ '''
131
+ This function prints messages when RHO is updated.
132
+ '''
133
+
134
+ #====================#
135
+ # Calculation starts #
136
+ #====================#
137
+
138
+ if abs(iprint) < 2: # No printing
139
+ return
140
+ elif iprint > 0: # Print the message to the standard out.
141
+ fname = ''
142
+ else: # Print the message to a file named FNAME.
143
+ fname = f'{solver.strip()}_output.txt'
144
+
145
+ # Decide whether the problem is truly constrained.
146
+ if present(constr):
147
+ is_constrained = (np.size(constr) > 0)
148
+ else:
149
+ is_constrained = present(cstrv)
150
+
151
+ # Decide the constraint violation.
152
+ if present(cstrv):
153
+ cstrv_loc = cstrv
154
+ elif present(constr):
155
+ cstrv_loc = np.max(np.append(0, -constr)) # N.B.: We assume that the constraint is CONSTR >= 0.
156
+ else:
157
+ cstrv_loc = 0
158
+
159
+ if present(cpen):
160
+ rho_message = (f'\nNew RHO = {rho}{spaces}Delta = {delta}{spaces}'
161
+ f'CPEN = {cpen}')
162
+ else:
163
+ rho_message = f'\nNew RHO = {rho}{spaces}Delta = {delta}'
164
+
165
+ if np.size(x) <= 2:
166
+ x_message = f'\nThe corresponding X is: {x}' # Printed in one line
167
+ else:
168
+ x_message = f'\nThe corresponding X is:\n{x}'
169
+
170
+ if is_constrained:
171
+ nf_message = (f'\nNumber of function values = {nf}{spaces}'
172
+ f'Least value of F = {f}{spaces}Constraint violation = {cstrv_loc}')
173
+ else:
174
+ nf_message = f'\nNumber of function values = {nf}{spaces}Least value of F = {f}'
175
+
176
+ if is_constrained and present(constr):
177
+ if np.size(constr) <= 2:
178
+ constr_message = f'\nThe constraint value is: {constr}' # Printed in one line
179
+ else:
180
+ constr_message = f'\nThe constraint value is:\n{constr}'
181
+ else:
182
+ constr_message = ''
183
+
184
+ # Print the message.
185
+ if abs(iprint) >= 3:
186
+ message = f'\n{rho_message}{nf_message}{x_message}{constr_message}'
187
+ else:
188
+ message = f'{rho_message}{nf_message}{x_message}{constr_message}'
189
+ if len(fname) > 0:
190
+ with open(fname, 'a') as f: f.write(message)
191
+ else:
192
+ print(message)
193
+
194
+ #====================#
195
+ # Calculation ends #
196
+ #====================#
197
+
198
+
199
+ def cpenmsg(solver, iprint, cpen):
200
+ '''
201
+ This function prints a message when CPEN is updated.
202
+ '''
203
+
204
+ #====================#
205
+ # Calculation starts #
206
+ #====================#
207
+
208
+ if abs(iprint) < 2: # No printing
209
+ return
210
+ elif iprint > 0: # Print the message to the standard out.
211
+ fname = ''
212
+ else: # Print the message to a file named FNAME.
213
+ fname = f'{solver.strip()}_output.txt'
214
+
215
+ # Print the message.
216
+ if abs(iprint) >= 3:
217
+ message = f'\nSet CPEN to {cpen}'
218
+ else:
219
+ message = f'\n\nSet CPEN to {cpen}'
220
+ if len(fname) > 0:
221
+ with open(fname, 'a') as f: f.write(message)
222
+ else:
223
+ print(message)
224
+
225
+ #====================#
226
+ # Calculation ends #
227
+ #====================#
228
+
229
+
230
+ def fmsg(solver, state, iprint, nf, delta, f, x, cstrv=None, constr=None):
231
+ '''
232
+ This subroutine prints messages for each evaluation of the objective function.
233
+ '''
234
+
235
+ #====================#
236
+ # Calculation starts #
237
+ #====================#
238
+
239
+ if abs(iprint) < 2: # No printing
240
+ return
241
+ elif iprint > 0: # Print the message to the standard out.
242
+ fname = ''
243
+ else: # Print the message to a file named FNAME.
244
+ fname = f'{solver.strip()}_output.txt'
245
+
246
+ # Decide whether the problem is truly constrained.
247
+ if present(constr):
248
+ is_constrained = (np.size(constr) > 0)
249
+ else:
250
+ is_constrained = present(cstrv)
251
+
252
+ # Decide the constraint violation.
253
+ if present(cstrv):
254
+ cstrv_loc = cstrv
255
+ elif present(constr):
256
+ cstrv_loc = np.max(np.append(0, -constr)) # N.B.: We assume that the constraint is CONSTR >= 0.
257
+ else:
258
+ cstrv_loc = 0
259
+
260
+ delta_message = f'\n{state} step with radius = {delta}'
261
+
262
+ if is_constrained:
263
+ nf_message = (f'\nNumber of function values = {nf}{spaces}'
264
+ f'Least value of F = {f}{spaces}Constraint violation = {cstrv_loc}')
265
+ else:
266
+ nf_message = f'\nNumber of function values = {nf}{spaces}Least value of F = {f}'
267
+
268
+ if np.size(x) <= 2:
269
+ x_message = f'\nThe corresponding X is: {x}' # Printed in one line
270
+ else:
271
+ x_message = f'\nThe corresponding X is:\n{x}'
272
+
273
+ if is_constrained and present(constr):
274
+ if np.size(constr) <= 2:
275
+ constr_message = f'\nThe constraint value is: {constr}' # Printed in one line
276
+ else:
277
+ constr_message = f'\nThe constraint value is:\n{constr}'
278
+ else:
279
+ constr_message = ''
280
+
281
+ # Print the message.
282
+ message = f'{delta_message}{nf_message}{x_message}{constr_message}'
283
+ if len(fname) > 0:
284
+ with open(fname, 'a') as f: f.write(message)
285
+ else:
286
+ print(message)
287
+
288
+ #====================#
289
+ # Calculation ends #
290
+ #====================#
@@ -0,0 +1,131 @@
1
+ '''
2
+ This module provides some Powell-style linear algebra procedures.
3
+
4
+ Translated from Zaikun Zhang's modern-Fortran reference implementation in PRIMA.
5
+
6
+ Dedicated to late Professor M. J. D. Powell FRS (1936--2015).
7
+
8
+ Python translation by Nickolai Belakovski.
9
+ '''
10
+
11
+ import numpy as np
12
+ from .linalg import isminor, planerot, matprod, inprod, hypot
13
+ from .consts import DEBUGGING, EPS
14
+
15
+
16
+ def qradd_Rdiag(c, Q, Rdiag, n):
17
+ '''
18
+ This function updates the QR factorization of an MxN matrix A of full column rank, attempting to
19
+ add a new column C to this matrix as the LAST column while maintaining the full-rankness.
20
+ Case 1. If C is not in range(A) (theoretically, it implies N < M), then the new matrix is np.hstack([A, C])
21
+ Case 2. If C is in range(A), then the new matrix is np.hstack([A[:, :n-1], C])
22
+ N.B.:
23
+ 0. Instead of R, this subroutine updates Rdiag, which is np.diag(R), with a size at most M and at
24
+ least min(m, n+1). The number is min(m, n+1) rather than min(m, n) as n may be augmented by 1 in
25
+ the function.
26
+ 1. With the two cases specified as above, this function does not need A as an input.
27
+ 2. The function changes only Q[:, nsave:m] (nsave is the original value of n) and
28
+ R[:, n-1] (n takes the updated value)
29
+ 3. Indeed, when C is in range(A), Powell wrote in comments that "set iOUT to the index of the
30
+ constraint (here, column of A --- Zaikun) to be deleted, but branch if no suitable index can be
31
+ found". The idea is to replace a column of A by C so that the new matrix still has full rank
32
+ (such a column must exist unless C = 0). But his code essentially sets iout=n always. Maybe he
33
+ found this worked well enough in practice. Meanwhile, Powell's code includes a snippet that can
34
+ never be reached, which was probably intended to deal with the case that IOUT != n
35
+ '''
36
+ m = Q.shape[1]
37
+ nsave = n # Needed for debugging (only)
38
+
39
+ # As in Powell's COBYLA, CQ is set to 0 at the positions with CQ being negligible as per ISMINOR.
40
+ # This may not be the best choice if the subroutine is used in other contexts, e.g. LINCOA.
41
+ cq = matprod(c, Q)
42
+ cqa = matprod(abs(c), abs(Q))
43
+ # The line below basically makes an element of cq 0 if adding it to the corresponding element of
44
+ # cqa does not change the latter.
45
+ cq = np.array([0 if isminor(cqi, cqai) else cqi for cqi, cqai in zip(cq, cqa)])
46
+
47
+ # Update Q so that the columns of Q[:, n+1:m] are orthogonal to C. This is done by applying a 2D
48
+ # Givens rotation to Q[:, [k, k+1]] from the right to zero C' @ Q[:, k+1] out for K=n+1, ... m-1.
49
+ # Nothing will be done if n >= m-1
50
+ for k in range(m-2, n-1, -1):
51
+ if abs(cq[k+1]) > 0:
52
+ # Powell wrote cq[k+1] != 0 instead of abs. The two differ if cq[k+1] is NaN.
53
+ # If we apply the rotation below when cq[k+1] = 0, then cq[k] will get updated to |cq[k]|.
54
+ G = planerot(cq[k:k+2])
55
+ Q[:, [k, k+1]] = matprod(Q[:, [k, k+1]], G.T)
56
+ cq[k] = hypot(*cq[k:k+2])
57
+
58
+ # Augment n by 1 if C is not in range(A)
59
+ if n < m:
60
+ # Powell's condition for the following if: cq[n+1] != 0
61
+ if abs(cq[n]) > EPS**2 and not isminor(cq[n], cqa[n]):
62
+ n += 1
63
+
64
+ # Update Rdiag so that Rdiag[n] = cq[n] = np.dot(c, q[:, n]). Note that N may be been augmented.
65
+ if n - 1 >= 0 and n - 1 < m: # n >= m should not happen unless the input is wrong
66
+ Rdiag[n - 1] = cq[n - 1]
67
+
68
+ if DEBUGGING:
69
+ assert nsave <= n <= min(nsave + 1, m)
70
+ assert n <= len(Rdiag) <= m
71
+ assert Q.shape == (m, m)
72
+
73
+ return Q, Rdiag, n
74
+
75
+
76
+ def qrexc_Rdiag(A, Q, Rdiag, i): # Used in COBYLA
77
+ '''
78
+ This function updates the QR factorization for an MxN matrix A=Q@R so that the updated Q and
79
+ R form a QR factorization of [A_0, ..., A_{I-1}, A_{I+1}, ..., A_{N-1}, A_I] which is the matrix
80
+ obtained by rearranging columns [I, I+1, ... N-1] of A to [I+1, ..., N-1, I]. Here A is ASSUMED TO
81
+ BE OF FULL COLUMN RANK, Q is a matrix whose columns are orthogonal, and R, which is not present,
82
+ is an upper triangular matrix whose diagonal entries are nonzero. Q and R need not be square.
83
+ N.B.:
84
+ 0. Instead of R, this function updates Rdiag, which is np.diag(R), the size being n.
85
+ 1. With L = Q.shape[1] = R.shape[0], we have M >= L >= N. Most often L = M or N.
86
+ 2. This function changes only Q[:, i:] and Rdiag[i:]
87
+ 3. (NDB 20230919) In Python, i is either icon or nact - 2, whereas in FORTRAN it is either icon or nact - 1.
88
+ '''
89
+
90
+ # Sizes
91
+ m, n = A.shape
92
+
93
+ # Preconditions
94
+ assert n >= 1 and n <= m
95
+ assert i >= 0 and i < n
96
+ assert len(Rdiag) == n
97
+ assert Q.shape[0] == m and Q.shape[1] >= n and Q.shape[1] <= m
98
+ # tol = max(1.0E-8, min(1.0E-1, 1.0E8 * EPS * m + 1))
99
+ # assert isorth(Q, tol) # Costly!
100
+
101
+
102
+ if i < 0 or i >= n:
103
+ return Q, Rdiag
104
+
105
+ # Let R be the upper triangular matrix in the QR factorization, namely R = Q.T@A.
106
+ # For each k, find the Givens rotation G with G@(R[k:k+2, :]) = [hypt, 0], and update Q[:, k:k+2]
107
+ # to Q[:, k:k+2]@(G.T). Then R = Q.T@A is an upper triangular matrix as long as A[:, [k, k+1]] is
108
+ # updated to A[:, [k+1, k]]. Indeed, this new upper triangular matrix can be obtained by first
109
+ # updating R[[k, k+1], :] to G@(R[[k, k+1], :]) and then exchanging its columns K and K+1; at the same
110
+ # time, entries k and k+1 of R's diagonal Rdiag become [hypt, -(Rdiag[k+1]/hypt)*RDiag[k]].
111
+ # After this is done for each k = 0, ..., n-2, we obtain the QR factorization of the matrix that
112
+ # rearranges columns [i, i+1, ... n-1] of A as [i+1, ..., n-1, i].
113
+ # Powell's code, however, is slightly different: before everything, he first exchanged columns k and
114
+ # k+1 of Q (as well as rows k and k+1 of R). This makes sure that the entries of the update Rdiag
115
+ # are all positive if it is the case for the original Rdiag.
116
+ for k in range(i, n-1):
117
+ G = planerot([Rdiag[k+1], inprod(Q[:, k], A[:, k+1])])
118
+ Q[:, [k, k+1]] = matprod(Q[:, [k+1, k]], (G.T))
119
+ # Powell's code updates Rdiag in the following way:
120
+ # hypt = np.sqrt(Rdiag[k+1]**2 + np.dot(Q[:, k], A[:, k+1])**2)
121
+ # Rdiag[[k, k+1]] = [hypt, (Rdiag[k+1]/hypt)*Rdiag[k]]
122
+ # Note that Rdiag[n-1] inherits all rounding in Rdiag[i:n-1] and Q[:, i:n-1] and hence contains
123
+ # significant errors. Thus we may modify Powell's code to set only Rdiag[k] = hypt here and then
124
+ # calculate Rdiag[n] by an inner product after the loop. Nevertheless, we simple calculate RDiag
125
+ # from scratch below.
126
+
127
+ # Calculate Rdiag(i:n) from scratch
128
+ Rdiag[i:n-1] = [inprod(Q[:, k], A[:, k+1]) for k in range(i, n-1)]
129
+ Rdiag[n-1] = inprod(Q[:, n-1], A[:, i])
130
+
131
+ return Q, Rdiag