scipy 1.15.3__cp313-cp313-macosx_12_0_arm64.whl → 1.16.0__cp313-cp313-macosx_12_0_arm64.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 (630) hide show
  1. scipy/.dylibs/libscipy_openblas.dylib +0 -0
  2. scipy/__config__.py +8 -8
  3. scipy/__init__.py +3 -6
  4. scipy/_cyutility.cpython-313-darwin.so +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.cpython-313-darwin.so +0 -0
  9. scipy/_lib/_docscrape.py +1 -1
  10. scipy/_lib/_elementwise_iterative_method.py +15 -26
  11. scipy/_lib/_sparse.py +41 -0
  12. scipy/_lib/_test_deprecation_call.cpython-313-darwin.so +0 -0
  13. scipy/_lib/_test_deprecation_def.cpython-313-darwin.so +0 -0
  14. scipy/_lib/_testutils.py +6 -2
  15. scipy/_lib/_util.py +222 -125
  16. scipy/_lib/array_api_compat/__init__.py +4 -4
  17. scipy/_lib/array_api_compat/_internal.py +19 -6
  18. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  19. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  20. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  21. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  22. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  23. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  24. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  25. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  26. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  27. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  28. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  29. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  30. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  31. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  32. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  33. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  34. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  35. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  36. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  37. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  38. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  39. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  40. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  41. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  42. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  43. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  44. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  45. scipy/_lib/array_api_extra/__init__.py +26 -3
  46. scipy/_lib/array_api_extra/_delegation.py +171 -0
  47. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  48. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  49. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  50. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  51. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  52. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  53. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  54. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  58. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  59. scipy/_lib/array_api_extra/testing.py +359 -0
  60. scipy/_lib/decorator.py +2 -2
  61. scipy/_lib/doccer.py +1 -7
  62. scipy/_lib/messagestream.cpython-313-darwin.so +0 -0
  63. scipy/_lib/pyprima/__init__.py +212 -0
  64. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  65. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  66. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  67. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  68. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  69. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  70. scipy/_lib/pyprima/cobyla/update.py +289 -0
  71. scipy/_lib/pyprima/common/__init__.py +0 -0
  72. scipy/_lib/pyprima/common/_bounds.py +34 -0
  73. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  74. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  75. scipy/_lib/pyprima/common/_project.py +173 -0
  76. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  77. scipy/_lib/pyprima/common/consts.py +47 -0
  78. scipy/_lib/pyprima/common/evaluate.py +99 -0
  79. scipy/_lib/pyprima/common/history.py +38 -0
  80. scipy/_lib/pyprima/common/infos.py +30 -0
  81. scipy/_lib/pyprima/common/linalg.py +435 -0
  82. scipy/_lib/pyprima/common/message.py +290 -0
  83. scipy/_lib/pyprima/common/powalg.py +131 -0
  84. scipy/_lib/pyprima/common/preproc.py +277 -0
  85. scipy/_lib/pyprima/common/present.py +5 -0
  86. scipy/_lib/pyprima/common/ratio.py +54 -0
  87. scipy/_lib/pyprima/common/redrho.py +47 -0
  88. scipy/_lib/pyprima/common/selectx.py +296 -0
  89. scipy/_lib/tests/test__util.py +105 -121
  90. scipy/_lib/tests/test_array_api.py +166 -35
  91. scipy/_lib/tests/test_bunch.py +7 -0
  92. scipy/_lib/tests/test_ccallback.py +2 -10
  93. scipy/_lib/tests/test_public_api.py +13 -0
  94. scipy/cluster/_hierarchy.cpython-313-darwin.so +0 -0
  95. scipy/cluster/_optimal_leaf_ordering.cpython-313-darwin.so +0 -0
  96. scipy/cluster/_vq.cpython-313-darwin.so +0 -0
  97. scipy/cluster/hierarchy.py +393 -223
  98. scipy/cluster/tests/test_hierarchy.py +273 -335
  99. scipy/cluster/tests/test_vq.py +45 -61
  100. scipy/cluster/vq.py +39 -35
  101. scipy/conftest.py +282 -151
  102. scipy/constants/_constants.py +4 -1
  103. scipy/constants/tests/test_codata.py +2 -2
  104. scipy/constants/tests/test_constants.py +11 -18
  105. scipy/datasets/_download_all.py +15 -1
  106. scipy/datasets/_fetchers.py +7 -1
  107. scipy/datasets/_utils.py +1 -1
  108. scipy/differentiate/_differentiate.py +25 -25
  109. scipy/differentiate/tests/test_differentiate.py +24 -25
  110. scipy/fft/_basic.py +20 -0
  111. scipy/fft/_helper.py +3 -34
  112. scipy/fft/_pocketfft/helper.py +29 -1
  113. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  114. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  115. scipy/fft/_realtransforms.py +13 -0
  116. scipy/fft/tests/test_basic.py +27 -25
  117. scipy/fft/tests/test_fftlog.py +16 -7
  118. scipy/fft/tests/test_helper.py +18 -34
  119. scipy/fft/tests/test_real_transforms.py +8 -10
  120. scipy/fftpack/convolve.cpython-313-darwin.so +0 -0
  121. scipy/fftpack/tests/test_basic.py +2 -4
  122. scipy/fftpack/tests/test_real_transforms.py +8 -9
  123. scipy/integrate/_bvp.py +9 -3
  124. scipy/integrate/_cubature.py +3 -2
  125. scipy/integrate/_dop.cpython-313-darwin.so +0 -0
  126. scipy/integrate/_lsoda.cpython-313-darwin.so +0 -0
  127. scipy/integrate/_ode.py +9 -2
  128. scipy/integrate/_odepack.cpython-313-darwin.so +0 -0
  129. scipy/integrate/_quad_vec.py +21 -29
  130. scipy/integrate/_quadpack.cpython-313-darwin.so +0 -0
  131. scipy/integrate/_quadpack_py.py +11 -7
  132. scipy/integrate/_quadrature.py +3 -3
  133. scipy/integrate/_rules/_base.py +2 -2
  134. scipy/integrate/_tanhsinh.py +48 -47
  135. scipy/integrate/_test_odeint_banded.cpython-313-darwin.so +0 -0
  136. scipy/integrate/_vode.cpython-313-darwin.so +0 -0
  137. scipy/integrate/tests/test__quad_vec.py +0 -6
  138. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  139. scipy/integrate/tests/test_cubature.py +21 -35
  140. scipy/integrate/tests/test_quadrature.py +6 -8
  141. scipy/integrate/tests/test_tanhsinh.py +56 -48
  142. scipy/interpolate/__init__.py +70 -58
  143. scipy/interpolate/_bary_rational.py +22 -22
  144. scipy/interpolate/_bsplines.py +119 -66
  145. scipy/interpolate/_cubic.py +65 -50
  146. scipy/interpolate/_dfitpack.cpython-313-darwin.so +0 -0
  147. scipy/interpolate/_dierckx.cpython-313-darwin.so +0 -0
  148. scipy/interpolate/_fitpack.cpython-313-darwin.so +0 -0
  149. scipy/interpolate/_fitpack2.py +9 -6
  150. scipy/interpolate/_fitpack_impl.py +32 -26
  151. scipy/interpolate/_fitpack_repro.py +23 -19
  152. scipy/interpolate/_interpnd.cpython-313-darwin.so +0 -0
  153. scipy/interpolate/_interpolate.py +30 -12
  154. scipy/interpolate/_ndbspline.py +13 -18
  155. scipy/interpolate/_ndgriddata.py +5 -8
  156. scipy/interpolate/_polyint.py +95 -31
  157. scipy/interpolate/_ppoly.cpython-313-darwin.so +0 -0
  158. scipy/interpolate/_rbf.py +2 -2
  159. scipy/interpolate/_rbfinterp.py +1 -1
  160. scipy/interpolate/_rbfinterp_pythran.cpython-313-darwin.so +0 -0
  161. scipy/interpolate/_rgi.py +31 -26
  162. scipy/interpolate/_rgi_cython.cpython-313-darwin.so +0 -0
  163. scipy/interpolate/dfitpack.py +0 -20
  164. scipy/interpolate/interpnd.py +1 -2
  165. scipy/interpolate/tests/test_bary_rational.py +2 -2
  166. scipy/interpolate/tests/test_bsplines.py +97 -1
  167. scipy/interpolate/tests/test_fitpack2.py +39 -1
  168. scipy/interpolate/tests/test_interpnd.py +32 -20
  169. scipy/interpolate/tests/test_interpolate.py +48 -4
  170. scipy/interpolate/tests/test_rgi.py +2 -1
  171. scipy/io/_fast_matrix_market/__init__.py +2 -0
  172. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  173. scipy/io/_harwell_boeing/hb.py +7 -11
  174. scipy/io/_idl.py +5 -7
  175. scipy/io/_netcdf.py +15 -5
  176. scipy/io/_test_fortran.cpython-313-darwin.so +0 -0
  177. scipy/io/arff/tests/test_arffread.py +3 -3
  178. scipy/io/matlab/__init__.py +5 -3
  179. scipy/io/matlab/_mio.py +4 -1
  180. scipy/io/matlab/_mio5.py +19 -13
  181. scipy/io/matlab/_mio5_utils.cpython-313-darwin.so +0 -0
  182. scipy/io/matlab/_mio_utils.cpython-313-darwin.so +0 -0
  183. scipy/io/matlab/_miobase.py +4 -1
  184. scipy/io/matlab/_streams.cpython-313-darwin.so +0 -0
  185. scipy/io/matlab/tests/test_mio.py +46 -18
  186. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  187. scipy/io/tests/test_mmio.py +7 -1
  188. scipy/io/tests/test_wavfile.py +41 -0
  189. scipy/io/wavfile.py +57 -10
  190. scipy/linalg/_basic.py +113 -86
  191. scipy/linalg/_cythonized_array_utils.cpython-313-darwin.so +0 -0
  192. scipy/linalg/_decomp.py +22 -9
  193. scipy/linalg/_decomp_cholesky.py +28 -13
  194. scipy/linalg/_decomp_cossin.py +45 -30
  195. scipy/linalg/_decomp_interpolative.cpython-313-darwin.so +0 -0
  196. scipy/linalg/_decomp_ldl.py +4 -1
  197. scipy/linalg/_decomp_lu.py +18 -6
  198. scipy/linalg/_decomp_lu_cython.cpython-313-darwin.so +0 -0
  199. scipy/linalg/_decomp_polar.py +2 -0
  200. scipy/linalg/_decomp_qr.py +6 -2
  201. scipy/linalg/_decomp_qz.py +3 -0
  202. scipy/linalg/_decomp_schur.py +3 -1
  203. scipy/linalg/_decomp_svd.py +13 -2
  204. scipy/linalg/_decomp_update.cpython-313-darwin.so +0 -0
  205. scipy/linalg/_expm_frechet.py +4 -0
  206. scipy/linalg/_fblas.cpython-313-darwin.so +0 -0
  207. scipy/linalg/_flapack.cpython-313-darwin.so +0 -0
  208. scipy/linalg/_linalg_pythran.cpython-313-darwin.so +0 -0
  209. scipy/linalg/_matfuncs.py +187 -4
  210. scipy/linalg/_matfuncs_expm.cpython-313-darwin.so +0 -0
  211. scipy/linalg/_matfuncs_schur_sqrtm.cpython-313-darwin.so +0 -0
  212. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  213. scipy/linalg/_matfuncs_sqrtm_triu.cpython-313-darwin.so +0 -0
  214. scipy/linalg/_procrustes.py +2 -0
  215. scipy/linalg/_sketches.py +17 -6
  216. scipy/linalg/_solve_toeplitz.cpython-313-darwin.so +0 -0
  217. scipy/linalg/_solvers.py +7 -2
  218. scipy/linalg/_special_matrices.py +26 -36
  219. scipy/linalg/blas.py +35 -24
  220. scipy/linalg/cython_blas.cpython-313-darwin.so +0 -0
  221. scipy/linalg/cython_lapack.cpython-313-darwin.so +0 -0
  222. scipy/linalg/lapack.py +22 -2
  223. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  224. scipy/linalg/tests/test_basic.py +31 -16
  225. scipy/linalg/tests/test_batch.py +588 -0
  226. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  227. scipy/linalg/tests/test_decomp.py +40 -3
  228. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  229. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  230. scipy/linalg/tests/test_lapack.py +115 -7
  231. scipy/linalg/tests/test_matfuncs.py +157 -102
  232. scipy/linalg/tests/test_procrustes.py +0 -7
  233. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  234. scipy/linalg/tests/test_special_matrices.py +1 -5
  235. scipy/ndimage/__init__.py +1 -0
  236. scipy/ndimage/_cytest.cpython-313-darwin.so +0 -0
  237. scipy/ndimage/_delegators.py +8 -2
  238. scipy/ndimage/_filters.py +453 -5
  239. scipy/ndimage/_interpolation.py +36 -6
  240. scipy/ndimage/_measurements.py +4 -2
  241. scipy/ndimage/_morphology.py +5 -0
  242. scipy/ndimage/_nd_image.cpython-313-darwin.so +0 -0
  243. scipy/ndimage/_ni_docstrings.py +5 -1
  244. scipy/ndimage/_ni_label.cpython-313-darwin.so +0 -0
  245. scipy/ndimage/_ni_support.py +1 -5
  246. scipy/ndimage/_rank_filter_1d.cpython-313-darwin.so +0 -0
  247. scipy/ndimage/_support_alternative_backends.py +18 -6
  248. scipy/ndimage/tests/test_filters.py +370 -259
  249. scipy/ndimage/tests/test_fourier.py +7 -9
  250. scipy/ndimage/tests/test_interpolation.py +68 -61
  251. scipy/ndimage/tests/test_measurements.py +18 -35
  252. scipy/ndimage/tests/test_morphology.py +143 -131
  253. scipy/ndimage/tests/test_splines.py +1 -3
  254. scipy/odr/__odrpack.cpython-313-darwin.so +0 -0
  255. scipy/optimize/_basinhopping.py +13 -7
  256. scipy/optimize/_bglu_dense.cpython-313-darwin.so +0 -0
  257. scipy/optimize/_bracket.py +17 -24
  258. scipy/optimize/_chandrupatla.py +9 -10
  259. scipy/optimize/_cobyla_py.py +104 -123
  260. scipy/optimize/_constraints.py +14 -10
  261. scipy/optimize/_differentiable_functions.py +371 -230
  262. scipy/optimize/_differentialevolution.py +4 -3
  263. scipy/optimize/_direct.cpython-313-darwin.so +0 -0
  264. scipy/optimize/_dual_annealing.py +1 -1
  265. scipy/optimize/_elementwise.py +1 -4
  266. scipy/optimize/_group_columns.cpython-313-darwin.so +0 -0
  267. scipy/optimize/_lbfgsb.cpython-313-darwin.so +0 -0
  268. scipy/optimize/_lbfgsb_py.py +80 -24
  269. scipy/optimize/_linprog_doc.py +2 -2
  270. scipy/optimize/_linprog_highs.py +2 -2
  271. scipy/optimize/_linprog_ip.py +25 -10
  272. scipy/optimize/_linprog_util.py +14 -16
  273. scipy/optimize/_lsap.cpython-313-darwin.so +0 -0
  274. scipy/optimize/_lsq/common.py +3 -3
  275. scipy/optimize/_lsq/dogbox.py +16 -2
  276. scipy/optimize/_lsq/givens_elimination.cpython-313-darwin.so +0 -0
  277. scipy/optimize/_lsq/least_squares.py +198 -126
  278. scipy/optimize/_lsq/lsq_linear.py +6 -6
  279. scipy/optimize/_lsq/trf.py +35 -8
  280. scipy/optimize/_milp.py +3 -1
  281. scipy/optimize/_minimize.py +105 -36
  282. scipy/optimize/_minpack.cpython-313-darwin.so +0 -0
  283. scipy/optimize/_minpack_py.py +21 -14
  284. scipy/optimize/_moduleTNC.cpython-313-darwin.so +0 -0
  285. scipy/optimize/_nnls.py +20 -21
  286. scipy/optimize/_nonlin.py +34 -3
  287. scipy/optimize/_numdiff.py +288 -110
  288. scipy/optimize/_optimize.py +86 -48
  289. scipy/optimize/_pava_pybind.cpython-313-darwin.so +0 -0
  290. scipy/optimize/_remove_redundancy.py +5 -5
  291. scipy/optimize/_root_scalar.py +1 -1
  292. scipy/optimize/_shgo.py +6 -0
  293. scipy/optimize/_shgo_lib/_complex.py +1 -1
  294. scipy/optimize/_slsqp_py.py +216 -124
  295. scipy/optimize/_slsqplib.cpython-313-darwin.so +0 -0
  296. scipy/optimize/_spectral.py +1 -1
  297. scipy/optimize/_tnc.py +8 -1
  298. scipy/optimize/_trlib/_trlib.cpython-313-darwin.so +0 -0
  299. scipy/optimize/_trustregion.py +20 -6
  300. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  301. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  302. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  303. scipy/optimize/_trustregion_constr/projections.py +12 -8
  304. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  305. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  306. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  307. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  308. scipy/optimize/_trustregion_exact.py +0 -1
  309. scipy/optimize/_zeros.cpython-313-darwin.so +0 -0
  310. scipy/optimize/_zeros_py.py +97 -17
  311. scipy/optimize/cython_optimize/_zeros.cpython-313-darwin.so +0 -0
  312. scipy/optimize/slsqp.py +0 -1
  313. scipy/optimize/tests/test__basinhopping.py +1 -1
  314. scipy/optimize/tests/test__differential_evolution.py +4 -4
  315. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  316. scipy/optimize/tests/test__numdiff.py +66 -22
  317. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  318. scipy/optimize/tests/test__shgo.py +9 -1
  319. scipy/optimize/tests/test_bracket.py +36 -46
  320. scipy/optimize/tests/test_chandrupatla.py +133 -135
  321. scipy/optimize/tests/test_cobyla.py +74 -45
  322. scipy/optimize/tests/test_constraints.py +1 -1
  323. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  324. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  325. scipy/optimize/tests/test_least_squares.py +125 -13
  326. scipy/optimize/tests/test_linear_assignment.py +3 -3
  327. scipy/optimize/tests/test_linprog.py +3 -3
  328. scipy/optimize/tests/test_lsq_linear.py +6 -6
  329. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  330. scipy/optimize/tests/test_minpack.py +4 -4
  331. scipy/optimize/tests/test_nnls.py +43 -3
  332. scipy/optimize/tests/test_nonlin.py +36 -0
  333. scipy/optimize/tests/test_optimize.py +98 -20
  334. scipy/optimize/tests/test_slsqp.py +36 -4
  335. scipy/optimize/tests/test_zeros.py +34 -1
  336. scipy/signal/__init__.py +12 -23
  337. scipy/signal/_delegators.py +568 -0
  338. scipy/signal/_filter_design.py +459 -241
  339. scipy/signal/_fir_filter_design.py +262 -90
  340. scipy/signal/_lti_conversion.py +3 -2
  341. scipy/signal/_ltisys.py +118 -91
  342. scipy/signal/_max_len_seq_inner.cpython-313-darwin.so +0 -0
  343. scipy/signal/_peak_finding_utils.cpython-313-darwin.so +0 -0
  344. scipy/signal/_polyutils.py +172 -0
  345. scipy/signal/_short_time_fft.py +519 -70
  346. scipy/signal/_signal_api.py +30 -0
  347. scipy/signal/_signaltools.py +719 -399
  348. scipy/signal/_sigtools.cpython-313-darwin.so +0 -0
  349. scipy/signal/_sosfilt.cpython-313-darwin.so +0 -0
  350. scipy/signal/_spectral_py.py +230 -50
  351. scipy/signal/_spline.cpython-313-darwin.so +0 -0
  352. scipy/signal/_spline_filters.py +108 -68
  353. scipy/signal/_support_alternative_backends.py +73 -0
  354. scipy/signal/_upfirdn.py +4 -1
  355. scipy/signal/_upfirdn_apply.cpython-313-darwin.so +0 -0
  356. scipy/signal/_waveforms.py +2 -11
  357. scipy/signal/_wavelets.py +1 -1
  358. scipy/signal/fir_filter_design.py +1 -0
  359. scipy/signal/spline.py +4 -11
  360. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  361. scipy/signal/tests/test_bsplines.py +114 -79
  362. scipy/signal/tests/test_cont2discrete.py +9 -2
  363. scipy/signal/tests/test_filter_design.py +721 -481
  364. scipy/signal/tests/test_fir_filter_design.py +332 -140
  365. scipy/signal/tests/test_savitzky_golay.py +4 -3
  366. scipy/signal/tests/test_short_time_fft.py +221 -3
  367. scipy/signal/tests/test_signaltools.py +2145 -1349
  368. scipy/signal/tests/test_spectral.py +50 -6
  369. scipy/signal/tests/test_splines.py +161 -96
  370. scipy/signal/tests/test_upfirdn.py +84 -50
  371. scipy/signal/tests/test_waveforms.py +20 -0
  372. scipy/signal/tests/test_windows.py +607 -466
  373. scipy/signal/windows/_windows.py +287 -148
  374. scipy/sparse/__init__.py +23 -4
  375. scipy/sparse/_base.py +270 -108
  376. scipy/sparse/_bsr.py +7 -4
  377. scipy/sparse/_compressed.py +59 -231
  378. scipy/sparse/_construct.py +90 -38
  379. scipy/sparse/_coo.py +115 -181
  380. scipy/sparse/_csc.py +4 -4
  381. scipy/sparse/_csparsetools.cpython-313-darwin.so +0 -0
  382. scipy/sparse/_csr.py +2 -2
  383. scipy/sparse/_data.py +48 -48
  384. scipy/sparse/_dia.py +105 -18
  385. scipy/sparse/_dok.py +0 -23
  386. scipy/sparse/_index.py +4 -4
  387. scipy/sparse/_matrix.py +23 -0
  388. scipy/sparse/_sparsetools.cpython-313-darwin.so +0 -0
  389. scipy/sparse/_sputils.py +37 -22
  390. scipy/sparse/base.py +0 -9
  391. scipy/sparse/bsr.py +0 -14
  392. scipy/sparse/compressed.py +0 -23
  393. scipy/sparse/construct.py +0 -6
  394. scipy/sparse/coo.py +0 -14
  395. scipy/sparse/csc.py +0 -3
  396. scipy/sparse/csgraph/_flow.cpython-313-darwin.so +0 -0
  397. scipy/sparse/csgraph/_matching.cpython-313-darwin.so +0 -0
  398. scipy/sparse/csgraph/_min_spanning_tree.cpython-313-darwin.so +0 -0
  399. scipy/sparse/csgraph/_reordering.cpython-313-darwin.so +0 -0
  400. scipy/sparse/csgraph/_shortest_path.cpython-313-darwin.so +0 -0
  401. scipy/sparse/csgraph/_tools.cpython-313-darwin.so +0 -0
  402. scipy/sparse/csgraph/_traversal.cpython-313-darwin.so +0 -0
  403. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  404. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  405. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  406. scipy/sparse/csr.py +0 -5
  407. scipy/sparse/data.py +1 -6
  408. scipy/sparse/dia.py +0 -7
  409. scipy/sparse/dok.py +0 -10
  410. scipy/sparse/linalg/_dsolve/_superlu.cpython-313-darwin.so +0 -0
  411. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  412. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  413. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313-darwin.so +0 -0
  414. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  415. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  416. scipy/sparse/linalg/_interface.py +17 -18
  417. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  418. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  419. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  420. scipy/sparse/linalg/_isolve/minres.py +5 -5
  421. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  422. scipy/sparse/linalg/_isolve/utils.py +2 -8
  423. scipy/sparse/linalg/_matfuncs.py +1 -1
  424. scipy/sparse/linalg/_norm.py +1 -1
  425. scipy/sparse/linalg/_propack/_cpropack.cpython-313-darwin.so +0 -0
  426. scipy/sparse/linalg/_propack/_dpropack.cpython-313-darwin.so +0 -0
  427. scipy/sparse/linalg/_propack/_spropack.cpython-313-darwin.so +0 -0
  428. scipy/sparse/linalg/_propack/_zpropack.cpython-313-darwin.so +0 -0
  429. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  430. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  431. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  432. scipy/sparse/tests/test_base.py +214 -42
  433. scipy/sparse/tests/test_common1d.py +7 -7
  434. scipy/sparse/tests/test_construct.py +1 -1
  435. scipy/sparse/tests/test_coo.py +272 -4
  436. scipy/sparse/tests/test_sparsetools.py +5 -0
  437. scipy/sparse/tests/test_sputils.py +36 -7
  438. scipy/spatial/_ckdtree.cpython-313-darwin.so +0 -0
  439. scipy/spatial/_distance_pybind.cpython-313-darwin.so +0 -0
  440. scipy/spatial/_distance_wrap.cpython-313-darwin.so +0 -0
  441. scipy/spatial/_hausdorff.cpython-313-darwin.so +0 -0
  442. scipy/spatial/_qhull.cpython-313-darwin.so +0 -0
  443. scipy/spatial/_voronoi.cpython-313-darwin.so +0 -0
  444. scipy/spatial/distance.py +49 -42
  445. scipy/spatial/tests/test_distance.py +15 -1
  446. scipy/spatial/tests/test_kdtree.py +1 -0
  447. scipy/spatial/tests/test_qhull.py +7 -2
  448. scipy/spatial/transform/__init__.py +5 -3
  449. scipy/spatial/transform/_rigid_transform.cpython-313-darwin.so +0 -0
  450. scipy/spatial/transform/_rotation.cpython-313-darwin.so +0 -0
  451. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  452. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  453. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  454. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  455. scipy/special/__init__.py +1 -47
  456. scipy/special/_add_newdocs.py +34 -772
  457. scipy/special/_basic.py +22 -25
  458. scipy/special/_comb.cpython-313-darwin.so +0 -0
  459. scipy/special/_ellip_harm_2.cpython-313-darwin.so +0 -0
  460. scipy/special/_gufuncs.cpython-313-darwin.so +0 -0
  461. scipy/special/_logsumexp.py +67 -58
  462. scipy/special/_orthogonal.pyi +1 -1
  463. scipy/special/_specfun.cpython-313-darwin.so +0 -0
  464. scipy/special/_special_ufuncs.cpython-313-darwin.so +0 -0
  465. scipy/special/_spherical_bessel.py +4 -4
  466. scipy/special/_support_alternative_backends.py +212 -119
  467. scipy/special/_test_internal.cpython-313-darwin.so +0 -0
  468. scipy/special/_testutils.py +4 -4
  469. scipy/special/_ufuncs.cpython-313-darwin.so +0 -0
  470. scipy/special/_ufuncs.pyi +1 -0
  471. scipy/special/_ufuncs.pyx +215 -1400
  472. scipy/special/_ufuncs_cxx.cpython-313-darwin.so +0 -0
  473. scipy/special/_ufuncs_cxx.pxd +2 -15
  474. scipy/special/_ufuncs_cxx.pyx +5 -44
  475. scipy/special/_ufuncs_cxx_defs.h +2 -16
  476. scipy/special/_ufuncs_defs.h +0 -8
  477. scipy/special/cython_special.cpython-313-darwin.so +0 -0
  478. scipy/special/cython_special.pxd +1 -1
  479. scipy/special/tests/_cython_examples/meson.build +10 -1
  480. scipy/special/tests/test_basic.py +153 -20
  481. scipy/special/tests/test_boost_ufuncs.py +3 -0
  482. scipy/special/tests/test_cdflib.py +35 -11
  483. scipy/special/tests/test_gammainc.py +16 -0
  484. scipy/special/tests/test_hyp2f1.py +2 -2
  485. scipy/special/tests/test_log1mexp.py +85 -0
  486. scipy/special/tests/test_logsumexp.py +206 -64
  487. scipy/special/tests/test_mpmath.py +1 -0
  488. scipy/special/tests/test_nan_inputs.py +1 -1
  489. scipy/special/tests/test_orthogonal.py +17 -18
  490. scipy/special/tests/test_sf_error.py +3 -2
  491. scipy/special/tests/test_sph_harm.py +6 -7
  492. scipy/special/tests/test_support_alternative_backends.py +211 -76
  493. scipy/stats/__init__.py +4 -1
  494. scipy/stats/_ansari_swilk_statistics.cpython-313-darwin.so +0 -0
  495. scipy/stats/_axis_nan_policy.py +5 -12
  496. scipy/stats/_biasedurn.cpython-313-darwin.so +0 -0
  497. scipy/stats/_continued_fraction.py +387 -0
  498. scipy/stats/_continuous_distns.py +277 -310
  499. scipy/stats/_correlation.py +1 -1
  500. scipy/stats/_covariance.py +6 -3
  501. scipy/stats/_discrete_distns.py +39 -32
  502. scipy/stats/_distn_infrastructure.py +39 -12
  503. scipy/stats/_distribution_infrastructure.py +920 -238
  504. scipy/stats/_entropy.py +9 -10
  505. scipy/{_lib → stats}/_finite_differences.py +1 -1
  506. scipy/stats/_hypotests.py +83 -50
  507. scipy/stats/_kde.py +53 -49
  508. scipy/stats/_ksstats.py +1 -1
  509. scipy/stats/_levy_stable/__init__.py +7 -15
  510. scipy/stats/_levy_stable/levyst.cpython-313-darwin.so +0 -0
  511. scipy/stats/_morestats.py +118 -73
  512. scipy/stats/_mstats_basic.py +13 -17
  513. scipy/stats/_mstats_extras.py +8 -8
  514. scipy/stats/_multivariate.py +89 -113
  515. scipy/stats/_new_distributions.py +97 -20
  516. scipy/stats/_page_trend_test.py +12 -5
  517. scipy/stats/_probability_distribution.py +265 -43
  518. scipy/stats/_qmc.py +14 -9
  519. scipy/stats/_qmc_cy.cpython-313-darwin.so +0 -0
  520. scipy/stats/_qmvnt.py +16 -95
  521. scipy/stats/_qmvnt_cy.cpython-313-darwin.so +0 -0
  522. scipy/stats/_quantile.py +335 -0
  523. scipy/stats/_rcont/rcont.cpython-313-darwin.so +0 -0
  524. scipy/stats/_resampling.py +5 -30
  525. scipy/stats/_sampling.py +1 -1
  526. scipy/stats/_sobol.cpython-313-darwin.so +0 -0
  527. scipy/stats/_stats.cpython-313-darwin.so +0 -0
  528. scipy/stats/_stats_mstats_common.py +21 -2
  529. scipy/stats/_stats_py.py +551 -477
  530. scipy/stats/_stats_pythran.cpython-313-darwin.so +0 -0
  531. scipy/stats/_unuran/unuran_wrapper.cpython-313-darwin.so +0 -0
  532. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  533. scipy/stats/_variation.py +6 -8
  534. scipy/stats/_wilcoxon.py +13 -7
  535. scipy/stats/tests/common_tests.py +6 -4
  536. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  537. scipy/stats/tests/test_continued_fraction.py +173 -0
  538. scipy/stats/tests/test_continuous.py +379 -60
  539. scipy/stats/tests/test_continuous_basic.py +18 -12
  540. scipy/stats/tests/test_discrete_basic.py +14 -8
  541. scipy/stats/tests/test_discrete_distns.py +16 -16
  542. scipy/stats/tests/test_distributions.py +95 -75
  543. scipy/stats/tests/test_entropy.py +40 -48
  544. scipy/stats/tests/test_fit.py +4 -3
  545. scipy/stats/tests/test_hypotests.py +153 -24
  546. scipy/stats/tests/test_kdeoth.py +109 -41
  547. scipy/stats/tests/test_marray.py +289 -0
  548. scipy/stats/tests/test_morestats.py +81 -49
  549. scipy/stats/tests/test_mstats_basic.py +3 -3
  550. scipy/stats/tests/test_multivariate.py +434 -83
  551. scipy/stats/tests/test_qmc.py +13 -10
  552. scipy/stats/tests/test_quantile.py +199 -0
  553. scipy/stats/tests/test_rank.py +119 -112
  554. scipy/stats/tests/test_resampling.py +47 -56
  555. scipy/stats/tests/test_sampling.py +9 -4
  556. scipy/stats/tests/test_stats.py +799 -939
  557. scipy/stats/tests/test_variation.py +8 -6
  558. scipy/version.py +2 -2
  559. {scipy-1.15.3.dist-info → scipy-1.16.0.dist-info}/LICENSE.txt +4 -4
  560. {scipy-1.15.3.dist-info → scipy-1.16.0.dist-info}/METADATA +11 -11
  561. {scipy-1.15.3.dist-info → scipy-1.16.0.dist-info}/RECORD +562 -569
  562. scipy-1.16.0.dist-info/WHEEL +6 -0
  563. scipy/_lib/array_api_extra/_funcs.py +0 -484
  564. scipy/_lib/array_api_extra/_typing.py +0 -8
  565. scipy/interpolate/_bspl.cpython-313-darwin.so +0 -0
  566. scipy/optimize/_cobyla.cpython-313-darwin.so +0 -0
  567. scipy/optimize/_cython_nnls.cpython-313-darwin.so +0 -0
  568. scipy/optimize/_slsqp.cpython-313-darwin.so +0 -0
  569. scipy/spatial/qhull_src/COPYING.txt +0 -38
  570. scipy/special/libsf_error_state.dylib +0 -0
  571. scipy/special/tests/test_log_softmax.py +0 -109
  572. scipy/special/tests/test_xsf_cuda.py +0 -114
  573. scipy/special/xsf/binom.h +0 -89
  574. scipy/special/xsf/cdflib.h +0 -100
  575. scipy/special/xsf/cephes/airy.h +0 -307
  576. scipy/special/xsf/cephes/besselpoly.h +0 -51
  577. scipy/special/xsf/cephes/beta.h +0 -257
  578. scipy/special/xsf/cephes/cbrt.h +0 -131
  579. scipy/special/xsf/cephes/chbevl.h +0 -85
  580. scipy/special/xsf/cephes/chdtr.h +0 -193
  581. scipy/special/xsf/cephes/const.h +0 -87
  582. scipy/special/xsf/cephes/ellie.h +0 -293
  583. scipy/special/xsf/cephes/ellik.h +0 -251
  584. scipy/special/xsf/cephes/ellpe.h +0 -107
  585. scipy/special/xsf/cephes/ellpk.h +0 -117
  586. scipy/special/xsf/cephes/expn.h +0 -260
  587. scipy/special/xsf/cephes/gamma.h +0 -398
  588. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  589. scipy/special/xsf/cephes/hyperg.h +0 -361
  590. scipy/special/xsf/cephes/i0.h +0 -149
  591. scipy/special/xsf/cephes/i1.h +0 -158
  592. scipy/special/xsf/cephes/igam.h +0 -421
  593. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  594. scipy/special/xsf/cephes/igami.h +0 -313
  595. scipy/special/xsf/cephes/j0.h +0 -225
  596. scipy/special/xsf/cephes/j1.h +0 -198
  597. scipy/special/xsf/cephes/jv.h +0 -715
  598. scipy/special/xsf/cephes/k0.h +0 -164
  599. scipy/special/xsf/cephes/k1.h +0 -163
  600. scipy/special/xsf/cephes/kn.h +0 -243
  601. scipy/special/xsf/cephes/lanczos.h +0 -112
  602. scipy/special/xsf/cephes/ndtr.h +0 -275
  603. scipy/special/xsf/cephes/poch.h +0 -85
  604. scipy/special/xsf/cephes/polevl.h +0 -167
  605. scipy/special/xsf/cephes/psi.h +0 -194
  606. scipy/special/xsf/cephes/rgamma.h +0 -111
  607. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  608. scipy/special/xsf/cephes/shichi.h +0 -248
  609. scipy/special/xsf/cephes/sici.h +0 -224
  610. scipy/special/xsf/cephes/sindg.h +0 -221
  611. scipy/special/xsf/cephes/tandg.h +0 -139
  612. scipy/special/xsf/cephes/trig.h +0 -58
  613. scipy/special/xsf/cephes/unity.h +0 -186
  614. scipy/special/xsf/cephes/zeta.h +0 -172
  615. scipy/special/xsf/config.h +0 -304
  616. scipy/special/xsf/digamma.h +0 -205
  617. scipy/special/xsf/error.h +0 -57
  618. scipy/special/xsf/evalpoly.h +0 -47
  619. scipy/special/xsf/expint.h +0 -266
  620. scipy/special/xsf/hyp2f1.h +0 -694
  621. scipy/special/xsf/iv_ratio.h +0 -173
  622. scipy/special/xsf/lambertw.h +0 -150
  623. scipy/special/xsf/loggamma.h +0 -163
  624. scipy/special/xsf/sici.h +0 -200
  625. scipy/special/xsf/tools.h +0 -427
  626. scipy/special/xsf/trig.h +0 -164
  627. scipy/special/xsf/wright_bessel.h +0 -843
  628. scipy/special/xsf/zlog1.h +0 -35
  629. scipy/stats/_mvn.cpython-313-darwin.so +0 -0
  630. scipy-1.15.3.dist-info/WHEEL +0 -4
