scipy 1.15.3__cp311-cp311-musllinux_1_2_aarch64.whl → 1.16.0__cp311-cp311-musllinux_1_2_aarch64.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 (642) hide show
  1. scipy/__config__.py +11 -11
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cpython-311-aarch64-linux-musl.so +0 -0
  4. scipy/_lib/_array_api.py +486 -161
  5. scipy/_lib/_array_api_compat_vendor.py +9 -0
  6. scipy/_lib/_bunch.py +4 -0
  7. scipy/_lib/_ccallback_c.cpython-311-aarch64-linux-musl.so +0 -0
  8. scipy/_lib/_docscrape.py +1 -1
  9. scipy/_lib/_elementwise_iterative_method.py +15 -26
  10. scipy/_lib/_fpumode.cpython-311-aarch64-linux-musl.so +0 -0
  11. scipy/_lib/_sparse.py +41 -0
  12. scipy/_lib/_test_ccallback.cpython-311-aarch64-linux-musl.so +0 -0
  13. scipy/_lib/_test_deprecation_call.cpython-311-aarch64-linux-musl.so +0 -0
  14. scipy/_lib/_test_deprecation_def.cpython-311-aarch64-linux-musl.so +0 -0
  15. scipy/_lib/_testutils.py +6 -2
  16. scipy/_lib/_uarray/_uarray.cpython-311-aarch64-linux-musl.so +0 -0
  17. scipy/_lib/_util.py +222 -125
  18. scipy/_lib/array_api_compat/__init__.py +4 -4
  19. scipy/_lib/array_api_compat/_internal.py +19 -6
  20. scipy/_lib/array_api_compat/common/__init__.py +1 -1
  21. scipy/_lib/array_api_compat/common/_aliases.py +365 -193
  22. scipy/_lib/array_api_compat/common/_fft.py +94 -64
  23. scipy/_lib/array_api_compat/common/_helpers.py +413 -180
  24. scipy/_lib/array_api_compat/common/_linalg.py +116 -40
  25. scipy/_lib/array_api_compat/common/_typing.py +179 -10
  26. scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
  27. scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
  28. scipy/_lib/array_api_compat/cupy/_info.py +16 -6
  29. scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
  30. scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
  31. scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
  32. scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
  33. scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
  34. scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
  35. scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
  36. scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
  37. scipy/_lib/array_api_compat/numpy/_info.py +36 -16
  38. scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
  39. scipy/_lib/array_api_compat/numpy/fft.py +11 -5
  40. scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
  41. scipy/_lib/array_api_compat/torch/__init__.py +3 -5
  42. scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
  43. scipy/_lib/array_api_compat/torch/_info.py +27 -16
  44. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  45. scipy/_lib/array_api_compat/torch/fft.py +17 -18
  46. scipy/_lib/array_api_compat/torch/linalg.py +16 -16
  47. scipy/_lib/array_api_extra/__init__.py +26 -3
  48. scipy/_lib/array_api_extra/_delegation.py +171 -0
  49. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  50. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  51. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  52. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  53. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  54. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  55. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  56. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  57. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  58. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  59. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  60. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  61. scipy/_lib/array_api_extra/testing.py +359 -0
  62. scipy/_lib/decorator.py +2 -2
  63. scipy/_lib/doccer.py +1 -7
  64. scipy/_lib/messagestream.cpython-311-aarch64-linux-musl.so +0 -0
  65. scipy/_lib/pyprima/__init__.py +212 -0
  66. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  67. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  68. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  69. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  70. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  71. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  72. scipy/_lib/pyprima/cobyla/update.py +289 -0
  73. scipy/_lib/pyprima/common/__init__.py +0 -0
  74. scipy/_lib/pyprima/common/_bounds.py +34 -0
  75. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  76. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  77. scipy/_lib/pyprima/common/_project.py +173 -0
  78. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  79. scipy/_lib/pyprima/common/consts.py +47 -0
  80. scipy/_lib/pyprima/common/evaluate.py +99 -0
  81. scipy/_lib/pyprima/common/history.py +38 -0
  82. scipy/_lib/pyprima/common/infos.py +30 -0
  83. scipy/_lib/pyprima/common/linalg.py +435 -0
  84. scipy/_lib/pyprima/common/message.py +290 -0
  85. scipy/_lib/pyprima/common/powalg.py +131 -0
  86. scipy/_lib/pyprima/common/preproc.py +277 -0
  87. scipy/_lib/pyprima/common/present.py +5 -0
  88. scipy/_lib/pyprima/common/ratio.py +54 -0
  89. scipy/_lib/pyprima/common/redrho.py +47 -0
  90. scipy/_lib/pyprima/common/selectx.py +296 -0
  91. scipy/_lib/tests/test__util.py +105 -121
  92. scipy/_lib/tests/test_array_api.py +166 -35
  93. scipy/_lib/tests/test_bunch.py +7 -0
  94. scipy/_lib/tests/test_ccallback.py +2 -10
  95. scipy/_lib/tests/test_public_api.py +13 -0
  96. scipy/cluster/_hierarchy.cpython-311-aarch64-linux-musl.so +0 -0
  97. scipy/cluster/_optimal_leaf_ordering.cpython-311-aarch64-linux-musl.so +0 -0
  98. scipy/cluster/_vq.cpython-311-aarch64-linux-musl.so +0 -0
  99. scipy/cluster/hierarchy.py +393 -223
  100. scipy/cluster/tests/test_hierarchy.py +273 -335
  101. scipy/cluster/tests/test_vq.py +45 -61
  102. scipy/cluster/vq.py +39 -35
  103. scipy/conftest.py +282 -151
  104. scipy/constants/_constants.py +4 -1
  105. scipy/constants/tests/test_codata.py +2 -2
  106. scipy/constants/tests/test_constants.py +11 -18
  107. scipy/datasets/_download_all.py +15 -1
  108. scipy/datasets/_fetchers.py +7 -1
  109. scipy/datasets/_utils.py +1 -1
  110. scipy/differentiate/_differentiate.py +25 -25
  111. scipy/differentiate/tests/test_differentiate.py +24 -25
  112. scipy/fft/_basic.py +20 -0
  113. scipy/fft/_helper.py +3 -34
  114. scipy/fft/_pocketfft/helper.py +29 -1
  115. scipy/fft/_pocketfft/pypocketfft.cpython-311-aarch64-linux-musl.so +0 -0
  116. scipy/fft/_pocketfft/tests/test_basic.py +2 -4
  117. scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
  118. scipy/fft/_realtransforms.py +13 -0
  119. scipy/fft/tests/test_basic.py +27 -25
  120. scipy/fft/tests/test_fftlog.py +16 -7
  121. scipy/fft/tests/test_helper.py +18 -34
  122. scipy/fft/tests/test_real_transforms.py +8 -10
  123. scipy/fftpack/convolve.cpython-311-aarch64-linux-musl.so +0 -0
  124. scipy/fftpack/tests/test_basic.py +2 -4
  125. scipy/fftpack/tests/test_real_transforms.py +8 -9
  126. scipy/integrate/_bvp.py +9 -3
  127. scipy/integrate/_cubature.py +3 -2
  128. scipy/integrate/_dop.cpython-311-aarch64-linux-musl.so +0 -0
  129. scipy/integrate/_lsoda.cpython-311-aarch64-linux-musl.so +0 -0
  130. scipy/integrate/_ode.py +9 -2
  131. scipy/integrate/_odepack.cpython-311-aarch64-linux-musl.so +0 -0
  132. scipy/integrate/_quad_vec.py +21 -29
  133. scipy/integrate/_quadpack.cpython-311-aarch64-linux-musl.so +0 -0
  134. scipy/integrate/_quadpack_py.py +11 -7
  135. scipy/integrate/_quadrature.py +3 -3
  136. scipy/integrate/_rules/_base.py +2 -2
  137. scipy/integrate/_tanhsinh.py +48 -47
  138. scipy/integrate/_test_multivariate.cpython-311-aarch64-linux-musl.so +0 -0
  139. scipy/integrate/_test_odeint_banded.cpython-311-aarch64-linux-musl.so +0 -0
  140. scipy/integrate/_vode.cpython-311-aarch64-linux-musl.so +0 -0
  141. scipy/integrate/tests/test__quad_vec.py +0 -6
  142. scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
  143. scipy/integrate/tests/test_cubature.py +21 -35
  144. scipy/integrate/tests/test_quadrature.py +6 -8
  145. scipy/integrate/tests/test_tanhsinh.py +56 -48
  146. scipy/interpolate/__init__.py +70 -58
  147. scipy/interpolate/_bary_rational.py +22 -22
  148. scipy/interpolate/_bsplines.py +119 -66
  149. scipy/interpolate/_cubic.py +65 -50
  150. scipy/interpolate/_dfitpack.cpython-311-aarch64-linux-musl.so +0 -0
  151. scipy/interpolate/_dierckx.cpython-311-aarch64-linux-musl.so +0 -0
  152. scipy/interpolate/_fitpack.cpython-311-aarch64-linux-musl.so +0 -0
  153. scipy/interpolate/_fitpack2.py +9 -6
  154. scipy/interpolate/_fitpack_impl.py +32 -26
  155. scipy/interpolate/_fitpack_repro.py +23 -19
  156. scipy/interpolate/_interpnd.cpython-311-aarch64-linux-musl.so +0 -0
  157. scipy/interpolate/_interpolate.py +30 -12
  158. scipy/interpolate/_ndbspline.py +13 -18
  159. scipy/interpolate/_ndgriddata.py +5 -8
  160. scipy/interpolate/_polyint.py +95 -31
  161. scipy/interpolate/_ppoly.cpython-311-aarch64-linux-musl.so +0 -0
  162. scipy/interpolate/_rbf.py +2 -2
  163. scipy/interpolate/_rbfinterp.py +1 -1
  164. scipy/interpolate/_rbfinterp_pythran.cpython-311-aarch64-linux-musl.so +0 -0
  165. scipy/interpolate/_rgi.py +31 -26
  166. scipy/interpolate/_rgi_cython.cpython-311-aarch64-linux-musl.so +0 -0
  167. scipy/interpolate/dfitpack.py +0 -20
  168. scipy/interpolate/interpnd.py +1 -2
  169. scipy/interpolate/tests/test_bary_rational.py +2 -2
  170. scipy/interpolate/tests/test_bsplines.py +97 -1
  171. scipy/interpolate/tests/test_fitpack2.py +39 -1
  172. scipy/interpolate/tests/test_interpnd.py +32 -20
  173. scipy/interpolate/tests/test_interpolate.py +48 -4
  174. scipy/interpolate/tests/test_rgi.py +2 -1
  175. scipy/io/_fast_matrix_market/__init__.py +2 -0
  176. scipy/io/_fast_matrix_market/_fmm_core.cpython-311-aarch64-linux-musl.so +0 -0
  177. scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
  178. scipy/io/_harwell_boeing/hb.py +7 -11
  179. scipy/io/_idl.py +5 -7
  180. scipy/io/_netcdf.py +15 -5
  181. scipy/io/_test_fortran.cpython-311-aarch64-linux-musl.so +0 -0
  182. scipy/io/arff/tests/test_arffread.py +3 -3
  183. scipy/io/matlab/__init__.py +5 -3
  184. scipy/io/matlab/_mio.py +4 -1
  185. scipy/io/matlab/_mio5.py +19 -13
  186. scipy/io/matlab/_mio5_utils.cpython-311-aarch64-linux-musl.so +0 -0
  187. scipy/io/matlab/_mio_utils.cpython-311-aarch64-linux-musl.so +0 -0
  188. scipy/io/matlab/_miobase.py +4 -1
  189. scipy/io/matlab/_streams.cpython-311-aarch64-linux-musl.so +0 -0
  190. scipy/io/matlab/tests/test_mio.py +46 -18
  191. scipy/io/matlab/tests/test_mio_funcs.py +1 -1
  192. scipy/io/tests/test_mmio.py +7 -1
  193. scipy/io/tests/test_wavfile.py +41 -0
  194. scipy/io/wavfile.py +57 -10
  195. scipy/linalg/_basic.py +113 -86
  196. scipy/linalg/_cythonized_array_utils.cpython-311-aarch64-linux-musl.so +0 -0
  197. scipy/linalg/_decomp.py +22 -9
  198. scipy/linalg/_decomp_cholesky.py +28 -13
  199. scipy/linalg/_decomp_cossin.py +45 -30
  200. scipy/linalg/_decomp_interpolative.cpython-311-aarch64-linux-musl.so +0 -0
  201. scipy/linalg/_decomp_ldl.py +4 -1
  202. scipy/linalg/_decomp_lu.py +18 -6
  203. scipy/linalg/_decomp_lu_cython.cpython-311-aarch64-linux-musl.so +0 -0
  204. scipy/linalg/_decomp_polar.py +2 -0
  205. scipy/linalg/_decomp_qr.py +6 -2
  206. scipy/linalg/_decomp_qz.py +3 -0
  207. scipy/linalg/_decomp_schur.py +3 -1
  208. scipy/linalg/_decomp_svd.py +13 -2
  209. scipy/linalg/_decomp_update.cpython-311-aarch64-linux-musl.so +0 -0
  210. scipy/linalg/_expm_frechet.py +4 -0
  211. scipy/linalg/_fblas.cpython-311-aarch64-linux-musl.so +0 -0
  212. scipy/linalg/_flapack.cpython-311-aarch64-linux-musl.so +0 -0
  213. scipy/linalg/_linalg_pythran.cpython-311-aarch64-linux-musl.so +0 -0
  214. scipy/linalg/_matfuncs.py +187 -4
  215. scipy/linalg/_matfuncs_expm.cpython-311-aarch64-linux-musl.so +0 -0
  216. scipy/linalg/_matfuncs_schur_sqrtm.cpython-311-aarch64-linux-musl.so +0 -0
  217. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  218. scipy/linalg/_matfuncs_sqrtm_triu.cpython-311-aarch64-linux-musl.so +0 -0
  219. scipy/linalg/_procrustes.py +2 -0
  220. scipy/linalg/_sketches.py +17 -6
  221. scipy/linalg/_solve_toeplitz.cpython-311-aarch64-linux-musl.so +0 -0
  222. scipy/linalg/_solvers.py +7 -2
  223. scipy/linalg/_special_matrices.py +26 -36
  224. scipy/linalg/blas.py +35 -24
  225. scipy/linalg/cython_blas.cpython-311-aarch64-linux-musl.so +0 -0
  226. scipy/linalg/cython_lapack.cpython-311-aarch64-linux-musl.so +0 -0
  227. scipy/linalg/lapack.py +22 -2
  228. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  229. scipy/linalg/tests/test_basic.py +31 -16
  230. scipy/linalg/tests/test_batch.py +588 -0
  231. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  232. scipy/linalg/tests/test_decomp.py +40 -3
  233. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  234. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  235. scipy/linalg/tests/test_lapack.py +115 -7
  236. scipy/linalg/tests/test_matfuncs.py +157 -102
  237. scipy/linalg/tests/test_procrustes.py +0 -7
  238. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  239. scipy/linalg/tests/test_special_matrices.py +1 -5
  240. scipy/ndimage/__init__.py +1 -0
  241. scipy/ndimage/_ctest.cpython-311-aarch64-linux-musl.so +0 -0
  242. scipy/ndimage/_cytest.cpython-311-aarch64-linux-musl.so +0 -0
  243. scipy/ndimage/_delegators.py +8 -2
  244. scipy/ndimage/_filters.py +453 -5
  245. scipy/ndimage/_interpolation.py +36 -6
  246. scipy/ndimage/_measurements.py +4 -2
  247. scipy/ndimage/_morphology.py +5 -0
  248. scipy/ndimage/_nd_image.cpython-311-aarch64-linux-musl.so +0 -0
  249. scipy/ndimage/_ni_docstrings.py +5 -1
  250. scipy/ndimage/_ni_label.cpython-311-aarch64-linux-musl.so +0 -0
  251. scipy/ndimage/_ni_support.py +1 -5
  252. scipy/ndimage/_rank_filter_1d.cpython-311-aarch64-linux-musl.so +0 -0
  253. scipy/ndimage/_support_alternative_backends.py +18 -6
  254. scipy/ndimage/tests/test_filters.py +370 -259
  255. scipy/ndimage/tests/test_fourier.py +7 -9
  256. scipy/ndimage/tests/test_interpolation.py +68 -61
  257. scipy/ndimage/tests/test_measurements.py +18 -35
  258. scipy/ndimage/tests/test_morphology.py +143 -131
  259. scipy/ndimage/tests/test_splines.py +1 -3
  260. scipy/odr/__odrpack.cpython-311-aarch64-linux-musl.so +0 -0
  261. scipy/optimize/_basinhopping.py +13 -7
  262. scipy/optimize/_bglu_dense.cpython-311-aarch64-linux-musl.so +0 -0
  263. scipy/optimize/_bracket.py +17 -24
  264. scipy/optimize/_chandrupatla.py +9 -10
  265. scipy/optimize/_cobyla_py.py +104 -123
  266. scipy/optimize/_constraints.py +14 -10
  267. scipy/optimize/_differentiable_functions.py +371 -230
  268. scipy/optimize/_differentialevolution.py +4 -3
  269. scipy/optimize/_direct.cpython-311-aarch64-linux-musl.so +0 -0
  270. scipy/optimize/_dual_annealing.py +1 -1
  271. scipy/optimize/_elementwise.py +1 -4
  272. scipy/optimize/_group_columns.cpython-311-aarch64-linux-musl.so +0 -0
  273. scipy/optimize/_highspy/_core.cpython-311-aarch64-linux-musl.so +0 -0
  274. scipy/optimize/_highspy/_highs_options.cpython-311-aarch64-linux-musl.so +0 -0
  275. scipy/optimize/_lbfgsb.cpython-311-aarch64-linux-musl.so +0 -0
  276. scipy/optimize/_lbfgsb_py.py +80 -24
  277. scipy/optimize/_linprog_doc.py +2 -2
  278. scipy/optimize/_linprog_highs.py +2 -2
  279. scipy/optimize/_linprog_ip.py +25 -10
  280. scipy/optimize/_linprog_util.py +14 -16
  281. scipy/optimize/_lsap.cpython-311-aarch64-linux-musl.so +0 -0
  282. scipy/optimize/_lsq/common.py +3 -3
  283. scipy/optimize/_lsq/dogbox.py +16 -2
  284. scipy/optimize/_lsq/givens_elimination.cpython-311-aarch64-linux-musl.so +0 -0
  285. scipy/optimize/_lsq/least_squares.py +198 -126
  286. scipy/optimize/_lsq/lsq_linear.py +6 -6
  287. scipy/optimize/_lsq/trf.py +35 -8
  288. scipy/optimize/_milp.py +3 -1
  289. scipy/optimize/_minimize.py +105 -36
  290. scipy/optimize/_minpack.cpython-311-aarch64-linux-musl.so +0 -0
  291. scipy/optimize/_minpack_py.py +21 -14
  292. scipy/optimize/_moduleTNC.cpython-311-aarch64-linux-musl.so +0 -0
  293. scipy/optimize/_nnls.py +20 -21
  294. scipy/optimize/_nonlin.py +34 -3
  295. scipy/optimize/_numdiff.py +288 -110
  296. scipy/optimize/_optimize.py +86 -48
  297. scipy/optimize/_pava_pybind.cpython-311-aarch64-linux-musl.so +0 -0
  298. scipy/optimize/_remove_redundancy.py +5 -5
  299. scipy/optimize/_root_scalar.py +1 -1
  300. scipy/optimize/_shgo.py +6 -0
  301. scipy/optimize/_shgo_lib/_complex.py +1 -1
  302. scipy/optimize/_slsqp_py.py +216 -124
  303. scipy/optimize/_slsqplib.cpython-311-aarch64-linux-musl.so +0 -0
  304. scipy/optimize/_spectral.py +1 -1
  305. scipy/optimize/_tnc.py +8 -1
  306. scipy/optimize/_trlib/_trlib.cpython-311-aarch64-linux-musl.so +0 -0
  307. scipy/optimize/_trustregion.py +20 -6
  308. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  309. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  310. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  311. scipy/optimize/_trustregion_constr/projections.py +12 -8
  312. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  313. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  314. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  315. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  316. scipy/optimize/_trustregion_exact.py +0 -1
  317. scipy/optimize/_zeros.cpython-311-aarch64-linux-musl.so +0 -0
  318. scipy/optimize/_zeros_py.py +97 -17
  319. scipy/optimize/cython_optimize/_zeros.cpython-311-aarch64-linux-musl.so +0 -0
  320. scipy/optimize/slsqp.py +0 -1
  321. scipy/optimize/tests/test__basinhopping.py +1 -1
  322. scipy/optimize/tests/test__differential_evolution.py +4 -4
  323. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  324. scipy/optimize/tests/test__numdiff.py +66 -22
  325. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  326. scipy/optimize/tests/test__shgo.py +9 -1
  327. scipy/optimize/tests/test_bracket.py +36 -46
  328. scipy/optimize/tests/test_chandrupatla.py +133 -135
  329. scipy/optimize/tests/test_cobyla.py +74 -45
  330. scipy/optimize/tests/test_constraints.py +1 -1
  331. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  332. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  333. scipy/optimize/tests/test_least_squares.py +125 -13
  334. scipy/optimize/tests/test_linear_assignment.py +3 -3
  335. scipy/optimize/tests/test_linprog.py +3 -3
  336. scipy/optimize/tests/test_lsq_linear.py +6 -6
  337. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  338. scipy/optimize/tests/test_minpack.py +4 -4
  339. scipy/optimize/tests/test_nnls.py +43 -3
  340. scipy/optimize/tests/test_nonlin.py +36 -0
  341. scipy/optimize/tests/test_optimize.py +98 -20
  342. scipy/optimize/tests/test_slsqp.py +36 -4
  343. scipy/optimize/tests/test_zeros.py +34 -1
  344. scipy/signal/__init__.py +12 -23
  345. scipy/signal/_delegators.py +568 -0
  346. scipy/signal/_filter_design.py +459 -241
  347. scipy/signal/_fir_filter_design.py +262 -90
  348. scipy/signal/_lti_conversion.py +3 -2
  349. scipy/signal/_ltisys.py +118 -91
  350. scipy/signal/_max_len_seq_inner.cpython-311-aarch64-linux-musl.so +0 -0
  351. scipy/signal/_peak_finding_utils.cpython-311-aarch64-linux-musl.so +0 -0
  352. scipy/signal/_polyutils.py +172 -0
  353. scipy/signal/_short_time_fft.py +519 -70
  354. scipy/signal/_signal_api.py +30 -0
  355. scipy/signal/_signaltools.py +719 -399
  356. scipy/signal/_sigtools.cpython-311-aarch64-linux-musl.so +0 -0
  357. scipy/signal/_sosfilt.cpython-311-aarch64-linux-musl.so +0 -0
  358. scipy/signal/_spectral_py.py +230 -50
  359. scipy/signal/_spline.cpython-311-aarch64-linux-musl.so +0 -0
  360. scipy/signal/_spline_filters.py +108 -68
  361. scipy/signal/_support_alternative_backends.py +73 -0
  362. scipy/signal/_upfirdn.py +4 -1
  363. scipy/signal/_upfirdn_apply.cpython-311-aarch64-linux-musl.so +0 -0
  364. scipy/signal/_waveforms.py +2 -11
  365. scipy/signal/_wavelets.py +1 -1
  366. scipy/signal/fir_filter_design.py +1 -0
  367. scipy/signal/spline.py +4 -11
  368. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  369. scipy/signal/tests/test_bsplines.py +114 -79
  370. scipy/signal/tests/test_cont2discrete.py +9 -2
  371. scipy/signal/tests/test_filter_design.py +721 -481
  372. scipy/signal/tests/test_fir_filter_design.py +332 -140
  373. scipy/signal/tests/test_savitzky_golay.py +4 -3
  374. scipy/signal/tests/test_short_time_fft.py +221 -3
  375. scipy/signal/tests/test_signaltools.py +2145 -1349
  376. scipy/signal/tests/test_spectral.py +50 -6
  377. scipy/signal/tests/test_splines.py +161 -96
  378. scipy/signal/tests/test_upfirdn.py +84 -50
  379. scipy/signal/tests/test_waveforms.py +20 -0
  380. scipy/signal/tests/test_windows.py +607 -466
  381. scipy/signal/windows/_windows.py +287 -148
  382. scipy/sparse/__init__.py +23 -4
  383. scipy/sparse/_base.py +270 -108
  384. scipy/sparse/_bsr.py +7 -4
  385. scipy/sparse/_compressed.py +59 -231
  386. scipy/sparse/_construct.py +90 -38
  387. scipy/sparse/_coo.py +115 -181
  388. scipy/sparse/_csc.py +4 -4
  389. scipy/sparse/_csparsetools.cpython-311-aarch64-linux-musl.so +0 -0
  390. scipy/sparse/_csr.py +2 -2
  391. scipy/sparse/_data.py +48 -48
  392. scipy/sparse/_dia.py +105 -18
  393. scipy/sparse/_dok.py +0 -23
  394. scipy/sparse/_index.py +4 -4
  395. scipy/sparse/_matrix.py +23 -0
  396. scipy/sparse/_sparsetools.cpython-311-aarch64-linux-musl.so +0 -0
  397. scipy/sparse/_sputils.py +37 -22
  398. scipy/sparse/base.py +0 -9
  399. scipy/sparse/bsr.py +0 -14
  400. scipy/sparse/compressed.py +0 -23
  401. scipy/sparse/construct.py +0 -6
  402. scipy/sparse/coo.py +0 -14
  403. scipy/sparse/csc.py +0 -3
  404. scipy/sparse/csgraph/_flow.cpython-311-aarch64-linux-musl.so +0 -0
  405. scipy/sparse/csgraph/_matching.cpython-311-aarch64-linux-musl.so +0 -0
  406. scipy/sparse/csgraph/_min_spanning_tree.cpython-311-aarch64-linux-musl.so +0 -0
  407. scipy/sparse/csgraph/_reordering.cpython-311-aarch64-linux-musl.so +0 -0
  408. scipy/sparse/csgraph/_shortest_path.cpython-311-aarch64-linux-musl.so +0 -0
  409. scipy/sparse/csgraph/_tools.cpython-311-aarch64-linux-musl.so +0 -0
  410. scipy/sparse/csgraph/_traversal.cpython-311-aarch64-linux-musl.so +0 -0
  411. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  412. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  413. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  414. scipy/sparse/csr.py +0 -5
  415. scipy/sparse/data.py +1 -6
  416. scipy/sparse/dia.py +0 -7
  417. scipy/sparse/dok.py +0 -10
  418. scipy/sparse/linalg/_dsolve/_superlu.cpython-311-aarch64-linux-musl.so +0 -0
  419. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  420. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  421. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-311-aarch64-linux-musl.so +0 -0
  422. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  423. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  424. scipy/sparse/linalg/_interface.py +17 -18
  425. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  426. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  427. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  428. scipy/sparse/linalg/_isolve/minres.py +5 -5
  429. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  430. scipy/sparse/linalg/_isolve/utils.py +2 -8
  431. scipy/sparse/linalg/_matfuncs.py +1 -1
  432. scipy/sparse/linalg/_norm.py +1 -1
  433. scipy/sparse/linalg/_propack/_cpropack.cpython-311-aarch64-linux-musl.so +0 -0
  434. scipy/sparse/linalg/_propack/_dpropack.cpython-311-aarch64-linux-musl.so +0 -0
  435. scipy/sparse/linalg/_propack/_spropack.cpython-311-aarch64-linux-musl.so +0 -0
  436. scipy/sparse/linalg/_propack/_zpropack.cpython-311-aarch64-linux-musl.so +0 -0
  437. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  438. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  439. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  440. scipy/sparse/tests/test_base.py +214 -42
  441. scipy/sparse/tests/test_common1d.py +7 -7
  442. scipy/sparse/tests/test_construct.py +1 -1
  443. scipy/sparse/tests/test_coo.py +272 -4
  444. scipy/sparse/tests/test_sparsetools.py +5 -0
  445. scipy/sparse/tests/test_sputils.py +36 -7
  446. scipy/spatial/_ckdtree.cpython-311-aarch64-linux-musl.so +0 -0
  447. scipy/spatial/_distance_pybind.cpython-311-aarch64-linux-musl.so +0 -0
  448. scipy/spatial/_distance_wrap.cpython-311-aarch64-linux-musl.so +0 -0
  449. scipy/spatial/_hausdorff.cpython-311-aarch64-linux-musl.so +0 -0
  450. scipy/spatial/_qhull.cpython-311-aarch64-linux-musl.so +0 -0
  451. scipy/spatial/_voronoi.cpython-311-aarch64-linux-musl.so +0 -0
  452. scipy/spatial/distance.py +49 -42
  453. scipy/spatial/tests/test_distance.py +15 -1
  454. scipy/spatial/tests/test_kdtree.py +1 -0
  455. scipy/spatial/tests/test_qhull.py +7 -2
  456. scipy/spatial/transform/__init__.py +5 -3
  457. scipy/spatial/transform/_rigid_transform.cpython-311-aarch64-linux-musl.so +0 -0
  458. scipy/spatial/transform/_rotation.cpython-311-aarch64-linux-musl.so +0 -0
  459. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  460. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  461. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  462. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  463. scipy/special/__init__.py +1 -47
  464. scipy/special/_add_newdocs.py +34 -772
  465. scipy/special/_basic.py +22 -25
  466. scipy/special/_comb.cpython-311-aarch64-linux-musl.so +0 -0
  467. scipy/special/_ellip_harm_2.cpython-311-aarch64-linux-musl.so +0 -0
  468. scipy/special/_gufuncs.cpython-311-aarch64-linux-musl.so +0 -0
  469. scipy/special/_logsumexp.py +67 -58
  470. scipy/special/_orthogonal.pyi +1 -1
  471. scipy/special/_specfun.cpython-311-aarch64-linux-musl.so +0 -0
  472. scipy/special/_special_ufuncs.cpython-311-aarch64-linux-musl.so +0 -0
  473. scipy/special/_spherical_bessel.py +4 -4
  474. scipy/special/_support_alternative_backends.py +212 -119
  475. scipy/special/_test_internal.cpython-311-aarch64-linux-musl.so +0 -0
  476. scipy/special/_testutils.py +4 -4
  477. scipy/special/_ufuncs.cpython-311-aarch64-linux-musl.so +0 -0
  478. scipy/special/_ufuncs.pyi +1 -0
  479. scipy/special/_ufuncs.pyx +215 -1400
  480. scipy/special/_ufuncs_cxx.cpython-311-aarch64-linux-musl.so +0 -0
  481. scipy/special/_ufuncs_cxx.pxd +2 -15
  482. scipy/special/_ufuncs_cxx.pyx +5 -44
  483. scipy/special/_ufuncs_cxx_defs.h +2 -16
  484. scipy/special/_ufuncs_defs.h +0 -8
  485. scipy/special/cython_special.cpython-311-aarch64-linux-musl.so +0 -0
  486. scipy/special/cython_special.pxd +1 -1
  487. scipy/special/tests/_cython_examples/meson.build +10 -1
  488. scipy/special/tests/test_basic.py +153 -20
  489. scipy/special/tests/test_boost_ufuncs.py +3 -0
  490. scipy/special/tests/test_cdflib.py +35 -11
  491. scipy/special/tests/test_gammainc.py +16 -0
  492. scipy/special/tests/test_hyp2f1.py +2 -2
  493. scipy/special/tests/test_log1mexp.py +85 -0
  494. scipy/special/tests/test_logsumexp.py +206 -64
  495. scipy/special/tests/test_mpmath.py +1 -0
  496. scipy/special/tests/test_nan_inputs.py +1 -1
  497. scipy/special/tests/test_orthogonal.py +17 -18
  498. scipy/special/tests/test_sf_error.py +3 -2
  499. scipy/special/tests/test_sph_harm.py +6 -7
  500. scipy/special/tests/test_support_alternative_backends.py +211 -76
  501. scipy/stats/__init__.py +4 -1
  502. scipy/stats/_ansari_swilk_statistics.cpython-311-aarch64-linux-musl.so +0 -0
  503. scipy/stats/_axis_nan_policy.py +5 -12
  504. scipy/stats/_biasedurn.cpython-311-aarch64-linux-musl.so +0 -0
  505. scipy/stats/_continued_fraction.py +387 -0
  506. scipy/stats/_continuous_distns.py +277 -310
  507. scipy/stats/_correlation.py +1 -1
  508. scipy/stats/_covariance.py +6 -3
  509. scipy/stats/_discrete_distns.py +39 -32
  510. scipy/stats/_distn_infrastructure.py +39 -12
  511. scipy/stats/_distribution_infrastructure.py +920 -238
  512. scipy/stats/_entropy.py +9 -10
  513. scipy/{_lib → stats}/_finite_differences.py +1 -1
  514. scipy/stats/_hypotests.py +83 -50
  515. scipy/stats/_kde.py +53 -49
  516. scipy/stats/_ksstats.py +1 -1
  517. scipy/stats/_levy_stable/__init__.py +7 -15
  518. scipy/stats/_levy_stable/levyst.cpython-311-aarch64-linux-musl.so +0 -0
  519. scipy/stats/_morestats.py +118 -73
  520. scipy/stats/_mstats_basic.py +13 -17
  521. scipy/stats/_mstats_extras.py +8 -8
  522. scipy/stats/_multivariate.py +89 -113
  523. scipy/stats/_new_distributions.py +97 -20
  524. scipy/stats/_page_trend_test.py +12 -5
  525. scipy/stats/_probability_distribution.py +265 -43
  526. scipy/stats/_qmc.py +14 -9
  527. scipy/stats/_qmc_cy.cpython-311-aarch64-linux-musl.so +0 -0
  528. scipy/stats/_qmvnt.py +16 -95
  529. scipy/stats/_qmvnt_cy.cpython-311-aarch64-linux-musl.so +0 -0
  530. scipy/stats/_quantile.py +335 -0
  531. scipy/stats/_rcont/rcont.cpython-311-aarch64-linux-musl.so +0 -0
  532. scipy/stats/_resampling.py +5 -30
  533. scipy/stats/_sampling.py +1 -1
  534. scipy/stats/_sobol.cpython-311-aarch64-linux-musl.so +0 -0
  535. scipy/stats/_stats.cpython-311-aarch64-linux-musl.so +0 -0
  536. scipy/stats/_stats_mstats_common.py +21 -2
  537. scipy/stats/_stats_py.py +551 -477
  538. scipy/stats/_stats_pythran.cpython-311-aarch64-linux-musl.so +0 -0
  539. scipy/stats/_unuran/unuran_wrapper.cpython-311-aarch64-linux-musl.so +0 -0
  540. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  541. scipy/stats/_variation.py +6 -8
  542. scipy/stats/_wilcoxon.py +13 -7
  543. scipy/stats/tests/common_tests.py +6 -4
  544. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  545. scipy/stats/tests/test_continued_fraction.py +173 -0
  546. scipy/stats/tests/test_continuous.py +379 -60
  547. scipy/stats/tests/test_continuous_basic.py +18 -12
  548. scipy/stats/tests/test_discrete_basic.py +14 -8
  549. scipy/stats/tests/test_discrete_distns.py +16 -16
  550. scipy/stats/tests/test_distributions.py +95 -75
  551. scipy/stats/tests/test_entropy.py +40 -48
  552. scipy/stats/tests/test_fit.py +4 -3
  553. scipy/stats/tests/test_hypotests.py +153 -24
  554. scipy/stats/tests/test_kdeoth.py +109 -41
  555. scipy/stats/tests/test_marray.py +289 -0
  556. scipy/stats/tests/test_morestats.py +81 -49
  557. scipy/stats/tests/test_mstats_basic.py +3 -3
  558. scipy/stats/tests/test_multivariate.py +434 -83
  559. scipy/stats/tests/test_qmc.py +13 -10
  560. scipy/stats/tests/test_quantile.py +199 -0
  561. scipy/stats/tests/test_rank.py +119 -112
  562. scipy/stats/tests/test_resampling.py +47 -56
  563. scipy/stats/tests/test_sampling.py +9 -4
  564. scipy/stats/tests/test_stats.py +799 -939
  565. scipy/stats/tests/test_variation.py +8 -6
  566. scipy/version.py +2 -2
  567. {scipy-1.15.3.dist-info → scipy-1.16.0.dist-info}/LICENSE.txt +4 -4
  568. {scipy-1.15.3.dist-info → scipy-1.16.0.dist-info}/METADATA +11 -11
  569. {scipy-1.15.3.dist-info → scipy-1.16.0.dist-info}/RECORD +1284 -1291
  570. scipy.libs/libgcc_s-2d945d6c.so.1 +0 -0
  571. scipy.libs/libgfortran-67378ab2.so.5.0.0 +0 -0
  572. scipy.libs/{libstdc++-1b614e01.so.6.0.32 → libstdc++-85f2cd6d.so.6.0.33} +0 -0
  573. scipy/_lib/array_api_extra/_funcs.py +0 -484
  574. scipy/_lib/array_api_extra/_typing.py +0 -8
  575. scipy/interpolate/_bspl.cpython-311-aarch64-linux-musl.so +0 -0
  576. scipy/optimize/_cobyla.cpython-311-aarch64-linux-musl.so +0 -0
  577. scipy/optimize/_cython_nnls.cpython-311-aarch64-linux-musl.so +0 -0
  578. scipy/optimize/_slsqp.cpython-311-aarch64-linux-musl.so +0 -0
  579. scipy/spatial/qhull_src/COPYING.txt +0 -38
  580. scipy/special/libsf_error_state.so +0 -0
  581. scipy/special/tests/test_log_softmax.py +0 -109
  582. scipy/special/tests/test_xsf_cuda.py +0 -114
  583. scipy/special/xsf/binom.h +0 -89
  584. scipy/special/xsf/cdflib.h +0 -100
  585. scipy/special/xsf/cephes/airy.h +0 -307
  586. scipy/special/xsf/cephes/besselpoly.h +0 -51
  587. scipy/special/xsf/cephes/beta.h +0 -257
  588. scipy/special/xsf/cephes/cbrt.h +0 -131
  589. scipy/special/xsf/cephes/chbevl.h +0 -85
  590. scipy/special/xsf/cephes/chdtr.h +0 -193
  591. scipy/special/xsf/cephes/const.h +0 -87
  592. scipy/special/xsf/cephes/ellie.h +0 -293
  593. scipy/special/xsf/cephes/ellik.h +0 -251
  594. scipy/special/xsf/cephes/ellpe.h +0 -107
  595. scipy/special/xsf/cephes/ellpk.h +0 -117
  596. scipy/special/xsf/cephes/expn.h +0 -260
  597. scipy/special/xsf/cephes/gamma.h +0 -398
  598. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  599. scipy/special/xsf/cephes/hyperg.h +0 -361
  600. scipy/special/xsf/cephes/i0.h +0 -149
  601. scipy/special/xsf/cephes/i1.h +0 -158
  602. scipy/special/xsf/cephes/igam.h +0 -421
  603. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  604. scipy/special/xsf/cephes/igami.h +0 -313
  605. scipy/special/xsf/cephes/j0.h +0 -225
  606. scipy/special/xsf/cephes/j1.h +0 -198
  607. scipy/special/xsf/cephes/jv.h +0 -715
  608. scipy/special/xsf/cephes/k0.h +0 -164
  609. scipy/special/xsf/cephes/k1.h +0 -163
  610. scipy/special/xsf/cephes/kn.h +0 -243
  611. scipy/special/xsf/cephes/lanczos.h +0 -112
  612. scipy/special/xsf/cephes/ndtr.h +0 -275
  613. scipy/special/xsf/cephes/poch.h +0 -85
  614. scipy/special/xsf/cephes/polevl.h +0 -167
  615. scipy/special/xsf/cephes/psi.h +0 -194
  616. scipy/special/xsf/cephes/rgamma.h +0 -111
  617. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  618. scipy/special/xsf/cephes/shichi.h +0 -248
  619. scipy/special/xsf/cephes/sici.h +0 -224
  620. scipy/special/xsf/cephes/sindg.h +0 -221
  621. scipy/special/xsf/cephes/tandg.h +0 -139
  622. scipy/special/xsf/cephes/trig.h +0 -58
  623. scipy/special/xsf/cephes/unity.h +0 -186
  624. scipy/special/xsf/cephes/zeta.h +0 -172
  625. scipy/special/xsf/config.h +0 -304
  626. scipy/special/xsf/digamma.h +0 -205
  627. scipy/special/xsf/error.h +0 -57
  628. scipy/special/xsf/evalpoly.h +0 -47
  629. scipy/special/xsf/expint.h +0 -266
  630. scipy/special/xsf/hyp2f1.h +0 -694
  631. scipy/special/xsf/iv_ratio.h +0 -173
  632. scipy/special/xsf/lambertw.h +0 -150
  633. scipy/special/xsf/loggamma.h +0 -163
  634. scipy/special/xsf/sici.h +0 -200
  635. scipy/special/xsf/tools.h +0 -427
  636. scipy/special/xsf/trig.h +0 -164
  637. scipy/special/xsf/wright_bessel.h +0 -843
  638. scipy/special/xsf/zlog1.h +0 -35
  639. scipy/stats/_mvn.cpython-311-aarch64-linux-musl.so +0 -0
  640. scipy.libs/libgcc_s-7393e603.so.1 +0 -0
  641. scipy.libs/libgfortran-eb933d8e.so.5.0.0 +0 -0
  642. {scipy-1.15.3.dist-info → scipy-1.16.0.dist-info}/WHEEL +0 -0
