test_data.py 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679
  1. import importlib.resources
  2. import warnings
  3. import numpy as np
  4. import pytest
  5. from scipy.special import (
  6. lpmv, lqn, lqmn, eval_legendre, eval_hermite,
  7. eval_laguerre, eval_genlaguerre, binom, cbrt, expm1, log1p, zeta,
  8. jn, jv, jvp, yn, yv, yvp, iv, ivp, kn, kv, kvp,
  9. gamma, gammaln, gammainc, gammaincc, gammaincinv, gammainccinv, digamma,
  10. beta, betainc, betaincinv, poch,
  11. ellipe, ellipeinc, ellipk, ellipkm1, ellipkinc,
  12. elliprc, elliprd, elliprf, elliprg, elliprj,
  13. erf, erfc, erfinv, erfcinv, exp1, expi, expn,
  14. bdtrik, btdtria, btdtrib, chndtr, gdtr, gdtrc, gdtrix, gdtrib,
  15. nbdtrik, pdtrik, owens_t,
  16. mathieu_a, mathieu_b, mathieu_cem, mathieu_sem, mathieu_modcem1,
  17. mathieu_modsem1, mathieu_modcem2, mathieu_modsem2,
  18. ellip_harm, ellip_harm_2, spherical_jn, spherical_yn, wright_bessel
  19. )
  20. from scipy.integrate import IntegrationWarning
  21. from scipy.special._testutils import FuncData
  22. # The npz files are generated, and hence may live in the build dir. We can only
  23. # access them through `importlib.resources`, not an explicit path from `__file__`
  24. _datadir = importlib.resources.files('scipy.special.tests.data')
  25. _boost_npz = _datadir.joinpath('boost.npz')
  26. with importlib.resources.as_file(_boost_npz) as f:
  27. DATASETS_BOOST = np.load(f)
  28. _gsl_npz = _datadir.joinpath('gsl.npz')
  29. with importlib.resources.as_file(_gsl_npz) as f:
  30. DATASETS_GSL = np.load(f)
  31. _local_npz = _datadir.joinpath('local.npz')
  32. with importlib.resources.as_file(_local_npz) as f:
  33. DATASETS_LOCAL = np.load(f)
  34. def data(func, dataname, *a, **kw):
  35. kw.setdefault('dataname', dataname)
  36. return FuncData(func, DATASETS_BOOST[dataname], *a, **kw)
  37. def data_gsl(func, dataname, *a, **kw):
  38. kw.setdefault('dataname', dataname)
  39. return FuncData(func, DATASETS_GSL[dataname], *a, **kw)
  40. def data_local(func, dataname, *a, **kw):
  41. kw.setdefault('dataname', dataname)
  42. return FuncData(func, DATASETS_LOCAL[dataname], *a, **kw)
  43. def ellipk_(k):
  44. return ellipk(k*k)
  45. def ellipkinc_(f, k):
  46. return ellipkinc(f, k*k)
  47. def ellipe_(k):
  48. return ellipe(k*k)
  49. def ellipeinc_(f, k):
  50. return ellipeinc(f, k*k)
  51. def zeta_(x):
  52. return zeta(x, 1.)
  53. def assoc_legendre_p_boost_(nu, mu, x):
  54. # the boost test data is for integer orders only
  55. return lpmv(mu, nu.astype(int), x)
  56. def legendre_p_via_assoc_(nu, x):
  57. return lpmv(0, nu, x)
  58. def lqn_(n, x):
  59. return lqn(n.astype('l'), x)[0][-1]
  60. def legendre_q_via_lqmn(n, x):
  61. return lqmn(0, n, x)[0][0,-1]
  62. def mathieu_ce_rad(m, q, x):
  63. return mathieu_cem(m, q, x*180/np.pi)[0]
  64. def mathieu_se_rad(m, q, x):
  65. return mathieu_sem(m, q, x*180/np.pi)[0]
  66. def mathieu_mc1_scaled(m, q, x):
  67. # GSL follows a different normalization.
  68. # We follow Abramowitz & Stegun, they apparently something else.
  69. return mathieu_modcem1(m, q, x)[0] * np.sqrt(np.pi/2)
  70. def mathieu_ms1_scaled(m, q, x):
  71. return mathieu_modsem1(m, q, x)[0] * np.sqrt(np.pi/2)
  72. def mathieu_mc2_scaled(m, q, x):
  73. return mathieu_modcem2(m, q, x)[0] * np.sqrt(np.pi/2)
  74. def mathieu_ms2_scaled(m, q, x):
  75. return mathieu_modsem2(m, q, x)[0] * np.sqrt(np.pi/2)
  76. def eval_legendre_ld(n, x):
  77. return eval_legendre(n.astype('l'), x)
  78. def eval_legendre_dd(n, x):
  79. return eval_legendre(n.astype('d'), x)
  80. def eval_hermite_ld(n, x):
  81. return eval_hermite(n.astype('l'), x)
  82. def eval_laguerre_ld(n, x):
  83. return eval_laguerre(n.astype('l'), x)
  84. def eval_laguerre_dd(n, x):
  85. return eval_laguerre(n.astype('d'), x)
  86. def eval_genlaguerre_ldd(n, a, x):
  87. return eval_genlaguerre(n.astype('l'), a, x)
  88. def eval_genlaguerre_ddd(n, a, x):
  89. return eval_genlaguerre(n.astype('d'), a, x)
  90. def bdtrik_comp(y, n, p):
  91. return bdtrik(1-y, n, p)
  92. def btdtria_comp(p, b, x):
  93. return btdtria(1-p, b, x)
  94. def btdtrib_comp(a, p, x):
  95. return btdtrib(a, 1-p, x)
  96. def gdtr_(p, x):
  97. return gdtr(1.0, p, x)
  98. def gdtrc_(p, x):
  99. return gdtrc(1.0, p, x)
  100. def gdtrix_(b, p):
  101. return gdtrix(1.0, b, p)
  102. def gdtrix_comp(b, p):
  103. return gdtrix(1.0, b, 1-p)
  104. def gdtrib_(p, x):
  105. return gdtrib(1.0, p, x)
  106. def gdtrib_comp(p, x):
  107. return gdtrib(1.0, 1-p, x)
  108. def nbdtrik_comp(y, n, p):
  109. return nbdtrik(1-y, n, p)
  110. def pdtrik_comp(p, m):
  111. return pdtrik(1-p, m)
  112. def poch_(z, m):
  113. return 1.0 / poch(z, m)
  114. def poch_minus(z, m):
  115. return 1.0 / poch(z, -m)
  116. def spherical_jn_(n, x):
  117. return spherical_jn(n.astype('l'), x)
  118. def spherical_yn_(n, x):
  119. return spherical_yn(n.astype('l'), x)
  120. def cexpm1(x, y):
  121. z = expm1(x + 1j*y)
  122. return z.real, z.imag
  123. def clog1p(x, y):
  124. z = log1p(x + 1j*y)
  125. return z.real, z.imag
  126. BOOST_TESTS = [
  127. data(assoc_legendre_p_boost_, 'assoc_legendre_p_ipp-assoc_legendre_p',
  128. (0,1,2), 3, rtol=1e-11),
  129. data(legendre_p_via_assoc_, 'legendre_p_ipp-legendre_p',
  130. (0,1), 2, rtol=1e-11),
  131. data(legendre_p_via_assoc_, 'legendre_p_large_ipp-legendre_p_large',
  132. (0,1), 2, rtol=9.6e-14),
  133. data(eval_legendre_ld, 'legendre_p_ipp-legendre_p',
  134. (0,1), 2, rtol=6e-14),
  135. data(eval_legendre_ld, 'legendre_p_large_ipp-legendre_p_large',
  136. (0,1), 2, rtol=2e-13),
  137. data(eval_legendre_dd, 'legendre_p_ipp-legendre_p',
  138. (0,1), 2, rtol=2e-14),
  139. data(eval_legendre_dd, 'legendre_p_large_ipp-legendre_p_large',
  140. (0,1), 2, rtol=2e-13),
  141. data(lqn_, 'legendre_p_ipp-legendre_p',
  142. (0,1), 3, rtol=2e-14, vectorized=False),
  143. data(lqn_, 'legendre_p_large_ipp-legendre_p_large',
  144. (0,1), 3, rtol=2e-12, vectorized=False),
  145. data(legendre_q_via_lqmn, 'legendre_p_ipp-legendre_p',
  146. (0,1), 3, rtol=2e-14, vectorized=False),
  147. data(legendre_q_via_lqmn, 'legendre_p_large_ipp-legendre_p_large',
  148. (0,1), 3, rtol=2e-12, vectorized=False),
  149. data(beta, 'beta_exp_data_ipp-beta_exp_data',
  150. (0,1), 2, rtol=1e-13),
  151. data(beta, 'beta_exp_data_ipp-beta_exp_data',
  152. (0,1), 2, rtol=1e-13),
  153. data(beta, 'beta_med_data_ipp-beta_med_data',
  154. (0,1), 2, rtol=5e-13),
  155. data(betainc, 'ibeta_small_data_ipp-ibeta_small_data',
  156. (0,1,2), 5, rtol=6e-15),
  157. data(betainc, 'ibeta_data_ipp-ibeta_data',
  158. (0,1,2), 5, rtol=5e-13),
  159. data(betainc, 'ibeta_int_data_ipp-ibeta_int_data',
  160. (0,1,2), 5, rtol=2e-14),
  161. data(betainc, 'ibeta_large_data_ipp-ibeta_large_data',
  162. (0,1,2), 5, rtol=4e-10),
  163. data(betaincinv, 'ibeta_inv_data_ipp-ibeta_inv_data',
  164. (0,1,2), 3, rtol=1e-5),
  165. data(btdtria, 'ibeta_inva_data_ipp-ibeta_inva_data',
  166. (2,0,1), 3, rtol=5e-9),
  167. data(btdtria_comp, 'ibeta_inva_data_ipp-ibeta_inva_data',
  168. (2,0,1), 4, rtol=5e-9),
  169. data(btdtrib, 'ibeta_inva_data_ipp-ibeta_inva_data',
  170. (0,2,1), 5, rtol=5e-9),
  171. data(btdtrib_comp, 'ibeta_inva_data_ipp-ibeta_inva_data',
  172. (0,2,1), 6, rtol=5e-9),
  173. data(binom, 'binomial_data_ipp-binomial_data',
  174. (0,1), 2, rtol=1e-13),
  175. data(binom, 'binomial_large_data_ipp-binomial_large_data',
  176. (0,1), 2, rtol=5e-13),
  177. data(bdtrik, 'binomial_quantile_ipp-binomial_quantile_data',
  178. (2,0,1), 3, rtol=5e-9),
  179. data(bdtrik_comp, 'binomial_quantile_ipp-binomial_quantile_data',
  180. (2,0,1), 4, rtol=5e-9),
  181. data(nbdtrik, 'negative_binomial_quantile_ipp-negative_binomial_quantile_data',
  182. (2,0,1), 3, rtol=4e-9),
  183. data(nbdtrik_comp,
  184. 'negative_binomial_quantile_ipp-negative_binomial_quantile_data',
  185. (2,0,1), 4, rtol=4e-9),
  186. data(pdtrik, 'poisson_quantile_ipp-poisson_quantile_data',
  187. (1,0), 2, rtol=3e-9),
  188. data(pdtrik_comp, 'poisson_quantile_ipp-poisson_quantile_data',
  189. (1,0), 3, rtol=4e-9),
  190. data(cbrt, 'cbrt_data_ipp-cbrt_data', 1, 0),
  191. data(digamma, 'digamma_data_ipp-digamma_data', 0, 1),
  192. data(digamma, 'digamma_data_ipp-digamma_data', 0j, 1),
  193. data(digamma, 'digamma_neg_data_ipp-digamma_neg_data', 0, 1, rtol=2e-13),
  194. data(digamma, 'digamma_neg_data_ipp-digamma_neg_data', 0j, 1, rtol=1e-13),
  195. data(digamma, 'digamma_root_data_ipp-digamma_root_data', 0, 1, rtol=1e-15),
  196. data(digamma, 'digamma_root_data_ipp-digamma_root_data', 0j, 1, rtol=1e-15),
  197. data(digamma, 'digamma_small_data_ipp-digamma_small_data', 0, 1, rtol=1e-15),
  198. data(digamma, 'digamma_small_data_ipp-digamma_small_data', 0j, 1, rtol=1e-14),
  199. data(ellipk_, 'ellint_k_data_ipp-ellint_k_data', 0, 1),
  200. data(ellipkinc_, 'ellint_f_data_ipp-ellint_f_data', (0,1), 2, rtol=1e-14),
  201. data(ellipe_, 'ellint_e_data_ipp-ellint_e_data', 0, 1),
  202. data(ellipeinc_, 'ellint_e2_data_ipp-ellint_e2_data', (0,1), 2, rtol=1e-14),
  203. data(erf, 'erf_data_ipp-erf_data', 0, 1),
  204. data(erf, 'erf_data_ipp-erf_data', 0j, 1, rtol=1e-13),
  205. data(erfc, 'erf_data_ipp-erf_data', 0, 2, rtol=6e-15),
  206. data(erf, 'erf_large_data_ipp-erf_large_data', 0, 1),
  207. data(erf, 'erf_large_data_ipp-erf_large_data', 0j, 1),
  208. data(erfc, 'erf_large_data_ipp-erf_large_data', 0, 2, rtol=4e-14),
  209. data(erf, 'erf_small_data_ipp-erf_small_data', 0, 1),
  210. data(erf, 'erf_small_data_ipp-erf_small_data', 0j, 1, rtol=1e-13),
  211. data(erfc, 'erf_small_data_ipp-erf_small_data', 0, 2),
  212. data(erfinv, 'erf_inv_data_ipp-erf_inv_data', 0, 1),
  213. data(erfcinv, 'erfc_inv_data_ipp-erfc_inv_data', 0, 1),
  214. data(erfcinv, 'erfc_inv_big_data_ipp-erfc_inv_big_data', 0, 1,
  215. param_filter=(lambda s: s > 0)),
  216. data(exp1, 'expint_1_data_ipp-expint_1_data', 1, 2, rtol=1e-13),
  217. data(exp1, 'expint_1_data_ipp-expint_1_data', 1j, 2, rtol=5e-9),
  218. data(expi, 'expinti_data_ipp-expinti_data', 0, 1, rtol=1e-13),
  219. data(expi, 'expinti_data_double_ipp-expinti_data_double', 0, 1, rtol=1e-13),
  220. data(expi, 'expinti_data_long_ipp-expinti_data_long', 0, 1),
  221. data(expn, 'expint_small_data_ipp-expint_small_data', (0,1), 2),
  222. data(expn, 'expint_data_ipp-expint_data', (0,1), 2, rtol=1e-14),
  223. data(gamma, 'test_gamma_data_ipp-near_0', 0, 1),
  224. data(gamma, 'test_gamma_data_ipp-near_1', 0, 1),
  225. data(gamma, 'test_gamma_data_ipp-near_2', 0, 1),
  226. data(gamma, 'test_gamma_data_ipp-near_m10', 0, 1),
  227. data(gamma, 'test_gamma_data_ipp-near_m55', 0, 1, rtol=7e-12),
  228. data(gamma, 'test_gamma_data_ipp-factorials', 0, 1, rtol=4e-14),
  229. data(gamma, 'test_gamma_data_ipp-near_0', 0j, 1, rtol=2e-9),
  230. data(gamma, 'test_gamma_data_ipp-near_1', 0j, 1, rtol=2e-9),
  231. data(gamma, 'test_gamma_data_ipp-near_2', 0j, 1, rtol=2e-9),
  232. data(gamma, 'test_gamma_data_ipp-near_m10', 0j, 1, rtol=2e-9),
  233. data(gamma, 'test_gamma_data_ipp-near_m55', 0j, 1, rtol=2e-9),
  234. data(gamma, 'test_gamma_data_ipp-factorials', 0j, 1, rtol=2e-13),
  235. data(gammaln, 'test_gamma_data_ipp-near_0', 0, 2, rtol=5e-11),
  236. data(gammaln, 'test_gamma_data_ipp-near_1', 0, 2, rtol=5e-11),
  237. data(gammaln, 'test_gamma_data_ipp-near_2', 0, 2, rtol=2e-10),
  238. data(gammaln, 'test_gamma_data_ipp-near_m10', 0, 2, rtol=5e-11),
  239. data(gammaln, 'test_gamma_data_ipp-near_m55', 0, 2, rtol=5e-11),
  240. data(gammaln, 'test_gamma_data_ipp-factorials', 0, 2),
  241. data(gammainc, 'igamma_small_data_ipp-igamma_small_data', (0,1), 5, rtol=5e-15),
  242. data(gammainc, 'igamma_med_data_ipp-igamma_med_data', (0,1), 5, rtol=2e-13),
  243. data(gammainc, 'igamma_int_data_ipp-igamma_int_data', (0,1), 5, rtol=2e-13),
  244. data(gammainc, 'igamma_big_data_ipp-igamma_big_data', (0,1), 5, rtol=1e-12),
  245. data(gdtr_, 'igamma_small_data_ipp-igamma_small_data', (0,1), 5, rtol=1e-13),
  246. data(gdtr_, 'igamma_med_data_ipp-igamma_med_data', (0,1), 5, rtol=2e-13),
  247. data(gdtr_, 'igamma_int_data_ipp-igamma_int_data', (0,1), 5, rtol=2e-13),
  248. data(gdtr_, 'igamma_big_data_ipp-igamma_big_data', (0,1), 5, rtol=2e-9),
  249. data(gammaincc, 'igamma_small_data_ipp-igamma_small_data',
  250. (0,1), 3, rtol=1e-13),
  251. data(gammaincc, 'igamma_med_data_ipp-igamma_med_data',
  252. (0,1), 3, rtol=2e-13),
  253. data(gammaincc, 'igamma_int_data_ipp-igamma_int_data',
  254. (0,1), 3, rtol=4e-14),
  255. data(gammaincc, 'igamma_big_data_ipp-igamma_big_data',
  256. (0,1), 3, rtol=1e-11),
  257. data(gdtrc_, 'igamma_small_data_ipp-igamma_small_data', (0,1), 3, rtol=1e-13),
  258. data(gdtrc_, 'igamma_med_data_ipp-igamma_med_data', (0,1), 3, rtol=2e-13),
  259. data(gdtrc_, 'igamma_int_data_ipp-igamma_int_data', (0,1), 3, rtol=4e-14),
  260. data(gdtrc_, 'igamma_big_data_ipp-igamma_big_data', (0,1), 3, rtol=1e-11),
  261. data(gdtrib_, 'igamma_inva_data_ipp-igamma_inva_data', (1,0), 2, rtol=5e-9),
  262. data(gdtrib_comp, 'igamma_inva_data_ipp-igamma_inva_data', (1,0), 3, rtol=5e-9),
  263. data(poch_, 'tgamma_delta_ratio_data_ipp-tgamma_delta_ratio_data',
  264. (0,1), 2, rtol=2e-13),
  265. data(poch_, 'tgamma_delta_ratio_int_ipp-tgamma_delta_ratio_int',
  266. (0,1), 2,),
  267. data(poch_, 'tgamma_delta_ratio_int2_ipp-tgamma_delta_ratio_int2',
  268. (0,1), 2,),
  269. data(poch_minus, 'tgamma_delta_ratio_data_ipp-tgamma_delta_ratio_data',
  270. (0,1), 3, rtol=2e-13),
  271. data(poch_minus, 'tgamma_delta_ratio_int_ipp-tgamma_delta_ratio_int',
  272. (0,1), 3),
  273. data(poch_minus, 'tgamma_delta_ratio_int2_ipp-tgamma_delta_ratio_int2',
  274. (0,1), 3),
  275. data(eval_hermite_ld, 'hermite_ipp-hermite',
  276. (0,1), 2, rtol=2e-14),
  277. data(eval_laguerre_ld, 'laguerre2_ipp-laguerre2',
  278. (0,1), 2, rtol=7e-12),
  279. data(eval_laguerre_dd, 'laguerre2_ipp-laguerre2',
  280. (0,1), 2, knownfailure='hyp2f1 insufficiently accurate.'),
  281. data(eval_genlaguerre_ldd, 'laguerre3_ipp-laguerre3',
  282. (0,1,2), 3, rtol=2e-13),
  283. data(eval_genlaguerre_ddd, 'laguerre3_ipp-laguerre3',
  284. (0,1,2), 3, knownfailure='hyp2f1 insufficiently accurate.'),
  285. data(log1p, 'log1p_expm1_data_ipp-log1p_expm1_data', 0, 1),
  286. data(expm1, 'log1p_expm1_data_ipp-log1p_expm1_data', 0, 2),
  287. data(iv, 'bessel_i_data_ipp-bessel_i_data',
  288. (0,1), 2, rtol=1e-12),
  289. data(iv, 'bessel_i_data_ipp-bessel_i_data',
  290. (0,1j), 2, rtol=2e-10, atol=1e-306),
  291. data(iv, 'bessel_i_int_data_ipp-bessel_i_int_data',
  292. (0,1), 2, rtol=1e-9),
  293. data(iv, 'bessel_i_int_data_ipp-bessel_i_int_data',
  294. (0,1j), 2, rtol=2e-10),
  295. data(ivp, 'bessel_i_prime_int_data_ipp-bessel_i_prime_int_data',
  296. (0,1), 2, rtol=1.2e-13),
  297. data(ivp, 'bessel_i_prime_int_data_ipp-bessel_i_prime_int_data',
  298. (0,1j), 2, rtol=1.2e-13, atol=1e-300),
  299. data(jn, 'bessel_j_int_data_ipp-bessel_j_int_data', (0,1), 2, rtol=1e-12),
  300. data(jn, 'bessel_j_int_data_ipp-bessel_j_int_data', (0,1j), 2, rtol=1e-12),
  301. data(jn, 'bessel_j_large_data_ipp-bessel_j_large_data', (0,1), 2, rtol=6e-11),
  302. data(jn, 'bessel_j_large_data_ipp-bessel_j_large_data', (0,1j), 2, rtol=6e-11),
  303. data(jv, 'bessel_j_int_data_ipp-bessel_j_int_data', (0,1), 2, rtol=1e-12),
  304. data(jv, 'bessel_j_int_data_ipp-bessel_j_int_data', (0,1j), 2, rtol=1e-12),
  305. data(jv, 'bessel_j_data_ipp-bessel_j_data', (0,1), 2, rtol=1e-12),
  306. data(jv, 'bessel_j_data_ipp-bessel_j_data', (0,1j), 2, rtol=1e-12),
  307. data(jvp, 'bessel_j_prime_int_data_ipp-bessel_j_prime_int_data',
  308. (0,1), 2, rtol=1e-13),
  309. data(jvp, 'bessel_j_prime_int_data_ipp-bessel_j_prime_int_data',
  310. (0,1j), 2, rtol=1e-13),
  311. data(jvp, 'bessel_j_prime_large_data_ipp-bessel_j_prime_large_data',
  312. (0,1), 2, rtol=1e-11),
  313. data(jvp, 'bessel_j_prime_large_data_ipp-bessel_j_prime_large_data',
  314. (0,1j), 2, rtol=2e-11),
  315. data(kn, 'bessel_k_int_data_ipp-bessel_k_int_data', (0,1), 2, rtol=1e-12),
  316. data(kv, 'bessel_k_int_data_ipp-bessel_k_int_data', (0,1), 2, rtol=1e-12),
  317. data(kv, 'bessel_k_int_data_ipp-bessel_k_int_data', (0,1j), 2, rtol=1e-12),
  318. data(kv, 'bessel_k_data_ipp-bessel_k_data', (0,1), 2, rtol=1e-12),
  319. data(kv, 'bessel_k_data_ipp-bessel_k_data', (0,1j), 2, rtol=1e-12),
  320. data(kvp, 'bessel_k_prime_int_data_ipp-bessel_k_prime_int_data',
  321. (0,1), 2, rtol=3e-14),
  322. data(kvp, 'bessel_k_prime_int_data_ipp-bessel_k_prime_int_data',
  323. (0,1j), 2, rtol=3e-14),
  324. data(kvp, 'bessel_k_prime_data_ipp-bessel_k_prime_data', (0,1), 2, rtol=7e-14),
  325. data(kvp, 'bessel_k_prime_data_ipp-bessel_k_prime_data', (0,1j), 2, rtol=7e-14),
  326. data(yn, 'bessel_y01_data_ipp-bessel_y01_data', (0,1), 2, rtol=1e-12),
  327. data(yn, 'bessel_yn_data_ipp-bessel_yn_data', (0,1), 2, rtol=1e-12),
  328. data(yv, 'bessel_yn_data_ipp-bessel_yn_data', (0,1), 2, rtol=1e-12),
  329. data(yv, 'bessel_yn_data_ipp-bessel_yn_data', (0,1j), 2, rtol=1e-12),
  330. data(yv, 'bessel_yv_data_ipp-bessel_yv_data', (0,1), 2, rtol=1e-10),
  331. data(yv, 'bessel_yv_data_ipp-bessel_yv_data', (0,1j), 2, rtol=1e-10),
  332. data(yvp, 'bessel_yv_prime_data_ipp-bessel_yv_prime_data',
  333. (0, 1), 2, rtol=4e-9),
  334. data(yvp, 'bessel_yv_prime_data_ipp-bessel_yv_prime_data',
  335. (0, 1j), 2, rtol=4e-9),
  336. data(zeta_, 'zeta_data_ipp-zeta_data', 0, 1,
  337. param_filter=(lambda s: s > 1)),
  338. data(zeta_, 'zeta_neg_data_ipp-zeta_neg_data', 0, 1,
  339. param_filter=(lambda s: s > 1)),
  340. data(zeta_, 'zeta_1_up_data_ipp-zeta_1_up_data', 0, 1,
  341. param_filter=(lambda s: s > 1)),
  342. data(zeta_, 'zeta_1_below_data_ipp-zeta_1_below_data', 0, 1,
  343. param_filter=(lambda s: s > 1)),
  344. data(gammaincinv, 'gamma_inv_small_data_ipp-gamma_inv_small_data',
  345. (0,1), 2, rtol=1e-11),
  346. data(gammaincinv, 'gamma_inv_data_ipp-gamma_inv_data',
  347. (0,1), 2, rtol=1e-14),
  348. data(gammaincinv, 'gamma_inv_big_data_ipp-gamma_inv_big_data',
  349. (0,1), 2, rtol=1e-11),
  350. data(gammainccinv, 'gamma_inv_small_data_ipp-gamma_inv_small_data',
  351. (0,1), 3, rtol=1e-12),
  352. data(gammainccinv, 'gamma_inv_data_ipp-gamma_inv_data',
  353. (0,1), 3, rtol=1e-14),
  354. data(gammainccinv, 'gamma_inv_big_data_ipp-gamma_inv_big_data',
  355. (0,1), 3, rtol=1e-14),
  356. data(gdtrix_, 'gamma_inv_small_data_ipp-gamma_inv_small_data',
  357. (0,1), 2, rtol=3e-13, knownfailure='gdtrix unflow some points'),
  358. data(gdtrix_, 'gamma_inv_data_ipp-gamma_inv_data',
  359. (0,1), 2, rtol=3e-15),
  360. data(gdtrix_, 'gamma_inv_big_data_ipp-gamma_inv_big_data',
  361. (0,1), 2),
  362. data(gdtrix_comp, 'gamma_inv_small_data_ipp-gamma_inv_small_data',
  363. (0,1), 2, knownfailure='gdtrix bad some points'),
  364. data(gdtrix_comp, 'gamma_inv_data_ipp-gamma_inv_data',
  365. (0,1), 3, rtol=6e-15),
  366. data(gdtrix_comp, 'gamma_inv_big_data_ipp-gamma_inv_big_data',
  367. (0,1), 3),
  368. data(chndtr, 'nccs_ipp-nccs',
  369. (2,0,1), 3, rtol=3e-5),
  370. data(chndtr, 'nccs_big_ipp-nccs_big',
  371. (2,0,1), 3, rtol=5e-4, knownfailure='chndtr inaccurate some points'),
  372. data(spherical_jn_, 'sph_bessel_data_ipp-sph_bessel_data',
  373. (0,1), 2, rtol=1e-13),
  374. data(spherical_yn_, 'sph_neumann_data_ipp-sph_neumann_data',
  375. (0,1), 2, rtol=8e-15),
  376. data(owens_t, 'owens_t_ipp-owens_t',
  377. (0, 1), 2, rtol=5e-14),
  378. data(owens_t, 'owens_t_large_data_ipp-owens_t_large_data',
  379. (0, 1), 2, rtol=8e-12),
  380. # -- test data exists in boost but is not used in scipy --
  381. # ibeta_derivative_data_ipp/ibeta_derivative_data.txt
  382. # ibeta_derivative_int_data_ipp/ibeta_derivative_int_data.txt
  383. # ibeta_derivative_large_data_ipp/ibeta_derivative_large_data.txt
  384. # ibeta_derivative_small_data_ipp/ibeta_derivative_small_data.txt
  385. # bessel_y01_prime_data_ipp/bessel_y01_prime_data.txt
  386. # bessel_yn_prime_data_ipp/bessel_yn_prime_data.txt
  387. # sph_bessel_prime_data_ipp/sph_bessel_prime_data.txt
  388. # sph_neumann_prime_data_ipp/sph_neumann_prime_data.txt
  389. # ellint_d2_data_ipp/ellint_d2_data.txt
  390. # ellint_d_data_ipp/ellint_d_data.txt
  391. # ellint_pi2_data_ipp/ellint_pi2_data.txt
  392. # ellint_pi3_data_ipp/ellint_pi3_data.txt
  393. # ellint_pi3_large_data_ipp/ellint_pi3_large_data.txt
  394. data(elliprc, 'ellint_rc_data_ipp-ellint_rc_data', (0, 1), 2,
  395. rtol=5e-16),
  396. data(elliprd, 'ellint_rd_data_ipp-ellint_rd_data', (0, 1, 2), 3,
  397. rtol=5e-16),
  398. data(elliprd, 'ellint_rd_0xy_ipp-ellint_rd_0xy', (0, 1, 2), 3,
  399. rtol=5e-16),
  400. data(elliprd, 'ellint_rd_0yy_ipp-ellint_rd_0yy', (0, 1, 2), 3,
  401. rtol=5e-16),
  402. data(elliprd, 'ellint_rd_xxx_ipp-ellint_rd_xxx', (0, 1, 2), 3,
  403. rtol=5e-16),
  404. # Some of the following rtol for elliprd may be larger than 5e-16 to
  405. # work around some hard cases in the Boost test where we get slightly
  406. # larger error than the ideal bound when the x (==y) input is close to
  407. # zero.
  408. # Also the accuracy on 32-bit builds with g++ may suffer from excess
  409. # loss of precision; see GCC bugzilla 323
  410. # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=323
  411. data(elliprd, 'ellint_rd_xxz_ipp-ellint_rd_xxz', (0, 1, 2), 3,
  412. rtol=6.5e-16),
  413. data(elliprd, 'ellint_rd_xyy_ipp-ellint_rd_xyy', (0, 1, 2), 3,
  414. rtol=6e-16),
  415. data(elliprf, 'ellint_rf_data_ipp-ellint_rf_data', (0, 1, 2), 3,
  416. rtol=5e-16),
  417. data(elliprf, 'ellint_rf_xxx_ipp-ellint_rf_xxx', (0, 1, 2), 3,
  418. rtol=5e-16),
  419. data(elliprf, 'ellint_rf_xyy_ipp-ellint_rf_xyy', (0, 1, 2), 3,
  420. rtol=5e-16),
  421. data(elliprf, 'ellint_rf_xy0_ipp-ellint_rf_xy0', (0, 1, 2), 3,
  422. rtol=5e-16),
  423. data(elliprf, 'ellint_rf_0yy_ipp-ellint_rf_0yy', (0, 1, 2), 3,
  424. rtol=5e-16),
  425. # The accuracy of R_G is primarily limited by R_D that is used
  426. # internally. It is generally worse than R_D. Notice that we increased
  427. # the rtol for R_G here. The cases with duplicate arguments are
  428. # slightly less likely to be unbalanced (at least two arguments are
  429. # already balanced) so the error bound is slightly better. Again,
  430. # precision with g++ 32-bit is even worse.
  431. data(elliprg, 'ellint_rg_ipp-ellint_rg', (0, 1, 2), 3,
  432. rtol=8.0e-16),
  433. data(elliprg, 'ellint_rg_xxx_ipp-ellint_rg_xxx', (0, 1, 2), 3,
  434. rtol=6e-16),
  435. data(elliprg, 'ellint_rg_xyy_ipp-ellint_rg_xyy', (0, 1, 2), 3,
  436. rtol=7.5e-16),
  437. data(elliprg, 'ellint_rg_xy0_ipp-ellint_rg_xy0', (0, 1, 2), 3,
  438. rtol=5e-16),
  439. data(elliprg, 'ellint_rg_00x_ipp-ellint_rg_00x', (0, 1, 2), 3,
  440. rtol=5e-16),
  441. data(elliprj, 'ellint_rj_data_ipp-ellint_rj_data', (0, 1, 2, 3), 4,
  442. rtol=5e-16, atol=1e-25,
  443. param_filter=(lambda s: s <= 5e-26,)),
  444. # ellint_rc_data_ipp/ellint_rc_data.txt
  445. # ellint_rd_0xy_ipp/ellint_rd_0xy.txt
  446. # ellint_rd_0yy_ipp/ellint_rd_0yy.txt
  447. # ellint_rd_data_ipp/ellint_rd_data.txt
  448. # ellint_rd_xxx_ipp/ellint_rd_xxx.txt
  449. # ellint_rd_xxz_ipp/ellint_rd_xxz.txt
  450. # ellint_rd_xyy_ipp/ellint_rd_xyy.txt
  451. # ellint_rf_0yy_ipp/ellint_rf_0yy.txt
  452. # ellint_rf_data_ipp/ellint_rf_data.txt
  453. # ellint_rf_xxx_ipp/ellint_rf_xxx.txt
  454. # ellint_rf_xy0_ipp/ellint_rf_xy0.txt
  455. # ellint_rf_xyy_ipp/ellint_rf_xyy.txt
  456. # ellint_rg_00x_ipp/ellint_rg_00x.txt
  457. # ellint_rg_ipp/ellint_rg.txt
  458. # ellint_rg_xxx_ipp/ellint_rg_xxx.txt
  459. # ellint_rg_xy0_ipp/ellint_rg_xy0.txt
  460. # ellint_rg_xyy_ipp/ellint_rg_xyy.txt
  461. # ellint_rj_data_ipp/ellint_rj_data.txt
  462. # ellint_rj_e2_ipp/ellint_rj_e2.txt
  463. # ellint_rj_e3_ipp/ellint_rj_e3.txt
  464. # ellint_rj_e4_ipp/ellint_rj_e4.txt
  465. # ellint_rj_zp_ipp/ellint_rj_zp.txt
  466. # jacobi_elliptic_ipp/jacobi_elliptic.txt
  467. # jacobi_elliptic_small_ipp/jacobi_elliptic_small.txt
  468. # jacobi_large_phi_ipp/jacobi_large_phi.txt
  469. # jacobi_near_1_ipp/jacobi_near_1.txt
  470. # jacobi_zeta_big_phi_ipp/jacobi_zeta_big_phi.txt
  471. # jacobi_zeta_data_ipp/jacobi_zeta_data.txt
  472. # heuman_lambda_data_ipp/heuman_lambda_data.txt
  473. # hypergeometric_0F2_ipp/hypergeometric_0F2.txt
  474. # hypergeometric_1F1_big_ipp/hypergeometric_1F1_big.txt
  475. # hypergeometric_1F1_ipp/hypergeometric_1F1.txt
  476. # hypergeometric_1F1_small_random_ipp/hypergeometric_1F1_small_random.txt
  477. # hypergeometric_1F2_ipp/hypergeometric_1F2.txt
  478. # hypergeometric_1f1_large_regularized_ipp/hypergeometric_1f1_large_regularized.txt # noqa: E501
  479. # hypergeometric_1f1_log_large_unsolved_ipp/hypergeometric_1f1_log_large_unsolved.txt # noqa: E501
  480. # hypergeometric_2F0_half_ipp/hypergeometric_2F0_half.txt
  481. # hypergeometric_2F0_integer_a2_ipp/hypergeometric_2F0_integer_a2.txt
  482. # hypergeometric_2F0_ipp/hypergeometric_2F0.txt
  483. # hypergeometric_2F0_large_z_ipp/hypergeometric_2F0_large_z.txt
  484. # hypergeometric_2F1_ipp/hypergeometric_2F1.txt
  485. # hypergeometric_2F2_ipp/hypergeometric_2F2.txt
  486. # ncbeta_big_ipp/ncbeta_big.txt
  487. # nct_small_delta_ipp/nct_small_delta.txt
  488. # nct_asym_ipp/nct_asym.txt
  489. # ncbeta_ipp/ncbeta.txt
  490. # powm1_data_ipp/powm1_big_data.txt
  491. # powm1_sqrtp1m1_test_hpp/sqrtp1m1_data.txt
  492. # sinc_data_ipp/sinc_data.txt
  493. # test_gamma_data_ipp/gammap1m1_data.txt
  494. # tgamma_ratio_data_ipp/tgamma_ratio_data.txt
  495. # trig_data_ipp/trig_data.txt
  496. # trig_data2_ipp/trig_data2.txt
  497. ]
  498. @pytest.mark.parametrize('test', BOOST_TESTS, ids=repr)
  499. def test_boost(test):
  500. _test_factory(test)
  501. GSL_TESTS = [
  502. data_gsl(mathieu_a, 'mathieu_ab', (0, 1), 2, rtol=1e-13, atol=1e-13),
  503. data_gsl(mathieu_b, 'mathieu_ab', (0, 1), 3, rtol=1e-13, atol=1e-13),
  504. # Also the GSL output has limited accuracy...
  505. data_gsl(mathieu_ce_rad, 'mathieu_ce_se', (0, 1, 2), 3, rtol=1e-7, atol=1e-13),
  506. data_gsl(mathieu_se_rad, 'mathieu_ce_se', (0, 1, 2), 4, rtol=1e-7, atol=1e-13),
  507. data_gsl(mathieu_mc1_scaled, 'mathieu_mc_ms',
  508. (0, 1, 2), 3, rtol=1e-7, atol=1e-13),
  509. data_gsl(mathieu_ms1_scaled, 'mathieu_mc_ms',
  510. (0, 1, 2), 4, rtol=1e-7, atol=1e-13),
  511. data_gsl(mathieu_mc2_scaled, 'mathieu_mc_ms',
  512. (0, 1, 2), 5, rtol=1e-7, atol=1e-13),
  513. data_gsl(mathieu_ms2_scaled, 'mathieu_mc_ms',
  514. (0, 1, 2), 6, rtol=1e-7, atol=1e-13),
  515. ]
  516. @pytest.mark.parametrize('test', GSL_TESTS, ids=repr)
  517. def test_gsl(test):
  518. _test_factory(test)
  519. LOCAL_TESTS = [
  520. data_local(ellipkinc, 'ellipkinc_neg_m', (0, 1), 2),
  521. data_local(ellipkm1, 'ellipkm1', 0, 1),
  522. data_local(ellipeinc, 'ellipeinc_neg_m', (0, 1), 2),
  523. data_local(clog1p, 'log1p_expm1_complex', (0,1), (2,3), rtol=1e-14),
  524. data_local(cexpm1, 'log1p_expm1_complex', (0,1), (4,5), rtol=1e-14),
  525. data_local(gammainc, 'gammainc', (0, 1), 2, rtol=1e-12),
  526. data_local(gammaincc, 'gammaincc', (0, 1), 2, rtol=1e-11),
  527. data_local(ellip_harm_2, 'ellip',(0, 1, 2, 3, 4), 6, rtol=1e-10, atol=1e-13),
  528. data_local(ellip_harm, 'ellip',(0, 1, 2, 3, 4), 5, rtol=1e-10, atol=1e-13),
  529. data_local(wright_bessel, 'wright_bessel', (0, 1, 2), 3, rtol=1e-11),
  530. ]
  531. @pytest.mark.parametrize('test', LOCAL_TESTS, ids=repr)
  532. def test_local(test):
  533. _test_factory(test)
  534. def _test_factory(test, dtype=np.float64):
  535. """Boost test"""
  536. with warnings.catch_warnings():
  537. msg = "The occurrence of roundoff error is detected"
  538. warnings.filterwarnings("ignore", msg, IntegrationWarning)
  539. with np.errstate(all='ignore'):
  540. test.check(dtype=dtype)