@@ -0,0 +1,387 @@
1
+ import numpy as np
2
+
3
+ from scipy._lib._array_api import (
4
+ array_namespace, xp_ravel, xp_copy, xp_promote
5
+ )
6
+ import scipy._lib._elementwise_iterative_method as eim
7
+ from scipy._lib._util import _RichResult
8
+ from scipy import special
9
+
10
+ # Todo:
11
+ # Avoid special-casing key 'n' in _lib._elementwise_iterative_method::_check_termination
12
+ # Rearrange termination condition to allow absolute and relative tolerances?
13
+ # Interpret/return |f_n - f_{n-1}| as an error estimate?
14
+ # Return gracefully for size=0 arrays
15
+
16
+ def _logaddexp(x, y, xp=None):
17
+ # logaddexp that supports complex numbers
18
+ xp = array_namespace(x, y) if xp is None else xp
19
+ x, y = xp.broadcast_arrays(x, y)
20
+ xy = xp.stack((x, y), axis=0)
21
+ return special.logsumexp(xy, axis=0)
22
+
23
+
24
+ def _continued_fraction_iv(a, b, args, tolerances, maxiter, log):
25
+ # Input validation for `_continued_fraction`
26
+
27
+ if not callable(a) or not callable(b):
28
+ raise ValueError('`a` and `b` must be callable.')
29
+
30
+ if not np.iterable(args):
31
+ args = (args,)
32
+
33
+ # Call each callable once to determine namespace and dtypes
34
+ a0, b0 = a(0, *args), b(0, *args)
35
+ xp = array_namespace(a0, b0, *args)
36
+ a0, b0, *args = xp_promote(a0, b0, *args, force_floating=True, broadcast=True,
37
+ xp=xp)
38
+ shape, dtype = a0.shape, a0.dtype
39
+ a0, b0, *args = (xp_ravel(arg) for arg in (a0, b0) + tuple(args))
40
+
41
+ tolerances = {} if tolerances is None else tolerances
42
+ eps = tolerances.get('eps', None)
43
+ tiny = tolerances.get('tiny', None)
44
+
45
+ # tolerances are floats, not arrays, so it's OK to use NumPy
46
+ message = ('`eps` and `tiny` must be (or represent the logarithm of) '
47
+ 'finite, positive, real scalars.')
48
+ tols = np.asarray([eps if eps is not None else 1,
49
+ tiny if tiny is not None else 1])
50
+ not_real = (not np.issubdtype(tols.dtype, np.number)
51
+ or np.issubdtype(tols.dtype, np.complexfloating))
52
+ not_positive = np.any(tols <= 0) if not log else False
53
+ not_finite = not np.all(np.isfinite(tols))
54
+ not_scalar = tols.shape != (2,)
55
+ if not_real or not_positive or not_finite or not_scalar:
56
+ raise ValueError(message)
57
+
58
+ maxiter_int = int(maxiter)
59
+ if maxiter != maxiter_int or maxiter < 0:
60
+ raise ValueError('`maxiter` must be a non-negative integer.')
61
+
62
+ if not isinstance(log, bool):
63
+ raise ValueError('`log` must be boolean.')
64
+
65
+ return a, b, args, eps, tiny, maxiter, log, a0, b0, shape, dtype, xp
66
+
67
+
68
+ def _continued_fraction(a, b, *, args=(), tolerances=None, maxiter=100, log=False):
69
+ r"""Evaluate a generalized continued fraction numerically.
70
+
71
+ `_continued_fraction` iteratively evaluates convergents of a continued fraction
72
+ given coefficients returned by callables `a` and `b`. Iteration terminates when
73
+ `maxiter` terms have been evaluated or a termination criterion controlled by
74
+ `tolerances` is satisfied, and the final convergent is returned as the ``f``
75
+ attribute of the result object.
76
+
77
+ This function works elementwise when `args` contains (broadcastable) arrays.
78
+
79
+ Parameters
80
+ ----------
81
+ a, b: callable
82
+ Functions that provide the *numerator* and *denominator* coefficients of
83
+ the continued fraction, respectively.
84
+
85
+ The signature of each must be::
86
+
87
+ a(n: int, *argsj) -> ndarray
88
+
89
+ where ``n`` is the coefficient number and ``argsj`` is a tuple, which may
90
+ contain an arbitrary number of arrays of any shape. `a` and `b` must be
91
+ elementwise functions: each scalar element ``a(n, *argsj)[i]`` must equal
92
+ ``a(n, *[argj[i] for argj in argsj])`` for valid indices ``i``.
93
+ `a` and `b` must not mutate the arrays in ``argsj``.
94
+
95
+ The result shape is the broadcasted shape of ``a(0, *args)`` and
96
+ ``b(0, *args)``. The dtype used throughout computation is the result dtype
97
+ of these terms if it is a float, and the default float of the array library
98
+ otherwise. The numerical value of ``a(0, *args)`` is ignored, and
99
+ the value of the leading term ``b(0, *args)`` is the so-called "integer"
100
+ part of the continued fraction (although it need not be integral).
101
+
102
+ args : tuple of array_like, optional
103
+ Additional positional *array* arguments to be passed to `a` and `b`. Arrays
104
+ must be broadcastable with one another. If the coefficient callables
105
+ require additional arguments that are not broadcastable with one
106
+ another, wrap them with callables `a` and `b` such that `a` and `b` accept
107
+ only ``n`` and broadcastable array arguments.
108
+ tolerances : dictionary of floats, optional
109
+ Tolerances and numerical thresholds used by the algorithm. Currently,
110
+ valid keys of the dictionary are:
111
+
112
+ - ``eps`` - the convergence threshold of Lentz' algorithm
113
+ - ``tiny`` - not strictly a "tolerance", but a very small positive number
114
+ used to avoid division by zero
115
+
116
+ The default `eps` is the precision of the appropriate dtype, and the default
117
+ `tiny` is the precision squared. [1]_ advises that ``eps`` is "as small as
118
+ you like", but for most purposes, it should not be set smaller than the default
119
+ because it may prevent convergence of the algorithm. [1]_ also advises that
120
+ ``tiny`` should be less than typical values of ``eps * b(n)``, so the default
121
+ is a good choice unless the :math:`b_n` are very small. See [1]_ for details.
122
+ maxiter : int, default: 100
123
+ The maximum number of iterations of the algorithm to perform.
124
+ log : bool, default: False
125
+ If True, `a` and `b` return the (natural) logarithm of the terms, `tolerances`
126
+ contains the logarithm of the tolerances, and the result object reports the
127
+ logarithm of the convergent.
128
+
129
+ Returns
130
+ -------
131
+ res : _RichResult
132
+ An object similar to an instance of `scipy.optimize.OptimizeResult` with the
133
+ following attributes. The descriptions are written as though the values will
134
+ be scalars; however, if `f` returns an array, the outputs will be
135
+ arrays of the same shape.
136
+
137
+ success : bool array
138
+ ``True`` where the algorithm terminated successfully (status ``0``);
139
+ ``False`` otherwise.
140
+ status : int array
141
+ An integer representing the exit status of the algorithm.
142
+
143
+ - ``0`` : The algorithm converged to the specified tolerances.
144
+ - ``-2`` : The maximum number of iterations was reached.
145
+ - ``-3`` : A non-finite value was encountered.
146
+
147
+ f : float array
148
+ The convergent which satisfied a termination criterion.
149
+ nit : int array
150
+ The number of iterations of the algorithm that were performed.
151
+ nfev : int array
152
+ The number of terms that were evaluated.
153
+
154
+ Notes
155
+ -----
156
+ A generalized continued fraction is an expression of the form
157
+
158
+ .. math::
159
+
160
+ b_0 + \frac{a_1}{b_1 + \frac{a_2}{b_2 + \frac{a_3}{b_3 + \cdots}}}
161
+
162
+ Successive "convergents" approximate the infinitely recursive continued fraction
163
+ with a finite number of terms :math:`a_n` and :math:`b_n`, which are provided
164
+ by callables `a` and `b`, respectively. This implementation follows the modified
165
+ Lentz algorithm ([1]_, [2]_) to evaluate successive convergents until a
166
+ termination condition is satisfied.
167
+
168
+ References
169
+ ----------
170
+ .. [1] Press, William H., and Saul A. Teukolsky. "Evaluating continued fractions
171
+ and computing exponential integrals." Computers in Physics 2.5 (1988): 88-89.
172
+ .. [2] Lentz's algorithm. Wikipedia.
173
+ https://en.wikipedia.org/wiki/Lentz%27s_algorithm
174
+ .. [3] Continued fraction. Wikipedia.
175
+ https://en.wikipedia.org/wiki/Continued_fraction
176
+ .. [4] Generalized continued fraction. Wikipedia.
177
+ https://en.wikipedia.org/wiki/Generalized_continued_fraction
178
+
179
+ Examples
180
+ --------
181
+ The "simple continued fraction" of :math:`\pi` is given in [3]_ as
182
+
183
+ .. math::
184
+
185
+ 3 + \frac{1}{7 + \frac{1}{15 + \frac{1}{1 + \cdots}}}
186
+
187
+ where the :math:`b_n` terms follow no obvious pattern:
188
+
189
+ >>> b = [3, 7, 15, 1, 292, 1, 1, 1, 2, 1, 3, 1]
190
+
191
+ and the :math:`a_n` terms are all :math:`1`.
192
+ In this case, all the terms have been precomputed, so we call `_continued_fraction`
193
+ with simple callables which simply return the precomputed coefficients:
194
+
195
+ >>> import numpy as np
196
+ >>> from scipy.special._continued_fraction import _continued_fraction
197
+ >>> res = _continued_fraction(a=lambda n: 1, b=lambda n: b[n], maxiter=len(b) - 1)
198
+ >>> (res.f - np.pi) / np.pi
199
+ np.float64(7.067899292141148e-15)
200
+
201
+ A generalized continued fraction for :math:`\pi` is given by:
202
+
203
+ .. math::
204
+
205
+ 3 + \frac{1^2}{6 + \frac{3^2}{6 + \frac{5^2}{6 + \cdots}}}
206
+
207
+ We define the coefficient callables as:
208
+
209
+ >>> def a(n):
210
+ ... return (2*n - 1)**2
211
+ >>>
212
+ >>> def b(n):
213
+ ... if n == 0:
214
+ ... return 3
215
+ ... else:
216
+ ... return 6
217
+
218
+ Then the continued fraction can be evaluated as:
219
+
220
+ >>> res = _continued_fraction(a, b)
221
+ >>> res
222
+ success: False
223
+ status: -2
224
+ f: 3.1415924109719846
225
+ nit: 100
226
+ nfev: 101
227
+
228
+ Note that the requested tolerance was not reached within the (default)
229
+ maximum number of iterations because it converges very slowly.
230
+ An expression that converges more rapidly is expressed as the difference
231
+ between two continued fractions. We will compute both of them in one
232
+ vectorized call to `_continued_fraction`.
233
+
234
+ >>> u, v = 5, 239
235
+ >>>
236
+ >>> def a(n, a1, _):
237
+ ... # The shape of the output must be the shape of the arguments
238
+ ... shape = a1.shape
239
+ ... if n == 0:
240
+ ... return np.zeros(shape)
241
+ ... elif n == 1:
242
+ ... return a1
243
+ ... else:
244
+ ... return np.full(shape, (n-1)**2)
245
+ >>>
246
+ >>> def b(n, _, uv):
247
+ ... shape = uv.shape
248
+ ... if n == 0:
249
+ ... return np.zeros(shape)
250
+ ... return np.full(shape, (2*n - 1)*uv)
251
+ >>>
252
+ >>> res = _continued_fraction(a, b, args=([16, 4], [u, v]))
253
+ >>> res
254
+ success: [ True True]
255
+ status: [0 0]
256
+ f: [ 3.158e+00 1.674e-02]
257
+ nit: [10 4]
258
+ nfev: [11 5]
259
+
260
+ Note that the second term converged in fewer than half the number of iterations
261
+ as the first. The approximation of :math:`\pi` is the difference between the two:
262
+
263
+ >>> pi = res.f[0] - res.f[1]
264
+ >>> (pi - np.pi) / np.pi
265
+ np.float64(2.8271597168564594e-16)
266
+
267
+ If it is more efficient to compute the :math:`a_n` and :math:`b_n` terms together,
268
+ consider instantiating a class with a method that computes both terms and stores
269
+ the results in an attribute. Separate methods of the class retrieve the
270
+ coefficients, and these methods are passed to `_continued_fraction` as arguments
271
+ `a` and `b`. Similarly,if the coefficients can be computed recursively in terms of
272
+ previous coefficients, use a class to maintain state between callable evaluations.
273
+
274
+ """
275
+
276
+ res = _continued_fraction_iv(a, b, args, tolerances, maxiter, log)
277
+ a, b, args, eps, tiny, maxiter, log, a0, b0, shape, dtype, xp = res
278
+ callback = None # don't want to test it, but easy to add later
279
+
280
+ # The EIM framework was designed for the case in where there would
281
+ # be only one callable, and all arguments of the callable would be
282
+ # arrays. We're going a bit beyond that here, since we have two callables,
283
+ # and the first argument is an integer (the number of the term). Rather
284
+ # than complicate the framework, we wrap the user-provided callables to
285
+ # make this problem fit within the existing framework.
286
+
287
+ def a(n, *args, a=a):
288
+ n = int(xp.real(xp_ravel(n))[0])
289
+ return a(n, *args)
290
+
291
+ def b(n, *args, b=b):
292
+ n = int(xp.real(xp_ravel(n))[0])
293
+ return b(n, *args)
294
+
295
+ def func(n, *args):
296
+ return xp.stack((a(n, *args), b(n, *args)), axis=-1)
297
+
298
+ status = xp.full_like(a0, eim._EINPROGRESS, dtype=xp.int32) # in progress
299
+ nit, nfev = 0, 1 # one function evaluation (per function) performed above
300
+ maxiter = 100 if maxiter is None else maxiter
301
+
302
+ # Quotations describing the algorithm are from [1]_
303
+ # "... as small as you like, say eps"
304
+ if eps is None:
305
+ eps = xp.finfo(dtype).eps if not log else np.log(xp.finfo(dtype).eps)
306
+
307
+ # "The parameter tiny should be less than typical values of eps |b_n|"
308
+ if tiny is None:
309
+ tiny = xp.finfo(dtype).eps**2 if not log else 2*np.log(xp.finfo(dtype).eps)
310
+
311
+ # "Set f0 and C0 to the value b0 or to tiny if b0=0. Set D0 = 0.
312
+ zero = -xp.inf if log else 0
313
+ fn = xp.where(b0 == zero, tiny, b0)
314
+ Cnm1 = xp_copy(fn)
315
+ Dnm1 = xp.full_like(fn, zero)
316
+
317
+ CnDn = xp.full_like(fn, xp.inf)
318
+
319
+ work = _RichResult(n=0, fn=fn, Cnm1=Cnm1, Dnm1=Dnm1, CnDn=CnDn,
320
+ eps=eps, tiny=tiny,
321
+ nit=nit, nfev=nfev, status=status)
322
+ res_work_pairs = [('status', 'status'), ('f', 'fn'),
323
+ ('nit', 'nit'), ('nfev', 'nfev')]
324
+
325
+ def pre_func_eval(work):
326
+ work.n = xp.reshape(xp.asarray(work.n + 1), (-1,))
327
+ return work.n
328
+
329
+ def post_func_eval(n, ab, work):
330
+ an, bn = ab[..., 0], ab[..., 1]
331
+
332
+ zero = 0 if not log else -xp.inf
333
+
334
+ # "Set D_n = 1/(b_n + a_n D_{n-1}) or 1/tiny, if the denominator vanishes"
335
+ denominator = (bn + an*work.Dnm1 if not log
336
+ else _logaddexp(bn, an + work.Dnm1, xp=xp))
337
+ denominator[denominator == zero] = tiny
338
+ Dn = (1/denominator if not log
339
+ else -denominator)
340
+
341
+ # "Set C_n = b_n + a_n / C_{n-1} (or =tiny, if the expression vanishes)"
342
+ Cn = (bn + an / work.Cnm1 if not log
343
+ else _logaddexp(bn, an - work.Cnm1, xp=xp))
344
+ Cn[Cn == zero] = tiny
345
+
346
+ # "and set f_n = f_{n-1} C_n D_n"
347
+ work.CnDn = (Cn * Dn if not log
348
+ else Cn + Dn)
349
+ work.fn = (work.fn * work.CnDn if not log
350
+ else work.fn + work.CnDn)
351
+
352
+
353
+ work.Cnm1, work.Dnm1 = Cn, Dn
354
+
355
+ def check_termination(work):
356
+ # Check for all terminal conditions and record statuses.
357
+ stop = xp.zeros_like(work.CnDn, dtype=xp.bool)
358
+
359
+ # "You quit when |D_n C_n - 1| is as small as you like, say eps"
360
+ pij = xp.full_like(work.CnDn, xp.pi*1j) if log else None
361
+ residual = (xp.abs(work.CnDn - 1) if not log
362
+ else xp.real(_logaddexp(work.CnDn, pij, xp=xp)))
363
+ i = residual < work.eps
364
+ work.status[i] = eim._ECONVERGED
365
+ stop[i] = True
366
+
367
+ # If function value is NaN, report failure.
368
+ i = (~xp.isfinite(work.fn) if not log
369
+ else ~(xp.isfinite(work.fn) | (work.fn == -xp.inf)))
370
+ work.status[i] = eim._EVALUEERR
371
+ stop[i] = True
372
+
373
+ return stop
374
+
375
+ def post_termination_check(work):
376
+ pass
377
+
378
+ def customize_result(res, shape):
379
+ # Only needed pre-NEP 50
380
+ res['f'] = xp.asarray(res['f'], dtype=dtype)
381
+ res['f'] = res['f'][()] if res['f'].ndim == 0 else res['f']
382
+ return shape
383
+
384
+ return eim._loop(work, callback, shape, maxiter, func, args, dtype,
385
+ pre_func_eval, post_func_eval, check_termination,
386
+ post_termination_check, customize_result, res_work_pairs,
387
+ xp=xp)