@@ -1,811 +0,0 @@
1
- /* Translated into C++ by SciPy developers in 2024.
2
- * Original header with Copyright information appears below.
3
- */
4
-
5
- /* iv.c
6
- *
7
- * Modified Bessel function of noninteger order
8
- *
9
- *
10
- *
11
- * SYNOPSIS:
12
- *
13
- * double v, x, y, iv();
14
- *
15
- * y = iv( v, x );
16
- *
17
- *
18
- *
19
- * DESCRIPTION:
20
- *
21
- * Returns modified Bessel function of order v of the
22
- * argument. If x is negative, v must be integer valued.
23
- *
24
- */
25
- /* iv.c */
26
- /* Modified Bessel function of noninteger order */
27
- /* If x < 0, then v must be an integer. */
28
-
29
- /*
30
- * Parts of the code are copyright:
31
- *
32
- * Cephes Math Library Release 2.8: June, 2000
33
- * Copyright 1984, 1987, 1988, 2000 by Stephen L. Moshier
34
- *
35
- * And other parts:
36
- *
37
- * Copyright (c) 2006 Xiaogang Zhang
38
- * Use, modification and distribution are subject to the
39
- * Boost Software License, Version 1.0.
40
- *
41
- * Boost Software License - Version 1.0 - August 17th, 2003
42
- *
43
- * Permission is hereby granted, free of charge, to any person or
44
- * organization obtaining a copy of the software and accompanying
45
- * documentation covered by this license (the "Software") to use, reproduce,
46
- * display, distribute, execute, and transmit the Software, and to prepare
47
- * derivative works of the Software, and to permit third-parties to whom the
48
- * Software is furnished to do so, all subject to the following:
49
- *
50
- * The copyright notices in the Software and this entire statement,
51
- * including the above license grant, this restriction and the following
52
- * disclaimer, must be included in all copies of the Software, in whole or
53
- * in part, and all derivative works of the Software, unless such copies or
54
- * derivative works are solely in the form of machine-executable object code
55
- * generated by a source language processor.
56
- *
57
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
58
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
59
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
60
- * NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE
61
- * DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY,
62
- * WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
63
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
64
- * SOFTWARE.
65
- *
66
- * And the rest are:
67
- *
68
- * Copyright (C) 2009 Pauli Virtanen
69
- * Distributed under the same license as Scipy.
70
- *
71
- */
72
- #pragma once
73
-
74
- #include "../config.h"
75
- #include "../error.h"
76
-
77
- #include "const.h"
78
- #include "gamma.h"
79
- #include "trig.h"
80
-
81
- namespace xsf {
82
- namespace cephes {
83
-
84
- namespace detail {
85
-
86
- /*
87
- * Compute Iv from (AMS5 9.7.1), asymptotic expansion for large |z|
88
- * Iv ~ exp(x)/sqrt(2 pi x) ( 1 + (4*v*v-1)/8x + (4*v*v-1)(4*v*v-9)/8x/2! + ...)
89
- */
90
- XSF_HOST_DEVICE inline double iv_asymptotic(double v, double x) {
91
- double mu;
92
- double sum, term, prefactor, factor;
93
- int k;
94
-
95
- prefactor = std::exp(x) / std::sqrt(2 * M_PI * x);
96
-
97
- if (prefactor == std::numeric_limits<double>::infinity()) {
98
- return prefactor;
99
- }
100
-
101
- mu = 4 * v * v;
102
- sum = 1.0;
103
- term = 1.0;
104
- k = 1;
105
-
106
- do {
107
- factor = (mu - (2 * k - 1) * (2 * k - 1)) / (8 * x) / k;
108
- if (k > 100) {
109
- /* didn't converge */
110
- set_error("iv(iv_asymptotic)", SF_ERROR_NO_RESULT, NULL);
111
- break;
112
- }
113
- term *= -factor;
114
- sum += term;
115
- ++k;
116
- } while (std::abs(term) > MACHEP * std::abs(sum));
117
- return sum * prefactor;
118
- }
119
-
120
- /*
121
- * Uniform asymptotic expansion factors, (AMS5 9.3.9; AMS5 9.3.10)
122
- *
123
- * Computed with:
124
- * --------------------
125
- import numpy as np
126
- t = np.poly1d([1,0])
127
- def up1(p):
128
- return .5*t*t*(1-t*t)*p.deriv() + 1/8. * ((1-5*t*t)*p).integ()
129
- us = [np.poly1d([1])]
130
- for k in range(10):
131
- us.append(up1(us[-1]))
132
- n = us[-1].order
133
- for p in us:
134
- print "{" + ", ".join(["0"]*(n-p.order) + map(repr, p)) + "},"
135
- print "N_UFACTORS", len(us)
136
- print "N_UFACTOR_TERMS", us[-1].order + 1
137
- * --------------------
138
- */
139
- constexpr int iv_N_UFACTORS = 11;
140
- constexpr int iv_N_UFACTOR_TERMS = 31;
141
-
142
- constexpr double iv_asymptotic_ufactors[iv_N_UFACTORS][iv_N_UFACTOR_TERMS] = {
143
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
144
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
145
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.20833333333333334,
146
- 0.0, 0.125, 0.0},
147
- {0,
148
- 0,
149
- 0,
150
- 0,
151
- 0,
152
- 0,
153
- 0,
154
- 0,
155
- 0,
156
- 0,
157
- 0,
158
- 0,
159
- 0,
160
- 0,
161
- 0,
162
- 0,
163
- 0,
164
- 0,
165
- 0,
166
- 0,
167
- 0,
168
- 0,
169
- 0,
170
- 0,
171
- 0.3342013888888889,
172
- 0.0,
173
- -0.40104166666666669,
174
- 0.0,
175
- 0.0703125,
176
- 0.0,
177
- 0.0},
178
- {0, 0,
179
- 0, 0,
180
- 0, 0,
181
- 0, 0,
182
- 0, 0,
183
- 0, 0,
184
- 0, 0,
185
- 0, 0,
186
- 0, 0,
187
- 0, 0,
188
- 0, -1.0258125964506173,
189
- 0.0, 1.8464626736111112,
190
- 0.0, -0.89121093750000002,
191
- 0.0, 0.0732421875,
192
- 0.0, 0.0,
193
- 0.0},
194
- {0,
195
- 0,
196
- 0,
197
- 0,
198
- 0,
199
- 0,
200
- 0,
201
- 0,
202
- 0,
203
- 0,
204
- 0,
205
- 0,
206
- 0,
207
- 0,
208
- 0,
209
- 0,
210
- 0,
211
- 0,
212
- 4.6695844234262474,
213
- 0.0,
214
- -11.207002616222995,
215
- 0.0,
216
- 8.78912353515625,
217
- 0.0,
218
- -2.3640869140624998,
219
- 0.0,
220
- 0.112152099609375,
221
- 0.0,
222
- 0.0,
223
- 0.0,
224
- 0.0},
225
- {0, 0,
226
- 0, 0,
227
- 0, 0,
228
- 0, 0,
229
- 0, 0,
230
- 0, 0,
231
- 0, 0,
232
- 0, -28.212072558200244,
233
- 0.0, 84.636217674600744,
234
- 0.0, -91.818241543240035,
235
- 0.0, 42.534998745388457,
236
- 0.0, -7.3687943594796312,
237
- 0.0, 0.22710800170898438,
238
- 0.0, 0.0,
239
- 0.0, 0.0,
240
- 0.0},
241
- {0,
242
- 0,
243
- 0,
244
- 0,
245
- 0,
246
- 0,
247
- 0,
248
- 0,
249
- 0,
250
- 0,
251
- 0,
252
- 0,
253
- 212.5701300392171,
254
- 0.0,
255
- -765.25246814118157,
256
- 0.0,
257
- 1059.9904525279999,
258
- 0.0,
259
- -699.57962737613275,
260
- 0.0,
261
- 218.19051174421159,
262
- 0.0,
263
- -26.491430486951554,
264
- 0.0,
265
- 0.57250142097473145,
266
- 0.0,
267
- 0.0,
268
- 0.0,
269
- 0.0,
270
- 0.0,
271
- 0.0},
272
- {0, 0,
273
- 0, 0,
274
- 0, 0,
275
- 0, 0,
276
- 0, -1919.4576623184068,
277
- 0.0, 8061.7221817373083,
278
- 0.0, -13586.550006434136,
279
- 0.0, 11655.393336864536,
280
- 0.0, -5305.6469786134048,
281
- 0.0, 1200.9029132163525,
282
- 0.0, -108.09091978839464,
283
- 0.0, 1.7277275025844574,
284
- 0.0, 0.0,
285
- 0.0, 0.0,
286
- 0.0, 0.0,
287
- 0.0},
288
- {0,
289
- 0,
290
- 0,
291
- 0,
292
- 0,
293
- 0,
294
- 20204.291330966149,
295
- 0.0,
296
- -96980.598388637503,
297
- 0.0,
298
- 192547.0012325315,
299
- 0.0,
300
- -203400.17728041555,
301
- 0.0,
302
- 122200.46498301747,
303
- 0.0,
304
- -41192.654968897557,
305
- 0.0,
306
- 7109.5143024893641,
307
- 0.0,
308
- -493.915304773088,
309
- 0.0,
310
- 6.074042001273483,
311
- 0.0,
312
- 0.0,
313
- 0.0,
314
- 0.0,
315
- 0.0,
316
- 0.0,
317
- 0.0,
318
- 0.0},
319
- {0, 0,
320
- 0, -242919.18790055133,
321
- 0.0, 1311763.6146629769,
322
- 0.0, -2998015.9185381061,
323
- 0.0, 3763271.2976564039,
324
- 0.0, -2813563.2265865342,
325
- 0.0, 1268365.2733216248,
326
- 0.0, -331645.17248456361,
327
- 0.0, 45218.768981362737,
328
- 0.0, -2499.8304818112092,
329
- 0.0, 24.380529699556064,
330
- 0.0, 0.0,
331
- 0.0, 0.0,
332
- 0.0, 0.0,
333
- 0.0, 0.0,
334
- 0.0},
335
- {3284469.8530720375,
336
- 0.0,
337
- -19706819.11843222,
338
- 0.0,
339
- 50952602.492664628,
340
- 0.0,
341
- -74105148.211532637,
342
- 0.0,
343
- 66344512.274729028,
344
- 0.0,
345
- -37567176.660763353,
346
- 0.0,
347
- 13288767.166421819,
348
- 0.0,
349
- -2785618.1280864552,
350
- 0.0,
351
- 308186.40461266245,
352
- 0.0,
353
- -13886.089753717039,
354
- 0.0,
355
- 110.01714026924674,
356
- 0.0,
357
- 0.0,
358
- 0.0,
359
- 0.0,
360
- 0.0,
361
- 0.0,
362
- 0.0,
363
- 0.0,
364
- 0.0,
365
- 0.0}};
366
-
367
- /*
368
- * Compute Iv, Kv from (AMS5 9.7.7 + 9.7.8), asymptotic expansion for large v
369
- */
370
- XSF_HOST_DEVICE inline void ikv_asymptotic_uniform(double v, double x, double *i_value, double *k_value) {
371
- double i_prefactor, k_prefactor;
372
- double t, t2, eta, z;
373
- double i_sum, k_sum, term, divisor;
374
- int k, n;
375
- int sign = 1;
376
-
377
- if (v < 0) {
378
- /* Negative v; compute I_{-v} and K_{-v} and use (AMS 9.6.2) */
379
- sign = -1;
380
- v = -v;
381
- }
382
-
383
- z = x / v;
384
- t = 1 / std::sqrt(1 + z * z);
385
- t2 = t * t;
386
- eta = std::sqrt(1 + z * z) + std::log(z / (1 + 1 / t));
387
-
388
- i_prefactor = std::sqrt(t / (2 * M_PI * v)) * std::exp(v * eta);
389
- i_sum = 1.0;
390
-
391
- k_prefactor = std::sqrt(M_PI * t / (2 * v)) * std::exp(-v * eta);
392
- k_sum = 1.0;
393
-
394
- divisor = v;
395
- for (n = 1; n < iv_N_UFACTORS; ++n) {
396
- /*
397
- * Evaluate u_k(t) with Horner's scheme;
398
- * (using the knowledge about which coefficients are zero)
399
- */
400
- term = 0;
401
- for (k = iv_N_UFACTOR_TERMS - 1 - 3 * n; k < iv_N_UFACTOR_TERMS - n; k += 2) {
402
- term *= t2;
403
- term += iv_asymptotic_ufactors[n][k];
404
- }
405
- for (k = 1; k < n; k += 2) {
406
- term *= t2;
407
- }
408
- if (n % 2 == 1) {
409
- term *= t;
410
- }
411
-
412
- /* Sum terms */
413
- term /= divisor;
414
- i_sum += term;
415
- k_sum += (n % 2 == 0) ? term : -term;
416
-
417
- /* Check convergence */
418
- if (std::abs(term) < MACHEP) {
419
- break;
420
- }
421
-
422
- divisor *= v;
423
- }
424
-
425
- if (std::abs(term) > 1e-3 * std::abs(i_sum)) {
426
- /* Didn't converge */
427
- set_error("ikv_asymptotic_uniform", SF_ERROR_NO_RESULT, NULL);
428
- }
429
- if (std::abs(term) > MACHEP * std::abs(i_sum)) {
430
- /* Some precision lost */
431
- set_error("ikv_asymptotic_uniform", SF_ERROR_LOSS, NULL);
432
- }
433
-
434
- if (k_value != NULL) {
435
- /* symmetric in v */
436
- *k_value = k_prefactor * k_sum;
437
- }
438
-
439
- if (i_value != NULL) {
440
- if (sign == 1) {
441
- *i_value = i_prefactor * i_sum;
442
- } else {
443
- /* (AMS 9.6.2) */
444
- *i_value = (i_prefactor * i_sum + (2 / M_PI) * xsf::cephes::sinpi(v) * k_prefactor * k_sum);
445
- }
446
- }
447
- }
448
-
449
- /*
450
- * The following code originates from the Boost C++ library,
451
- * from file `boost/math/special_functions/detail/bessel_ik.hpp`,
452
- * converted from C++ to C.
453
- */
454
-
455
- /*
456
- * Modified Bessel functions of the first and second kind of fractional order
457
- *
458
- * Calculate K(v, x) and K(v+1, x) by method analogous to
459
- * Temme, Journal of Computational Physics, vol 21, 343 (1976)
460
- */
461
- XSF_HOST_DEVICE inline int temme_ik_series(double v, double x, double *K, double *K1) {
462
- double f, h, p, q, coef, sum, sum1, tolerance;
463
- double a, b, c, d, sigma, gamma1, gamma2;
464
- std::uint64_t k;
465
- double gp;
466
- double gm;
467
-
468
- /*
469
- * |x| <= 2, Temme series converge rapidly
470
- * |x| > 2, the larger the |x|, the slower the convergence
471
- */
472
- XSF_ASSERT(std::abs(x) <= 2);
473
- XSF_ASSERT(std::abs(v) <= 0.5f);
474
-
475
- gp = xsf::cephes::Gamma(v + 1) - 1;
476
- gm = xsf::cephes::Gamma(-v + 1) - 1;
477
-
478
- a = std::log(x / 2);
479
- b = std::exp(v * a);
480
- sigma = -a * v;
481
- c = std::abs(v) < MACHEP ? 1 : xsf::cephes::sinpi(v) / (v * M_PI);
482
- d = std::abs(sigma) < MACHEP ? 1 : std::sinh(sigma) / sigma;
483
- gamma1 = std::abs(v) < MACHEP ? -SCIPY_EULER : (0.5 / v) * (gp - gm) * c;
484
- gamma2 = (2 + gp + gm) * c / 2;
485
-
486
- /* initial values */
487
- p = (gp + 1) / (2 * b);
488
- q = (1 + gm) * b / 2;
489
- f = (std::cosh(sigma) * gamma1 + d * (-a) * gamma2) / c;
490
- h = p;
491
- coef = 1;
492
- sum = coef * f;
493
- sum1 = coef * h;
494
-
495
- /* series summation */
496
- tolerance = MACHEP;
497
- for (k = 1; k < MAXITER; k++) {
498
- f = (k * f + p + q) / (k * k - v * v);
499
- p /= k - v;
500
- q /= k + v;
501
- h = p - k * f;
502
- coef *= x * x / (4 * k);
503
- sum += coef * f;
504
- sum1 += coef * h;
505
- if (std::abs(coef * f) < std::abs(sum) * tolerance) {
506
- break;
507
- }
508
- }
509
- if (k == MAXITER) {
510
- set_error("ikv_temme(temme_ik_series)", SF_ERROR_NO_RESULT, NULL);
511
- }
512
-
513
- *K = sum;
514
- *K1 = 2 * sum1 / x;
515
-
516
- return 0;
517
- }
518
-
519
- /* Evaluate continued fraction fv = I_(v+1) / I_v, derived from
520
- * Abramowitz and Stegun, Handbook of Mathematical Functions, 1972, 9.1.73 */
521
- XSF_HOST_DEVICE inline int CF1_ik(double v, double x, double *fv) {
522
- double C, D, f, a, b, delta, tiny, tolerance;
523
- std::uint64_t k;
524
-
525
- /*
526
- * |x| <= |v|, CF1_ik converges rapidly
527
- * |x| > |v|, CF1_ik needs O(|x|) iterations to converge
528
- */
529
-
530
- /*
531
- * modified Lentz's method, see
532
- * Lentz, Applied Optics, vol 15, 668 (1976)
533
- */
534
- tolerance = 2 * MACHEP;
535
- tiny = 1 / std::sqrt(std::numeric_limits<double>::max());
536
- C = f = tiny; /* b0 = 0, replace with tiny */
537
- D = 0;
538
- for (k = 1; k < MAXITER; k++) {
539
- a = 1;
540
- b = 2 * (v + k) / x;
541
- C = b + a / C;
542
- D = b + a * D;
543
- if (C == 0) {
544
- C = tiny;
545
- }
546
- if (D == 0) {
547
- D = tiny;
548
- }
549
- D = 1 / D;
550
- delta = C * D;
551
- f *= delta;
552
- if (std::abs(delta - 1) <= tolerance) {
553
- break;
554
- }
555
- }
556
- if (k == MAXITER) {
557
- set_error("ikv_temme(CF1_ik)", SF_ERROR_NO_RESULT, NULL);
558
- }
559
-
560
- *fv = f;
561
-
562
- return 0;
563
- }
564
-
565
- /*
566
- * Calculate K(v, x) and K(v+1, x) by evaluating continued fraction
567
- * z1 / z0 = U(v+1.5, 2v+1, 2x) / U(v+0.5, 2v+1, 2x), see
568
- * Thompson and Barnett, Computer Physics Communications, vol 47, 245 (1987)
569
- */
570
- XSF_HOST_DEVICE inline int CF2_ik(double v, double x, double *Kv, double *Kv1) {
571
-
572
- double S, C, Q, D, f, a, b, q, delta, tolerance, current, prev;
573
- std::uint64_t k;
574
-
575
- /*
576
- * |x| >= |v|, CF2_ik converges rapidly
577
- * |x| -> 0, CF2_ik fails to converge
578
- */
579
-
580
- XSF_ASSERT(std::abs(x) > 1);
581
-
582
- /*
583
- * Steed's algorithm, see Thompson and Barnett,
584
- * Journal of Computational Physics, vol 64, 490 (1986)
585
- */
586
- tolerance = MACHEP;
587
- a = v * v - 0.25;
588
- b = 2 * (x + 1); /* b1 */
589
- D = 1 / b; /* D1 = 1 / b1 */
590
- f = delta = D; /* f1 = delta1 = D1, coincidence */
591
- prev = 0; /* q0 */
592
- current = 1; /* q1 */
593
- Q = C = -a; /* Q1 = C1 because q1 = 1 */
594
- S = 1 + Q * delta; /* S1 */
595
- for (k = 2; k < MAXITER; k++) { /* starting from 2 */
596
- /* continued fraction f = z1 / z0 */
597
- a -= 2 * (k - 1);
598
- b += 2;
599
- D = 1 / (b + a * D);
600
- delta *= b * D - 1;
601
- f += delta;
602
-
603
- /* series summation S = 1 + \sum_{n=1}^{\infty} C_n * z_n / z_0 */
604
- q = (prev - (b - 2) * current) / a;
605
- prev = current;
606
- current = q; /* forward recurrence for q */
607
- C *= -a / k;
608
- Q += C * q;
609
- S += Q * delta;
610
-
611
- /* S converges slower than f */
612
- if (std::abs(Q * delta) < std::abs(S) * tolerance) {
613
- break;
614
- }
615
- }
616
- if (k == MAXITER) {
617
- set_error("ikv_temme(CF2_ik)", SF_ERROR_NO_RESULT, NULL);
618
- }
619
-
620
- *Kv = std::sqrt(M_PI / (2 * x)) * std::exp(-x) / S;
621
- *Kv1 = *Kv * (0.5 + v + x + (v * v - 0.25) * f) / x;
622
-
623
- return 0;
624
- }
625
-
626
- /* Flags for what to compute */
627
- enum { ikv_temme_need_i = 0x1, ikv_temme_need_k = 0x2 };
628
-
629
- /*
630
- * Compute I(v, x) and K(v, x) simultaneously by Temme's method, see
631
- * Temme, Journal of Computational Physics, vol 19, 324 (1975)
632
- */
633
- XSF_HOST_DEVICE inline void ikv_temme(double v, double x, double *Iv_p, double *Kv_p) {
634
- /* Kv1 = K_(v+1), fv = I_(v+1) / I_v */
635
- /* Ku1 = K_(u+1), fu = I_(u+1) / I_u */
636
- double u, Iv, Kv, Kv1, Ku, Ku1, fv;
637
- double W, current, prev, next;
638
- int reflect = 0;
639
- unsigned n, k;
640
- int kind;
641
-
642
- kind = 0;
643
- if (Iv_p != NULL) {
644
- kind |= ikv_temme_need_i;
645
- }
646
- if (Kv_p != NULL) {
647
- kind |= ikv_temme_need_k;
648
- }
649
-
650
- if (v < 0) {
651
- reflect = 1;
652
- v = -v; /* v is non-negative from here */
653
- kind |= ikv_temme_need_k;
654
- }
655
- n = std::round(v);
656
- u = v - n; /* -1/2 <= u < 1/2 */
657
-
658
- if (x < 0) {
659
- if (Iv_p != NULL)
660
- *Iv_p = std::numeric_limits<double>::quiet_NaN();
661
- if (Kv_p != NULL)
662
- *Kv_p = std::numeric_limits<double>::quiet_NaN();
663
- set_error("ikv_temme", SF_ERROR_DOMAIN, NULL);
664
- return;
665
- }
666
- if (x == 0) {
667
- Iv = (v == 0) ? 1 : 0;
668
- if (kind & ikv_temme_need_k) {
669
- set_error("ikv_temme", SF_ERROR_OVERFLOW, NULL);
670
- Kv = std::numeric_limits<double>::infinity();
671
- } else {
672
- Kv = std::numeric_limits<double>::quiet_NaN(); /* any value will do */
673
- }
674
-
675
- if (reflect && (kind & ikv_temme_need_i)) {
676
- double z = (u + n % 2);
677
-
678
- Iv = xsf::cephes::sinpi(z) == 0 ? Iv : std::numeric_limits<double>::infinity();
679
- if (std::isinf(Iv)) {
680
- set_error("ikv_temme", SF_ERROR_OVERFLOW, NULL);
681
- }
682
- }
683
-
684
- if (Iv_p != NULL) {
685
- *Iv_p = Iv;
686
- }
687
- if (Kv_p != NULL) {
688
- *Kv_p = Kv;
689
- }
690
- return;
691
- }
692
- /* x is positive until reflection */
693
- W = 1 / x; /* Wronskian */
694
- if (x <= 2) { /* x in (0, 2] */
695
- temme_ik_series(u, x, &Ku, &Ku1); /* Temme series */
696
- } else { /* x in (2, \infty) */
697
- CF2_ik(u, x, &Ku, &Ku1); /* continued fraction CF2_ik */
698
- }
699
- prev = Ku;
700
- current = Ku1;
701
- for (k = 1; k <= n; k++) { /* forward recurrence for K */
702
- next = 2 * (u + k) * current / x + prev;
703
- prev = current;
704
- current = next;
705
- }
706
- Kv = prev;
707
- Kv1 = current;
708
- if (kind & ikv_temme_need_i) {
709
- double lim = (4 * v * v + 10) / (8 * x);
710
-
711
- lim *= lim;
712
- lim *= lim;
713
- lim /= 24;
714
- if ((lim < MACHEP * 10) && (x > 100)) {
715
- /*
716
- * x is huge compared to v, CF1 may be very slow
717
- * to converge so use asymptotic expansion for large
718
- * x case instead. Note that the asymptotic expansion
719
- * isn't very accurate - so it's deliberately very hard
720
- * to get here - probably we're going to overflow:
721
- */
722
- Iv = iv_asymptotic(v, x);
723
- } else {
724
- CF1_ik(v, x, &fv); /* continued fraction CF1_ik */
725
- Iv = W / (Kv * fv + Kv1); /* Wronskian relation */
726
- }
727
- } else {
728
- Iv = std::numeric_limits<double>::quiet_NaN(); /* any value will do */
729
- }
730
-
731
- if (reflect) {
732
- double z = (u + n % 2);
733
-
734
- if (Iv_p != NULL) {
735
- *Iv_p = Iv + (2 / M_PI) * xsf::cephes::sinpi(z) * Kv; /* reflection formula */
736
- }
737
- if (Kv_p != NULL) {
738
- *Kv_p = Kv;
739
- }
740
- } else {
741
- if (Iv_p != NULL) {
742
- *Iv_p = Iv;
743
- }
744
- if (Kv_p != NULL) {
745
- *Kv_p = Kv;
746
- }
747
- }
748
- return;
749
- }
750
-
751
- } // namespace detail
752
-
753
- XSF_HOST_DEVICE inline double iv(double v, double x) {
754
- int sign;
755
- double t, ax, res;
756
-
757
- if (std::isnan(v) || std::isnan(x)) {
758
- return std::numeric_limits<double>::quiet_NaN();
759
- }
760
-
761
- /* If v is a negative integer, invoke symmetry */
762
- t = std::floor(v);
763
- if (v < 0.0) {
764
- if (t == v) {
765
- v = -v; /* symmetry */
766
- t = -t;
767
- }
768
- }
769
- /* If x is negative, require v to be an integer */
770
- sign = 1;
771
- if (x < 0.0) {
772
- if (t != v) {
773
- set_error("iv", SF_ERROR_DOMAIN, NULL);
774
- return (std::numeric_limits<double>::quiet_NaN());
775
- }
776
- if (v != 2.0 * std::floor(v / 2.0)) {
777
- sign = -1;
778
- }
779
- }
780
-
781
- /* Avoid logarithm singularity */
782
- if (x == 0.0) {
783
- if (v == 0.0) {
784
- return 1.0;
785
- }
786
- if (v < 0.0) {
787
- set_error("iv", SF_ERROR_OVERFLOW, NULL);
788
- return std::numeric_limits<double>::infinity();
789
- } else
790
- return 0.0;
791
- }
792
-
793
- ax = std::abs(x);
794
- if (std::abs(v) > 50) {
795
- /*
796
- * Uniform asymptotic expansion for large orders.
797
- *
798
- * This appears to overflow slightly later than the Boost
799
- * implementation of Temme's method.
800
- */
801
- detail::ikv_asymptotic_uniform(v, ax, &res, NULL);
802
- } else {
803
- /* Otherwise: Temme's method */
804
- detail::ikv_temme(v, ax, &res, NULL);
805
- }
806
- res *= sign;
807
- return res;
808
- }
809
-
810
- } // namespace cephes
811
- } // namespace xsf