scipy 1.15.3__cp313-cp313-musllinux_1_2_aarch64.whl → 1.16.0rc2__cp313-cp313-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 (641) hide show
  1. scipy/__config__.py +10 -10
  2. scipy/__init__.py +3 -6
  3. scipy/_cyutility.cpython-313-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-313-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-313-aarch64-linux-musl.so +0 -0
  11. scipy/_lib/_sparse.py +41 -0
  12. scipy/_lib/_test_ccallback.cpython-313-aarch64-linux-musl.so +0 -0
  13. scipy/_lib/_test_deprecation_call.cpython-313-aarch64-linux-musl.so +0 -0
  14. scipy/_lib/_test_deprecation_def.cpython-313-aarch64-linux-musl.so +0 -0
  15. scipy/_lib/_testutils.py +6 -2
  16. scipy/_lib/_uarray/_uarray.cpython-313-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-313-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-313-aarch64-linux-musl.so +0 -0
  97. scipy/cluster/_optimal_leaf_ordering.cpython-313-aarch64-linux-musl.so +0 -0
  98. scipy/cluster/_vq.cpython-313-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 +263 -157
  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-313-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-313-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-313-aarch64-linux-musl.so +0 -0
  129. scipy/integrate/_lsoda.cpython-313-aarch64-linux-musl.so +0 -0
  130. scipy/integrate/_ode.py +9 -2
  131. scipy/integrate/_odepack.cpython-313-aarch64-linux-musl.so +0 -0
  132. scipy/integrate/_quad_vec.py +21 -29
  133. scipy/integrate/_quadpack.cpython-313-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-313-aarch64-linux-musl.so +0 -0
  139. scipy/integrate/_test_odeint_banded.cpython-313-aarch64-linux-musl.so +0 -0
  140. scipy/integrate/_vode.cpython-313-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-313-aarch64-linux-musl.so +0 -0
  151. scipy/interpolate/_dierckx.cpython-313-aarch64-linux-musl.so +0 -0
  152. scipy/interpolate/_fitpack.cpython-313-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-313-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-313-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-313-aarch64-linux-musl.so +0 -0
  165. scipy/interpolate/_rgi.py +31 -26
  166. scipy/interpolate/_rgi_cython.cpython-313-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-313-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-313-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-313-aarch64-linux-musl.so +0 -0
  187. scipy/io/matlab/_mio_utils.cpython-313-aarch64-linux-musl.so +0 -0
  188. scipy/io/matlab/_miobase.py +4 -1
  189. scipy/io/matlab/_streams.cpython-313-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-313-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-313-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-313-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-313-aarch64-linux-musl.so +0 -0
  210. scipy/linalg/_expm_frechet.py +4 -0
  211. scipy/linalg/_fblas.cpython-313-aarch64-linux-musl.so +0 -0
  212. scipy/linalg/_flapack.cpython-313-aarch64-linux-musl.so +0 -0
  213. scipy/linalg/_linalg_pythran.cpython-313-aarch64-linux-musl.so +0 -0
  214. scipy/linalg/_matfuncs.py +187 -4
  215. scipy/linalg/_matfuncs_expm.cpython-313-aarch64-linux-musl.so +0 -0
  216. scipy/linalg/_matfuncs_schur_sqrtm.cpython-313-aarch64-linux-musl.so +0 -0
  217. scipy/linalg/_matfuncs_sqrtm.py +1 -99
  218. scipy/linalg/_matfuncs_sqrtm_triu.cpython-313-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-313-aarch64-linux-musl.so +0 -0
  222. scipy/linalg/_solvers.py +7 -2
  223. scipy/linalg/_special_matrices.py +26 -36
  224. scipy/linalg/cython_blas.cpython-313-aarch64-linux-musl.so +0 -0
  225. scipy/linalg/cython_lapack.cpython-313-aarch64-linux-musl.so +0 -0
  226. scipy/linalg/lapack.py +22 -2
  227. scipy/linalg/tests/_cython_examples/meson.build +7 -0
  228. scipy/linalg/tests/test_basic.py +31 -16
  229. scipy/linalg/tests/test_batch.py +588 -0
  230. scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
  231. scipy/linalg/tests/test_decomp.py +40 -3
  232. scipy/linalg/tests/test_decomp_cossin.py +14 -0
  233. scipy/linalg/tests/test_decomp_ldl.py +1 -1
  234. scipy/linalg/tests/test_lapack.py +115 -7
  235. scipy/linalg/tests/test_matfuncs.py +157 -102
  236. scipy/linalg/tests/test_procrustes.py +0 -7
  237. scipy/linalg/tests/test_solve_toeplitz.py +1 -1
  238. scipy/linalg/tests/test_special_matrices.py +1 -5
  239. scipy/ndimage/__init__.py +1 -0
  240. scipy/ndimage/_ctest.cpython-313-aarch64-linux-musl.so +0 -0
  241. scipy/ndimage/_cytest.cpython-313-aarch64-linux-musl.so +0 -0
  242. scipy/ndimage/_delegators.py +8 -2
  243. scipy/ndimage/_filters.py +453 -5
  244. scipy/ndimage/_interpolation.py +36 -6
  245. scipy/ndimage/_measurements.py +4 -2
  246. scipy/ndimage/_morphology.py +5 -0
  247. scipy/ndimage/_nd_image.cpython-313-aarch64-linux-musl.so +0 -0
  248. scipy/ndimage/_ni_docstrings.py +5 -1
  249. scipy/ndimage/_ni_label.cpython-313-aarch64-linux-musl.so +0 -0
  250. scipy/ndimage/_ni_support.py +1 -5
  251. scipy/ndimage/_rank_filter_1d.cpython-313-aarch64-linux-musl.so +0 -0
  252. scipy/ndimage/_support_alternative_backends.py +18 -6
  253. scipy/ndimage/tests/test_filters.py +370 -259
  254. scipy/ndimage/tests/test_fourier.py +7 -9
  255. scipy/ndimage/tests/test_interpolation.py +68 -61
  256. scipy/ndimage/tests/test_measurements.py +18 -35
  257. scipy/ndimage/tests/test_morphology.py +143 -131
  258. scipy/ndimage/tests/test_splines.py +1 -3
  259. scipy/odr/__odrpack.cpython-313-aarch64-linux-musl.so +0 -0
  260. scipy/optimize/_basinhopping.py +13 -7
  261. scipy/optimize/_bglu_dense.cpython-313-aarch64-linux-musl.so +0 -0
  262. scipy/optimize/_bracket.py +17 -24
  263. scipy/optimize/_chandrupatla.py +9 -10
  264. scipy/optimize/_cobyla_py.py +104 -123
  265. scipy/optimize/_constraints.py +14 -10
  266. scipy/optimize/_differentiable_functions.py +371 -230
  267. scipy/optimize/_differentialevolution.py +4 -3
  268. scipy/optimize/_direct.cpython-313-aarch64-linux-musl.so +0 -0
  269. scipy/optimize/_dual_annealing.py +1 -1
  270. scipy/optimize/_elementwise.py +1 -4
  271. scipy/optimize/_group_columns.cpython-313-aarch64-linux-musl.so +0 -0
  272. scipy/optimize/_highspy/_core.cpython-313-aarch64-linux-musl.so +0 -0
  273. scipy/optimize/_highspy/_highs_options.cpython-313-aarch64-linux-musl.so +0 -0
  274. scipy/optimize/_lbfgsb.cpython-313-aarch64-linux-musl.so +0 -0
  275. scipy/optimize/_lbfgsb_py.py +57 -16
  276. scipy/optimize/_linprog_doc.py +2 -2
  277. scipy/optimize/_linprog_highs.py +2 -2
  278. scipy/optimize/_linprog_ip.py +25 -10
  279. scipy/optimize/_linprog_util.py +14 -16
  280. scipy/optimize/_lsap.cpython-313-aarch64-linux-musl.so +0 -0
  281. scipy/optimize/_lsq/common.py +3 -3
  282. scipy/optimize/_lsq/dogbox.py +16 -2
  283. scipy/optimize/_lsq/givens_elimination.cpython-313-aarch64-linux-musl.so +0 -0
  284. scipy/optimize/_lsq/least_squares.py +198 -126
  285. scipy/optimize/_lsq/lsq_linear.py +6 -6
  286. scipy/optimize/_lsq/trf.py +35 -8
  287. scipy/optimize/_milp.py +3 -1
  288. scipy/optimize/_minimize.py +105 -36
  289. scipy/optimize/_minpack.cpython-313-aarch64-linux-musl.so +0 -0
  290. scipy/optimize/_minpack_py.py +21 -14
  291. scipy/optimize/_moduleTNC.cpython-313-aarch64-linux-musl.so +0 -0
  292. scipy/optimize/_nnls.py +20 -21
  293. scipy/optimize/_nonlin.py +34 -3
  294. scipy/optimize/_numdiff.py +288 -110
  295. scipy/optimize/_optimize.py +86 -48
  296. scipy/optimize/_pava_pybind.cpython-313-aarch64-linux-musl.so +0 -0
  297. scipy/optimize/_remove_redundancy.py +5 -5
  298. scipy/optimize/_root_scalar.py +1 -1
  299. scipy/optimize/_shgo.py +6 -0
  300. scipy/optimize/_shgo_lib/_complex.py +1 -1
  301. scipy/optimize/_slsqp_py.py +216 -124
  302. scipy/optimize/_slsqplib.cpython-313-aarch64-linux-musl.so +0 -0
  303. scipy/optimize/_spectral.py +1 -1
  304. scipy/optimize/_tnc.py +8 -1
  305. scipy/optimize/_trlib/_trlib.cpython-313-aarch64-linux-musl.so +0 -0
  306. scipy/optimize/_trustregion.py +20 -6
  307. scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
  308. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
  309. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
  310. scipy/optimize/_trustregion_constr/projections.py +12 -8
  311. scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
  312. scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
  313. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
  314. scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
  315. scipy/optimize/_trustregion_exact.py +0 -1
  316. scipy/optimize/_zeros.cpython-313-aarch64-linux-musl.so +0 -0
  317. scipy/optimize/_zeros_py.py +97 -17
  318. scipy/optimize/cython_optimize/_zeros.cpython-313-aarch64-linux-musl.so +0 -0
  319. scipy/optimize/slsqp.py +0 -1
  320. scipy/optimize/tests/test__basinhopping.py +1 -1
  321. scipy/optimize/tests/test__differential_evolution.py +4 -4
  322. scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
  323. scipy/optimize/tests/test__numdiff.py +66 -22
  324. scipy/optimize/tests/test__remove_redundancy.py +2 -2
  325. scipy/optimize/tests/test__shgo.py +9 -1
  326. scipy/optimize/tests/test_bracket.py +36 -46
  327. scipy/optimize/tests/test_chandrupatla.py +133 -135
  328. scipy/optimize/tests/test_cobyla.py +74 -45
  329. scipy/optimize/tests/test_constraints.py +1 -1
  330. scipy/optimize/tests/test_differentiable_functions.py +226 -6
  331. scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
  332. scipy/optimize/tests/test_least_squares.py +125 -13
  333. scipy/optimize/tests/test_linear_assignment.py +3 -3
  334. scipy/optimize/tests/test_linprog.py +3 -3
  335. scipy/optimize/tests/test_lsq_linear.py +6 -6
  336. scipy/optimize/tests/test_minimize_constrained.py +2 -2
  337. scipy/optimize/tests/test_minpack.py +4 -4
  338. scipy/optimize/tests/test_nnls.py +43 -3
  339. scipy/optimize/tests/test_nonlin.py +36 -0
  340. scipy/optimize/tests/test_optimize.py +95 -17
  341. scipy/optimize/tests/test_slsqp.py +36 -4
  342. scipy/optimize/tests/test_zeros.py +34 -1
  343. scipy/signal/__init__.py +12 -23
  344. scipy/signal/_delegators.py +568 -0
  345. scipy/signal/_filter_design.py +459 -241
  346. scipy/signal/_fir_filter_design.py +262 -90
  347. scipy/signal/_lti_conversion.py +3 -2
  348. scipy/signal/_ltisys.py +118 -91
  349. scipy/signal/_max_len_seq_inner.cpython-313-aarch64-linux-musl.so +0 -0
  350. scipy/signal/_peak_finding_utils.cpython-313-aarch64-linux-musl.so +0 -0
  351. scipy/signal/_polyutils.py +172 -0
  352. scipy/signal/_short_time_fft.py +519 -70
  353. scipy/signal/_signal_api.py +30 -0
  354. scipy/signal/_signaltools.py +719 -399
  355. scipy/signal/_sigtools.cpython-313-aarch64-linux-musl.so +0 -0
  356. scipy/signal/_sosfilt.cpython-313-aarch64-linux-musl.so +0 -0
  357. scipy/signal/_spectral_py.py +230 -50
  358. scipy/signal/_spline.cpython-313-aarch64-linux-musl.so +0 -0
  359. scipy/signal/_spline_filters.py +108 -68
  360. scipy/signal/_support_alternative_backends.py +73 -0
  361. scipy/signal/_upfirdn.py +4 -1
  362. scipy/signal/_upfirdn_apply.cpython-313-aarch64-linux-musl.so +0 -0
  363. scipy/signal/_waveforms.py +2 -11
  364. scipy/signal/_wavelets.py +1 -1
  365. scipy/signal/fir_filter_design.py +1 -0
  366. scipy/signal/spline.py +4 -11
  367. scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
  368. scipy/signal/tests/test_bsplines.py +114 -79
  369. scipy/signal/tests/test_cont2discrete.py +9 -2
  370. scipy/signal/tests/test_filter_design.py +721 -481
  371. scipy/signal/tests/test_fir_filter_design.py +332 -140
  372. scipy/signal/tests/test_savitzky_golay.py +4 -3
  373. scipy/signal/tests/test_short_time_fft.py +221 -3
  374. scipy/signal/tests/test_signaltools.py +2144 -1348
  375. scipy/signal/tests/test_spectral.py +50 -6
  376. scipy/signal/tests/test_splines.py +161 -96
  377. scipy/signal/tests/test_upfirdn.py +84 -50
  378. scipy/signal/tests/test_waveforms.py +20 -0
  379. scipy/signal/tests/test_windows.py +607 -466
  380. scipy/signal/windows/_windows.py +287 -148
  381. scipy/sparse/__init__.py +23 -4
  382. scipy/sparse/_base.py +270 -108
  383. scipy/sparse/_bsr.py +7 -4
  384. scipy/sparse/_compressed.py +59 -231
  385. scipy/sparse/_construct.py +90 -38
  386. scipy/sparse/_coo.py +115 -181
  387. scipy/sparse/_csc.py +4 -4
  388. scipy/sparse/_csparsetools.cpython-313-aarch64-linux-musl.so +0 -0
  389. scipy/sparse/_csr.py +2 -2
  390. scipy/sparse/_data.py +48 -48
  391. scipy/sparse/_dia.py +105 -18
  392. scipy/sparse/_dok.py +0 -23
  393. scipy/sparse/_index.py +4 -4
  394. scipy/sparse/_matrix.py +23 -0
  395. scipy/sparse/_sparsetools.cpython-313-aarch64-linux-musl.so +0 -0
  396. scipy/sparse/_sputils.py +37 -22
  397. scipy/sparse/base.py +0 -9
  398. scipy/sparse/bsr.py +0 -14
  399. scipy/sparse/compressed.py +0 -23
  400. scipy/sparse/construct.py +0 -6
  401. scipy/sparse/coo.py +0 -14
  402. scipy/sparse/csc.py +0 -3
  403. scipy/sparse/csgraph/_flow.cpython-313-aarch64-linux-musl.so +0 -0
  404. scipy/sparse/csgraph/_matching.cpython-313-aarch64-linux-musl.so +0 -0
  405. scipy/sparse/csgraph/_min_spanning_tree.cpython-313-aarch64-linux-musl.so +0 -0
  406. scipy/sparse/csgraph/_reordering.cpython-313-aarch64-linux-musl.so +0 -0
  407. scipy/sparse/csgraph/_shortest_path.cpython-313-aarch64-linux-musl.so +0 -0
  408. scipy/sparse/csgraph/_tools.cpython-313-aarch64-linux-musl.so +0 -0
  409. scipy/sparse/csgraph/_traversal.cpython-313-aarch64-linux-musl.so +0 -0
  410. scipy/sparse/csgraph/tests/test_matching.py +14 -2
  411. scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
  412. scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
  413. scipy/sparse/csr.py +0 -5
  414. scipy/sparse/data.py +1 -6
  415. scipy/sparse/dia.py +0 -7
  416. scipy/sparse/dok.py +0 -10
  417. scipy/sparse/linalg/_dsolve/_superlu.cpython-313-aarch64-linux-musl.so +0 -0
  418. scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
  419. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
  420. scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-313-aarch64-linux-musl.so +0 -0
  421. scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
  422. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
  423. scipy/sparse/linalg/_interface.py +17 -18
  424. scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
  425. scipy/sparse/linalg/_isolve/iterative.py +51 -45
  426. scipy/sparse/linalg/_isolve/lgmres.py +6 -6
  427. scipy/sparse/linalg/_isolve/minres.py +5 -5
  428. scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
  429. scipy/sparse/linalg/_isolve/utils.py +2 -8
  430. scipy/sparse/linalg/_matfuncs.py +1 -1
  431. scipy/sparse/linalg/_norm.py +1 -1
  432. scipy/sparse/linalg/_propack/_cpropack.cpython-313-aarch64-linux-musl.so +0 -0
  433. scipy/sparse/linalg/_propack/_dpropack.cpython-313-aarch64-linux-musl.so +0 -0
  434. scipy/sparse/linalg/_propack/_spropack.cpython-313-aarch64-linux-musl.so +0 -0
  435. scipy/sparse/linalg/_propack/_zpropack.cpython-313-aarch64-linux-musl.so +0 -0
  436. scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
  437. scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
  438. scipy/sparse/tests/test_arithmetic1d.py +5 -2
  439. scipy/sparse/tests/test_base.py +214 -42
  440. scipy/sparse/tests/test_common1d.py +7 -7
  441. scipy/sparse/tests/test_construct.py +1 -1
  442. scipy/sparse/tests/test_coo.py +272 -4
  443. scipy/sparse/tests/test_sparsetools.py +5 -0
  444. scipy/sparse/tests/test_sputils.py +36 -7
  445. scipy/spatial/_ckdtree.cpython-313-aarch64-linux-musl.so +0 -0
  446. scipy/spatial/_distance_pybind.cpython-313-aarch64-linux-musl.so +0 -0
  447. scipy/spatial/_distance_wrap.cpython-313-aarch64-linux-musl.so +0 -0
  448. scipy/spatial/_hausdorff.cpython-313-aarch64-linux-musl.so +0 -0
  449. scipy/spatial/_qhull.cpython-313-aarch64-linux-musl.so +0 -0
  450. scipy/spatial/_voronoi.cpython-313-aarch64-linux-musl.so +0 -0
  451. scipy/spatial/distance.py +49 -42
  452. scipy/spatial/tests/test_distance.py +15 -1
  453. scipy/spatial/tests/test_kdtree.py +1 -0
  454. scipy/spatial/tests/test_qhull.py +7 -2
  455. scipy/spatial/transform/__init__.py +5 -3
  456. scipy/spatial/transform/_rigid_transform.cpython-313-aarch64-linux-musl.so +0 -0
  457. scipy/spatial/transform/_rotation.cpython-313-aarch64-linux-musl.so +0 -0
  458. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  459. scipy/spatial/transform/tests/test_rotation.py +1213 -832
  460. scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
  461. scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
  462. scipy/special/__init__.py +1 -47
  463. scipy/special/_add_newdocs.py +34 -772
  464. scipy/special/_basic.py +22 -25
  465. scipy/special/_comb.cpython-313-aarch64-linux-musl.so +0 -0
  466. scipy/special/_ellip_harm_2.cpython-313-aarch64-linux-musl.so +0 -0
  467. scipy/special/_gufuncs.cpython-313-aarch64-linux-musl.so +0 -0
  468. scipy/special/_logsumexp.py +67 -58
  469. scipy/special/_orthogonal.pyi +1 -1
  470. scipy/special/_specfun.cpython-313-aarch64-linux-musl.so +0 -0
  471. scipy/special/_special_ufuncs.cpython-313-aarch64-linux-musl.so +0 -0
  472. scipy/special/_spherical_bessel.py +4 -4
  473. scipy/special/_support_alternative_backends.py +212 -119
  474. scipy/special/_test_internal.cpython-313-aarch64-linux-musl.so +0 -0
  475. scipy/special/_testutils.py +4 -4
  476. scipy/special/_ufuncs.cpython-313-aarch64-linux-musl.so +0 -0
  477. scipy/special/_ufuncs.pyi +1 -0
  478. scipy/special/_ufuncs.pyx +215 -1400
  479. scipy/special/_ufuncs_cxx.cpython-313-aarch64-linux-musl.so +0 -0
  480. scipy/special/_ufuncs_cxx.pxd +2 -15
  481. scipy/special/_ufuncs_cxx.pyx +5 -44
  482. scipy/special/_ufuncs_cxx_defs.h +2 -16
  483. scipy/special/_ufuncs_defs.h +0 -8
  484. scipy/special/cython_special.cpython-313-aarch64-linux-musl.so +0 -0
  485. scipy/special/cython_special.pxd +1 -1
  486. scipy/special/tests/_cython_examples/meson.build +10 -1
  487. scipy/special/tests/test_basic.py +153 -20
  488. scipy/special/tests/test_boost_ufuncs.py +3 -0
  489. scipy/special/tests/test_cdflib.py +35 -11
  490. scipy/special/tests/test_gammainc.py +16 -0
  491. scipy/special/tests/test_hyp2f1.py +2 -2
  492. scipy/special/tests/test_log1mexp.py +85 -0
  493. scipy/special/tests/test_logsumexp.py +206 -64
  494. scipy/special/tests/test_mpmath.py +1 -0
  495. scipy/special/tests/test_nan_inputs.py +1 -1
  496. scipy/special/tests/test_orthogonal.py +17 -18
  497. scipy/special/tests/test_sf_error.py +3 -2
  498. scipy/special/tests/test_sph_harm.py +6 -7
  499. scipy/special/tests/test_support_alternative_backends.py +211 -76
  500. scipy/stats/__init__.py +4 -1
  501. scipy/stats/_ansari_swilk_statistics.cpython-313-aarch64-linux-musl.so +0 -0
  502. scipy/stats/_axis_nan_policy.py +5 -12
  503. scipy/stats/_biasedurn.cpython-313-aarch64-linux-musl.so +0 -0
  504. scipy/stats/_continued_fraction.py +387 -0
  505. scipy/stats/_continuous_distns.py +277 -310
  506. scipy/stats/_correlation.py +1 -1
  507. scipy/stats/_covariance.py +6 -3
  508. scipy/stats/_discrete_distns.py +39 -32
  509. scipy/stats/_distn_infrastructure.py +39 -12
  510. scipy/stats/_distribution_infrastructure.py +900 -238
  511. scipy/stats/_entropy.py +9 -10
  512. scipy/{_lib → stats}/_finite_differences.py +1 -1
  513. scipy/stats/_hypotests.py +83 -50
  514. scipy/stats/_kde.py +53 -49
  515. scipy/stats/_ksstats.py +1 -1
  516. scipy/stats/_levy_stable/__init__.py +7 -15
  517. scipy/stats/_levy_stable/levyst.cpython-313-aarch64-linux-musl.so +0 -0
  518. scipy/stats/_morestats.py +118 -73
  519. scipy/stats/_mstats_basic.py +13 -17
  520. scipy/stats/_mstats_extras.py +8 -8
  521. scipy/stats/_multivariate.py +89 -113
  522. scipy/stats/_new_distributions.py +97 -20
  523. scipy/stats/_page_trend_test.py +12 -5
  524. scipy/stats/_probability_distribution.py +265 -43
  525. scipy/stats/_qmc.py +14 -9
  526. scipy/stats/_qmc_cy.cpython-313-aarch64-linux-musl.so +0 -0
  527. scipy/stats/_qmvnt.py +16 -95
  528. scipy/stats/_qmvnt_cy.cpython-313-aarch64-linux-musl.so +0 -0
  529. scipy/stats/_quantile.py +335 -0
  530. scipy/stats/_rcont/rcont.cpython-313-aarch64-linux-musl.so +0 -0
  531. scipy/stats/_resampling.py +4 -29
  532. scipy/stats/_sampling.py +1 -1
  533. scipy/stats/_sobol.cpython-313-aarch64-linux-musl.so +0 -0
  534. scipy/stats/_stats.cpython-313-aarch64-linux-musl.so +0 -0
  535. scipy/stats/_stats_mstats_common.py +21 -2
  536. scipy/stats/_stats_py.py +550 -476
  537. scipy/stats/_stats_pythran.cpython-313-aarch64-linux-musl.so +0 -0
  538. scipy/stats/_unuran/unuran_wrapper.cpython-313-aarch64-linux-musl.so +0 -0
  539. scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
  540. scipy/stats/_variation.py +6 -8
  541. scipy/stats/_wilcoxon.py +13 -7
  542. scipy/stats/tests/common_tests.py +6 -4
  543. scipy/stats/tests/test_axis_nan_policy.py +62 -24
  544. scipy/stats/tests/test_continued_fraction.py +173 -0
  545. scipy/stats/tests/test_continuous.py +379 -60
  546. scipy/stats/tests/test_continuous_basic.py +18 -12
  547. scipy/stats/tests/test_discrete_basic.py +14 -8
  548. scipy/stats/tests/test_discrete_distns.py +16 -16
  549. scipy/stats/tests/test_distributions.py +95 -75
  550. scipy/stats/tests/test_entropy.py +40 -48
  551. scipy/stats/tests/test_fit.py +4 -3
  552. scipy/stats/tests/test_hypotests.py +153 -24
  553. scipy/stats/tests/test_kdeoth.py +109 -41
  554. scipy/stats/tests/test_marray.py +289 -0
  555. scipy/stats/tests/test_morestats.py +79 -47
  556. scipy/stats/tests/test_mstats_basic.py +3 -3
  557. scipy/stats/tests/test_multivariate.py +434 -83
  558. scipy/stats/tests/test_qmc.py +13 -10
  559. scipy/stats/tests/test_quantile.py +199 -0
  560. scipy/stats/tests/test_rank.py +119 -112
  561. scipy/stats/tests/test_resampling.py +47 -56
  562. scipy/stats/tests/test_sampling.py +9 -4
  563. scipy/stats/tests/test_stats.py +799 -939
  564. scipy/stats/tests/test_variation.py +8 -6
  565. scipy/version.py +2 -2
  566. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
  567. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
  568. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +1262 -1269
  569. scipy.libs/libgcc_s-69c45f16.so.1 +0 -0
  570. scipy.libs/libgfortran-db0b6589.so.5.0.0 +0 -0
  571. scipy.libs/{libstdc++-1b614e01.so.6.0.32 → libstdc++-1f1a71be.so.6.0.33} +0 -0
  572. scipy/_lib/array_api_extra/_funcs.py +0 -484
  573. scipy/_lib/array_api_extra/_typing.py +0 -8
  574. scipy/interpolate/_bspl.cpython-313-aarch64-linux-musl.so +0 -0
  575. scipy/optimize/_cobyla.cpython-313-aarch64-linux-musl.so +0 -0
  576. scipy/optimize/_cython_nnls.cpython-313-aarch64-linux-musl.so +0 -0
  577. scipy/optimize/_slsqp.cpython-313-aarch64-linux-musl.so +0 -0
  578. scipy/spatial/qhull_src/COPYING.txt +0 -38
  579. scipy/special/libsf_error_state.so +0 -0
  580. scipy/special/tests/test_log_softmax.py +0 -109
  581. scipy/special/tests/test_xsf_cuda.py +0 -114
  582. scipy/special/xsf/binom.h +0 -89
  583. scipy/special/xsf/cdflib.h +0 -100
  584. scipy/special/xsf/cephes/airy.h +0 -307
  585. scipy/special/xsf/cephes/besselpoly.h +0 -51
  586. scipy/special/xsf/cephes/beta.h +0 -257
  587. scipy/special/xsf/cephes/cbrt.h +0 -131
  588. scipy/special/xsf/cephes/chbevl.h +0 -85
  589. scipy/special/xsf/cephes/chdtr.h +0 -193
  590. scipy/special/xsf/cephes/const.h +0 -87
  591. scipy/special/xsf/cephes/ellie.h +0 -293
  592. scipy/special/xsf/cephes/ellik.h +0 -251
  593. scipy/special/xsf/cephes/ellpe.h +0 -107
  594. scipy/special/xsf/cephes/ellpk.h +0 -117
  595. scipy/special/xsf/cephes/expn.h +0 -260
  596. scipy/special/xsf/cephes/gamma.h +0 -398
  597. scipy/special/xsf/cephes/hyp2f1.h +0 -596
  598. scipy/special/xsf/cephes/hyperg.h +0 -361
  599. scipy/special/xsf/cephes/i0.h +0 -149
  600. scipy/special/xsf/cephes/i1.h +0 -158
  601. scipy/special/xsf/cephes/igam.h +0 -421
  602. scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
  603. scipy/special/xsf/cephes/igami.h +0 -313
  604. scipy/special/xsf/cephes/j0.h +0 -225
  605. scipy/special/xsf/cephes/j1.h +0 -198
  606. scipy/special/xsf/cephes/jv.h +0 -715
  607. scipy/special/xsf/cephes/k0.h +0 -164
  608. scipy/special/xsf/cephes/k1.h +0 -163
  609. scipy/special/xsf/cephes/kn.h +0 -243
  610. scipy/special/xsf/cephes/lanczos.h +0 -112
  611. scipy/special/xsf/cephes/ndtr.h +0 -275
  612. scipy/special/xsf/cephes/poch.h +0 -85
  613. scipy/special/xsf/cephes/polevl.h +0 -167
  614. scipy/special/xsf/cephes/psi.h +0 -194
  615. scipy/special/xsf/cephes/rgamma.h +0 -111
  616. scipy/special/xsf/cephes/scipy_iv.h +0 -811
  617. scipy/special/xsf/cephes/shichi.h +0 -248
  618. scipy/special/xsf/cephes/sici.h +0 -224
  619. scipy/special/xsf/cephes/sindg.h +0 -221
  620. scipy/special/xsf/cephes/tandg.h +0 -139
  621. scipy/special/xsf/cephes/trig.h +0 -58
  622. scipy/special/xsf/cephes/unity.h +0 -186
  623. scipy/special/xsf/cephes/zeta.h +0 -172
  624. scipy/special/xsf/config.h +0 -304
  625. scipy/special/xsf/digamma.h +0 -205
  626. scipy/special/xsf/error.h +0 -57
  627. scipy/special/xsf/evalpoly.h +0 -47
  628. scipy/special/xsf/expint.h +0 -266
  629. scipy/special/xsf/hyp2f1.h +0 -694
  630. scipy/special/xsf/iv_ratio.h +0 -173
  631. scipy/special/xsf/lambertw.h +0 -150
  632. scipy/special/xsf/loggamma.h +0 -163
  633. scipy/special/xsf/sici.h +0 -200
  634. scipy/special/xsf/tools.h +0 -427
  635. scipy/special/xsf/trig.h +0 -164
  636. scipy/special/xsf/wright_bessel.h +0 -843
  637. scipy/special/xsf/zlog1.h +0 -35
  638. scipy/stats/_mvn.cpython-313-aarch64-linux-musl.so +0 -0
  639. scipy.libs/libgcc_s-7393e603.so.1 +0 -0
  640. scipy.libs/libgfortran-eb933d8e.so.5.0.0 +0 -0
  641. {scipy-1.15.3.dist-info → scipy-1.16.0rc2.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