test_data.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  1. from __future__ import division, print_function, absolute_import
  2. import os
  3. import numpy as np
  4. from numpy import arccosh, arcsinh, arctanh
  5. from scipy._lib._numpy_compat import suppress_warnings
  6. import pytest
  7. from scipy.special import (
  8. lpn, lpmn, lpmv, lqn, lqmn, sph_harm, eval_legendre, eval_hermite,
  9. eval_laguerre, eval_genlaguerre, binom, cbrt, expm1, log1p, zeta,
  10. jn, jv, yn, yv, iv, kv, kn,
  11. gamma, gammaln, gammainc, gammaincc, gammaincinv, gammainccinv, digamma,
  12. beta, betainc, betaincinv, poch,
  13. ellipe, ellipeinc, ellipk, ellipkm1, ellipkinc, ellipj,
  14. erf, erfc, erfinv, erfcinv, exp1, expi, expn,
  15. bdtrik, btdtr, btdtri, btdtria, btdtrib, chndtr, gdtr, gdtrc, gdtrix, gdtrib,
  16. nbdtrik, pdtrik, owens_t,
  17. mathieu_a, mathieu_b, mathieu_cem, mathieu_sem, mathieu_modcem1,
  18. mathieu_modsem1, mathieu_modcem2, mathieu_modsem2,
  19. ellip_harm, ellip_harm_2, spherical_jn, spherical_yn,
  20. )
  21. from scipy.integrate import IntegrationWarning
  22. from scipy.special._testutils import FuncData
  23. DATASETS_BOOST = np.load(os.path.join(os.path.dirname(__file__),
  24. "data", "boost.npz"))
  25. DATASETS_GSL = np.load(os.path.join(os.path.dirname(__file__),
  26. "data", "gsl.npz"))
  27. DATASETS_LOCAL = np.load(os.path.join(os.path.dirname(__file__),
  28. "data", "local.npz"))
  29. def data(func, dataname, *a, **kw):
  30. kw.setdefault('dataname', dataname)
  31. return FuncData(func, DATASETS_BOOST[dataname], *a, **kw)
  32. def data_gsl(func, dataname, *a, **kw):
  33. kw.setdefault('dataname', dataname)
  34. return FuncData(func, DATASETS_GSL[dataname], *a, **kw)
  35. def data_local(func, dataname, *a, **kw):
  36. kw.setdefault('dataname', dataname)
  37. return FuncData(func, DATASETS_LOCAL[dataname], *a, **kw)
  38. def ellipk_(k):
  39. return ellipk(k*k)
  40. def ellipkinc_(f, k):
  41. return ellipkinc(f, k*k)
  42. def ellipe_(k):
  43. return ellipe(k*k)
  44. def ellipeinc_(f, k):
  45. return ellipeinc(f, k*k)
  46. def ellipj_(k):
  47. return ellipj(k*k)
  48. def zeta_(x):
  49. return zeta(x, 1.)
  50. def assoc_legendre_p_boost_(nu, mu, x):
  51. # the boost test data is for integer orders only
  52. return lpmv(mu, nu.astype(int), x)
  53. def legendre_p_via_assoc_(nu, x):
  54. return lpmv(0, nu, x)
  55. def lpn_(n, x):
  56. return lpn(n.astype('l'), x)[0][-1]
  57. def lqn_(n, x):
  58. return lqn(n.astype('l'), x)[0][-1]
  59. def legendre_p_via_lpmn(n, x):
  60. return lpmn(0, n, x)[0][0,-1]
  61. def legendre_q_via_lqmn(n, x):
  62. return lqmn(0, n, x)[0][0,-1]
  63. def mathieu_ce_rad(m, q, x):
  64. return mathieu_cem(m, q, x*180/np.pi)[0]
  65. def mathieu_se_rad(m, q, x):
  66. return mathieu_sem(m, q, x*180/np.pi)[0]
  67. def mathieu_mc1_scaled(m, q, x):
  68. # GSL follows a different normalization.
  69. # We follow Abramowitz & Stegun, they apparently something else.
  70. return mathieu_modcem1(m, q, x)[0] * np.sqrt(np.pi/2)
  71. def mathieu_ms1_scaled(m, q, x):
  72. return mathieu_modsem1(m, q, x)[0] * np.sqrt(np.pi/2)
  73. def mathieu_mc2_scaled(m, q, x):
  74. return mathieu_modcem2(m, q, x)[0] * np.sqrt(np.pi/2)
  75. def mathieu_ms2_scaled(m, q, x):
  76. return mathieu_modsem2(m, q, x)[0] * np.sqrt(np.pi/2)
  77. def eval_legendre_ld(n, x):
  78. return eval_legendre(n.astype('l'), x)
  79. def eval_legendre_dd(n, x):
  80. return eval_legendre(n.astype('d'), x)
  81. def eval_hermite_ld(n, x):
  82. return eval_hermite(n.astype('l'), x)
  83. def eval_laguerre_ld(n, x):
  84. return eval_laguerre(n.astype('l'), x)
  85. def eval_laguerre_dd(n, x):
  86. return eval_laguerre(n.astype('d'), x)
  87. def eval_genlaguerre_ldd(n, a, x):
  88. return eval_genlaguerre(n.astype('l'), a, x)
  89. def eval_genlaguerre_ddd(n, a, x):
  90. return eval_genlaguerre(n.astype('d'), a, x)
  91. def bdtrik_comp(y, n, p):
  92. return bdtrik(1-y, n, p)
  93. def btdtri_comp(a, b, p):
  94. return btdtri(a, b, 1-p)
  95. def btdtria_comp(p, b, x):
  96. return btdtria(1-p, b, x)
  97. def btdtrib_comp(a, p, x):
  98. return btdtrib(a, 1-p, x)
  99. def gdtr_(p, x):
  100. return gdtr(1.0, p, x)
  101. def gdtrc_(p, x):
  102. return gdtrc(1.0, p, x)
  103. def gdtrix_(b, p):
  104. return gdtrix(1.0, b, p)
  105. def gdtrix_comp(b, p):
  106. return gdtrix(1.0, b, 1-p)
  107. def gdtrib_(p, x):
  108. return gdtrib(1.0, p, x)
  109. def gdtrib_comp(p, x):
  110. return gdtrib(1.0, 1-p, x)
  111. def nbdtrik_comp(y, n, p):
  112. return nbdtrik(1-y, n, p)
  113. def pdtrik_comp(p, m):
  114. return pdtrik(1-p, m)
  115. def poch_(z, m):
  116. return 1.0 / poch(z, m)
  117. def poch_minus(z, m):
  118. return 1.0 / poch(z, -m)
  119. def spherical_jn_(n, x):
  120. return spherical_jn(n.astype('l'), x)
  121. def spherical_yn_(n, x):
  122. return spherical_yn(n.astype('l'), x)
  123. def sph_harm_(m, n, theta, phi):
  124. y = sph_harm(m, n, theta, phi)
  125. return (y.real, y.imag)
  126. def cexpm1(x, y):
  127. z = expm1(x + 1j*y)
  128. return z.real, z.imag
  129. def clog1p(x, y):
  130. z = log1p(x + 1j*y)
  131. return z.real, z.imag
  132. BOOST_TESTS = [
  133. data(arccosh, 'acosh_data_ipp-acosh_data', 0, 1, rtol=5e-13),
  134. data(arccosh, 'acosh_data_ipp-acosh_data', 0j, 1, rtol=5e-13),
  135. data(arcsinh, 'asinh_data_ipp-asinh_data', 0, 1, rtol=1e-11),
  136. data(arcsinh, 'asinh_data_ipp-asinh_data', 0j, 1, rtol=1e-11),
  137. data(arctanh, 'atanh_data_ipp-atanh_data', 0, 1, rtol=1e-11),
  138. data(arctanh, 'atanh_data_ipp-atanh_data', 0j, 1, rtol=1e-11),
  139. data(assoc_legendre_p_boost_, 'assoc_legendre_p_ipp-assoc_legendre_p', (0,1,2), 3, rtol=1e-11),
  140. data(legendre_p_via_assoc_, 'legendre_p_ipp-legendre_p', (0,1), 2, rtol=1e-11),
  141. data(legendre_p_via_assoc_, 'legendre_p_large_ipp-legendre_p_large', (0,1), 2, rtol=7e-14),
  142. data(legendre_p_via_lpmn, 'legendre_p_ipp-legendre_p', (0,1), 2, rtol=5e-14, vectorized=False),
  143. data(legendre_p_via_lpmn, 'legendre_p_large_ipp-legendre_p_large', (0,1), 2, rtol=7e-14, vectorized=False),
  144. data(lpn_, 'legendre_p_ipp-legendre_p', (0,1), 2, rtol=5e-14, vectorized=False),
  145. data(lpn_, 'legendre_p_large_ipp-legendre_p_large', (0,1), 2, rtol=3e-13, vectorized=False),
  146. data(eval_legendre_ld, 'legendre_p_ipp-legendre_p', (0,1), 2, rtol=6e-14),
  147. data(eval_legendre_ld, 'legendre_p_large_ipp-legendre_p_large', (0,1), 2, rtol=2e-13),
  148. data(eval_legendre_dd, 'legendre_p_ipp-legendre_p', (0,1), 2, rtol=2e-14),
  149. data(eval_legendre_dd, 'legendre_p_large_ipp-legendre_p_large', (0,1), 2, rtol=2e-13),
  150. data(lqn_, 'legendre_p_ipp-legendre_p', (0,1), 3, rtol=2e-14, vectorized=False),
  151. data(lqn_, 'legendre_p_large_ipp-legendre_p_large', (0,1), 3, rtol=2e-12, vectorized=False),
  152. data(legendre_q_via_lqmn, 'legendre_p_ipp-legendre_p', (0,1), 3, rtol=2e-14, vectorized=False),
  153. data(legendre_q_via_lqmn, 'legendre_p_large_ipp-legendre_p_large', (0,1), 3, rtol=2e-12, vectorized=False),
  154. data(beta, 'beta_exp_data_ipp-beta_exp_data', (0,1), 2, rtol=1e-13),
  155. data(beta, 'beta_exp_data_ipp-beta_exp_data', (0,1), 2, rtol=1e-13),
  156. data(beta, 'beta_small_data_ipp-beta_small_data', (0,1), 2),
  157. data(beta, 'beta_med_data_ipp-beta_med_data', (0,1), 2, rtol=5e-13),
  158. data(betainc, 'ibeta_small_data_ipp-ibeta_small_data', (0,1,2), 5, rtol=6e-15),
  159. data(betainc, 'ibeta_data_ipp-ibeta_data', (0,1,2), 5, rtol=5e-13),
  160. data(betainc, 'ibeta_int_data_ipp-ibeta_int_data', (0,1,2), 5, rtol=2e-14),
  161. data(betainc, 'ibeta_large_data_ipp-ibeta_large_data', (0,1,2), 5, rtol=4e-10),
  162. data(betaincinv, 'ibeta_inv_data_ipp-ibeta_inv_data', (0,1,2), 3, rtol=1e-5),
  163. data(btdtr, 'ibeta_small_data_ipp-ibeta_small_data', (0,1,2), 5, rtol=6e-15),
  164. data(btdtr, 'ibeta_data_ipp-ibeta_data', (0,1,2), 5, rtol=4e-13),
  165. data(btdtr, 'ibeta_int_data_ipp-ibeta_int_data', (0,1,2), 5, rtol=2e-14),
  166. data(btdtr, 'ibeta_large_data_ipp-ibeta_large_data', (0,1,2), 5, rtol=4e-10),
  167. data(btdtri, 'ibeta_inv_data_ipp-ibeta_inv_data', (0,1,2), 3, rtol=1e-5),
  168. data(btdtri_comp, 'ibeta_inv_data_ipp-ibeta_inv_data', (0,1,2), 4, rtol=8e-7),
  169. data(btdtria, 'ibeta_inva_data_ipp-ibeta_inva_data', (2,0,1), 3, rtol=5e-9),
  170. data(btdtria_comp, 'ibeta_inva_data_ipp-ibeta_inva_data', (2,0,1), 4, rtol=5e-9),
  171. data(btdtrib, 'ibeta_inva_data_ipp-ibeta_inva_data', (0,2,1), 5, rtol=5e-9),
  172. data(btdtrib_comp, 'ibeta_inva_data_ipp-ibeta_inva_data', (0,2,1), 6, rtol=5e-9),
  173. data(binom, 'binomial_data_ipp-binomial_data', (0,1), 2, rtol=1e-13),
  174. data(binom, 'binomial_large_data_ipp-binomial_large_data', (0,1), 2, rtol=5e-13),
  175. data(bdtrik, 'binomial_quantile_ipp-binomial_quantile_data', (2,0,1), 3, rtol=5e-9),
  176. data(bdtrik_comp, 'binomial_quantile_ipp-binomial_quantile_data', (2,0,1), 4, rtol=5e-9),
  177. data(nbdtrik, 'negative_binomial_quantile_ipp-negative_binomial_quantile_data', (2,0,1), 3, rtol=4e-9),
  178. data(nbdtrik_comp, 'negative_binomial_quantile_ipp-negative_binomial_quantile_data', (2,0,1), 4, rtol=4e-9),
  179. data(pdtrik, 'poisson_quantile_ipp-poisson_quantile_data', (1,0), 2, rtol=3e-9),
  180. data(pdtrik_comp, 'poisson_quantile_ipp-poisson_quantile_data', (1,0), 3, rtol=4e-9),
  181. data(cbrt, 'cbrt_data_ipp-cbrt_data', 1, 0),
  182. data(digamma, 'digamma_data_ipp-digamma_data', 0, 1),
  183. data(digamma, 'digamma_data_ipp-digamma_data', 0j, 1),
  184. data(digamma, 'digamma_neg_data_ipp-digamma_neg_data', 0, 1, rtol=2e-13),
  185. data(digamma, 'digamma_neg_data_ipp-digamma_neg_data', 0j, 1, rtol=1e-13),
  186. data(digamma, 'digamma_root_data_ipp-digamma_root_data', 0, 1, rtol=1e-15),
  187. data(digamma, 'digamma_root_data_ipp-digamma_root_data', 0j, 1, rtol=1e-15),
  188. data(digamma, 'digamma_small_data_ipp-digamma_small_data', 0, 1, rtol=1e-15),
  189. data(digamma, 'digamma_small_data_ipp-digamma_small_data', 0j, 1, rtol=1e-14),
  190. data(ellipk_, 'ellint_k_data_ipp-ellint_k_data', 0, 1),
  191. data(ellipkinc_, 'ellint_f_data_ipp-ellint_f_data', (0,1), 2, rtol=1e-14),
  192. data(ellipe_, 'ellint_e_data_ipp-ellint_e_data', 0, 1),
  193. data(ellipeinc_, 'ellint_e2_data_ipp-ellint_e2_data', (0,1), 2, rtol=1e-14),
  194. data(erf, 'erf_data_ipp-erf_data', 0, 1),
  195. data(erf, 'erf_data_ipp-erf_data', 0j, 1, rtol=1e-13),
  196. data(erfc, 'erf_data_ipp-erf_data', 0, 2, rtol=6e-15),
  197. data(erf, 'erf_large_data_ipp-erf_large_data', 0, 1),
  198. data(erf, 'erf_large_data_ipp-erf_large_data', 0j, 1),
  199. data(erfc, 'erf_large_data_ipp-erf_large_data', 0, 2, rtol=4e-14),
  200. data(erf, 'erf_small_data_ipp-erf_small_data', 0, 1),
  201. data(erf, 'erf_small_data_ipp-erf_small_data', 0j, 1, rtol=1e-13),
  202. data(erfc, 'erf_small_data_ipp-erf_small_data', 0, 2),
  203. data(erfinv, 'erf_inv_data_ipp-erf_inv_data', 0, 1),
  204. data(erfcinv, 'erfc_inv_data_ipp-erfc_inv_data', 0, 1),
  205. data(erfcinv, 'erfc_inv_big_data_ipp-erfc_inv_big_data2', 0, 1),
  206. data(exp1, 'expint_1_data_ipp-expint_1_data', 1, 2, rtol=1e-13),
  207. data(exp1, 'expint_1_data_ipp-expint_1_data', 1j, 2, rtol=5e-9),
  208. data(expi, 'expinti_data_ipp-expinti_data', 0, 1, rtol=1e-13),
  209. data(expi, 'expinti_data_double_ipp-expinti_data_double', 0, 1, rtol=1e-13),
  210. data(expn, 'expint_small_data_ipp-expint_small_data', (0,1), 2),
  211. data(expn, 'expint_data_ipp-expint_data', (0,1), 2, rtol=1e-14),
  212. data(gamma, 'test_gamma_data_ipp-near_0', 0, 1),
  213. data(gamma, 'test_gamma_data_ipp-near_1', 0, 1),
  214. data(gamma, 'test_gamma_data_ipp-near_2', 0, 1),
  215. data(gamma, 'test_gamma_data_ipp-near_m10', 0, 1),
  216. data(gamma, 'test_gamma_data_ipp-near_m55', 0, 1, rtol=7e-12),
  217. data(gamma, 'test_gamma_data_ipp-factorials', 0, 1, rtol=4e-14),
  218. data(gamma, 'test_gamma_data_ipp-near_0', 0j, 1, rtol=2e-9),
  219. data(gamma, 'test_gamma_data_ipp-near_1', 0j, 1, rtol=2e-9),
  220. data(gamma, 'test_gamma_data_ipp-near_2', 0j, 1, rtol=2e-9),
  221. data(gamma, 'test_gamma_data_ipp-near_m10', 0j, 1, rtol=2e-9),
  222. data(gamma, 'test_gamma_data_ipp-near_m55', 0j, 1, rtol=2e-9),
  223. data(gamma, 'test_gamma_data_ipp-factorials', 0j, 1, rtol=2e-13),
  224. data(gammaln, 'test_gamma_data_ipp-near_0', 0, 2, rtol=5e-11),
  225. data(gammaln, 'test_gamma_data_ipp-near_1', 0, 2, rtol=5e-11),
  226. data(gammaln, 'test_gamma_data_ipp-near_2', 0, 2, rtol=2e-10),
  227. data(gammaln, 'test_gamma_data_ipp-near_m10', 0, 2, rtol=5e-11),
  228. data(gammaln, 'test_gamma_data_ipp-near_m55', 0, 2, rtol=5e-11),
  229. data(gammaln, 'test_gamma_data_ipp-factorials', 0, 2),
  230. data(gammainc, 'igamma_small_data_ipp-igamma_small_data', (0,1), 5, rtol=5e-15),
  231. data(gammainc, 'igamma_med_data_ipp-igamma_med_data', (0,1), 5, rtol=2e-13),
  232. data(gammainc, 'igamma_int_data_ipp-igamma_int_data', (0,1), 5, rtol=2e-13),
  233. data(gammainc, 'igamma_big_data_ipp-igamma_big_data', (0,1), 5, rtol=1e-12),
  234. data(gdtr_, 'igamma_small_data_ipp-igamma_small_data', (0,1), 5, rtol=1e-13),
  235. data(gdtr_, 'igamma_med_data_ipp-igamma_med_data', (0,1), 5, rtol=2e-13),
  236. data(gdtr_, 'igamma_int_data_ipp-igamma_int_data', (0,1), 5, rtol=2e-13),
  237. data(gdtr_, 'igamma_big_data_ipp-igamma_big_data', (0,1), 5, rtol=2e-9),
  238. data(gammaincc, 'igamma_small_data_ipp-igamma_small_data', (0,1), 3, rtol=1e-13),
  239. data(gammaincc, 'igamma_med_data_ipp-igamma_med_data', (0,1), 3, rtol=2e-13),
  240. data(gammaincc, 'igamma_int_data_ipp-igamma_int_data', (0,1), 3, rtol=4e-14),
  241. data(gammaincc, 'igamma_big_data_ipp-igamma_big_data', (0,1), 3, rtol=1e-11),
  242. data(gdtrc_, 'igamma_small_data_ipp-igamma_small_data', (0,1), 3, rtol=1e-13),
  243. data(gdtrc_, 'igamma_med_data_ipp-igamma_med_data', (0,1), 3, rtol=2e-13),
  244. data(gdtrc_, 'igamma_int_data_ipp-igamma_int_data', (0,1), 3, rtol=4e-14),
  245. data(gdtrc_, 'igamma_big_data_ipp-igamma_big_data', (0,1), 3, rtol=1e-11),
  246. data(gdtrib_, 'igamma_inva_data_ipp-igamma_inva_data', (1,0), 2, rtol=5e-9),
  247. data(gdtrib_comp, 'igamma_inva_data_ipp-igamma_inva_data', (1,0), 3, rtol=5e-9),
  248. data(poch_, 'tgamma_delta_ratio_data_ipp-tgamma_delta_ratio_data', (0,1), 2, rtol=2e-13),
  249. data(poch_, 'tgamma_delta_ratio_int_ipp-tgamma_delta_ratio_int', (0,1), 2,),
  250. data(poch_, 'tgamma_delta_ratio_int2_ipp-tgamma_delta_ratio_int2', (0,1), 2,),
  251. data(poch_minus, 'tgamma_delta_ratio_data_ipp-tgamma_delta_ratio_data', (0,1), 3, rtol=2e-13),
  252. data(poch_minus, 'tgamma_delta_ratio_int_ipp-tgamma_delta_ratio_int', (0,1), 3),
  253. data(poch_minus, 'tgamma_delta_ratio_int2_ipp-tgamma_delta_ratio_int2', (0,1), 3),
  254. data(eval_hermite_ld, 'hermite_ipp-hermite', (0,1), 2, rtol=2e-14),
  255. data(eval_laguerre_ld, 'laguerre2_ipp-laguerre2', (0,1), 2, rtol=7e-12),
  256. data(eval_laguerre_dd, 'laguerre2_ipp-laguerre2', (0,1), 2, knownfailure='hyp2f1 insufficiently accurate.'),
  257. data(eval_genlaguerre_ldd, 'laguerre3_ipp-laguerre3', (0,1,2), 3, rtol=2e-13),
  258. data(eval_genlaguerre_ddd, 'laguerre3_ipp-laguerre3', (0,1,2), 3, knownfailure='hyp2f1 insufficiently accurate.'),
  259. data(log1p, 'log1p_expm1_data_ipp-log1p_expm1_data', 0, 1),
  260. data(expm1, 'log1p_expm1_data_ipp-log1p_expm1_data', 0, 2),
  261. data(iv, 'bessel_i_data_ipp-bessel_i_data', (0,1), 2, rtol=1e-12),
  262. data(iv, 'bessel_i_data_ipp-bessel_i_data', (0,1j), 2, rtol=2e-10, atol=1e-306),
  263. data(iv, 'bessel_i_int_data_ipp-bessel_i_int_data', (0,1), 2, rtol=1e-9),
  264. data(iv, 'bessel_i_int_data_ipp-bessel_i_int_data', (0,1j), 2, rtol=2e-10),
  265. data(jn, 'bessel_j_int_data_ipp-bessel_j_int_data', (0,1), 2, rtol=1e-12),
  266. data(jn, 'bessel_j_int_data_ipp-bessel_j_int_data', (0,1j), 2, rtol=1e-12),
  267. data(jn, 'bessel_j_large_data_ipp-bessel_j_large_data', (0,1), 2, rtol=6e-11),
  268. data(jn, 'bessel_j_large_data_ipp-bessel_j_large_data', (0,1j), 2, rtol=6e-11),
  269. data(jv, 'bessel_j_int_data_ipp-bessel_j_int_data', (0,1), 2, rtol=1e-12),
  270. data(jv, 'bessel_j_int_data_ipp-bessel_j_int_data', (0,1j), 2, rtol=1e-12),
  271. data(jv, 'bessel_j_data_ipp-bessel_j_data', (0,1), 2, rtol=1e-12),
  272. data(jv, 'bessel_j_data_ipp-bessel_j_data', (0,1j), 2, rtol=1e-12),
  273. data(kn, 'bessel_k_int_data_ipp-bessel_k_int_data', (0,1), 2, rtol=1e-12),
  274. data(kv, 'bessel_k_int_data_ipp-bessel_k_int_data', (0,1), 2, rtol=1e-12),
  275. data(kv, 'bessel_k_int_data_ipp-bessel_k_int_data', (0,1j), 2, rtol=1e-12),
  276. data(kv, 'bessel_k_data_ipp-bessel_k_data', (0,1), 2, rtol=1e-12),
  277. data(kv, 'bessel_k_data_ipp-bessel_k_data', (0,1j), 2, rtol=1e-12),
  278. data(yn, 'bessel_y01_data_ipp-bessel_y01_data', (0,1), 2, rtol=1e-12),
  279. data(yn, 'bessel_yn_data_ipp-bessel_yn_data', (0,1), 2, rtol=1e-12),
  280. data(yv, 'bessel_yn_data_ipp-bessel_yn_data', (0,1), 2, rtol=1e-12),
  281. data(yv, 'bessel_yn_data_ipp-bessel_yn_data', (0,1j), 2, rtol=1e-12),
  282. data(yv, 'bessel_yv_data_ipp-bessel_yv_data', (0,1), 2, rtol=1e-10),
  283. data(yv, 'bessel_yv_data_ipp-bessel_yv_data', (0,1j), 2, rtol=1e-10),
  284. data(zeta_, 'zeta_data_ipp-zeta_data', 0, 1, param_filter=(lambda s: s > 1)),
  285. data(zeta_, 'zeta_neg_data_ipp-zeta_neg_data', 0, 1, param_filter=(lambda s: s > 1)),
  286. data(zeta_, 'zeta_1_up_data_ipp-zeta_1_up_data', 0, 1, param_filter=(lambda s: s > 1)),
  287. data(zeta_, 'zeta_1_below_data_ipp-zeta_1_below_data', 0, 1, param_filter=(lambda s: s > 1)),
  288. data(gammaincinv, 'gamma_inv_small_data_ipp-gamma_inv_small_data', (0,1), 2, rtol=1e-11),
  289. data(gammaincinv, 'gamma_inv_data_ipp-gamma_inv_data', (0,1), 2, rtol=1e-14),
  290. data(gammaincinv, 'gamma_inv_big_data_ipp-gamma_inv_big_data', (0,1), 2, rtol=1e-11),
  291. data(gammainccinv, 'gamma_inv_small_data_ipp-gamma_inv_small_data', (0,1), 3, rtol=1e-12),
  292. data(gammainccinv, 'gamma_inv_data_ipp-gamma_inv_data', (0,1), 3, rtol=1e-14),
  293. data(gammainccinv, 'gamma_inv_big_data_ipp-gamma_inv_big_data', (0,1), 3, rtol=1e-14),
  294. data(gdtrix_, 'gamma_inv_small_data_ipp-gamma_inv_small_data', (0,1), 2, rtol=3e-13, knownfailure='gdtrix unflow some points'),
  295. data(gdtrix_, 'gamma_inv_data_ipp-gamma_inv_data', (0,1), 2, rtol=3e-15),
  296. data(gdtrix_, 'gamma_inv_big_data_ipp-gamma_inv_big_data', (0,1), 2),
  297. data(gdtrix_comp, 'gamma_inv_small_data_ipp-gamma_inv_small_data', (0,1), 2, knownfailure='gdtrix bad some points'),
  298. data(gdtrix_comp, 'gamma_inv_data_ipp-gamma_inv_data', (0,1), 3, rtol=6e-15),
  299. data(gdtrix_comp, 'gamma_inv_big_data_ipp-gamma_inv_big_data', (0,1), 3),
  300. data(chndtr, 'nccs_ipp-nccs', (2,0,1), 3, rtol=3e-5),
  301. data(chndtr, 'nccs_big_ipp-nccs_big', (2,0,1), 3, rtol=5e-4, knownfailure='chndtr inaccurate some points'),
  302. data(sph_harm_, 'spherical_harmonic_ipp-spherical_harmonic', (1,0,3,2), (4,5), rtol=5e-11,
  303. param_filter=(lambda p: np.ones(p.shape, '?'),
  304. lambda p: np.ones(p.shape, '?'),
  305. lambda p: np.logical_and(p < 2*np.pi, p >= 0),
  306. lambda p: np.logical_and(p < np.pi, p >= 0))),
  307. data(spherical_jn_, 'sph_bessel_data_ipp-sph_bessel_data', (0,1), 2, rtol=1e-13),
  308. data(spherical_yn_, 'sph_neumann_data_ipp-sph_neumann_data', (0,1), 2, rtol=8e-15),
  309. data(owens_t, 'owenst_data_ipp-owens_t', (0, 1), 2, rtol=5e-14),
  310. data(owens_t, 'owenst_data_ipp-owens_t_alarge', (0, 1), 2, rtol=5e-15),
  311. # -- not used yet (function does not exist in scipy):
  312. # 'ellint_pi2_data_ipp-ellint_pi2_data',
  313. # 'ellint_pi3_data_ipp-ellint_pi3_data',
  314. # 'ellint_pi3_large_data_ipp-ellint_pi3_large_data',
  315. # 'ellint_rc_data_ipp-ellint_rc_data',
  316. # 'ellint_rd_data_ipp-ellint_rd_data',
  317. # 'ellint_rf_data_ipp-ellint_rf_data',
  318. # 'ellint_rj_data_ipp-ellint_rj_data',
  319. # 'ncbeta_big_ipp-ncbeta_big',
  320. # 'ncbeta_ipp-ncbeta',
  321. # 'powm1_sqrtp1m1_test_cpp-powm1_data',
  322. # 'powm1_sqrtp1m1_test_cpp-sqrtp1m1_data',
  323. # 'test_gamma_data_ipp-gammap1m1_data',
  324. # 'tgamma_ratio_data_ipp-tgamma_ratio_data',
  325. ]
  326. @pytest.mark.parametrize('test', BOOST_TESTS, ids=repr)
  327. def test_boost(test):
  328. _test_factory(test)
  329. GSL_TESTS = [
  330. data_gsl(mathieu_a, 'mathieu_ab', (0, 1), 2, rtol=1e-13, atol=1e-13),
  331. data_gsl(mathieu_b, 'mathieu_ab', (0, 1), 3, rtol=1e-13, atol=1e-13),
  332. # Also the GSL output has limited accuracy...
  333. data_gsl(mathieu_ce_rad, 'mathieu_ce_se', (0, 1, 2), 3, rtol=1e-7, atol=1e-13),
  334. data_gsl(mathieu_se_rad, 'mathieu_ce_se', (0, 1, 2), 4, rtol=1e-7, atol=1e-13),
  335. data_gsl(mathieu_mc1_scaled, 'mathieu_mc_ms', (0, 1, 2), 3, rtol=1e-7, atol=1e-13),
  336. data_gsl(mathieu_ms1_scaled, 'mathieu_mc_ms', (0, 1, 2), 4, rtol=1e-7, atol=1e-13),
  337. data_gsl(mathieu_mc2_scaled, 'mathieu_mc_ms', (0, 1, 2), 5, rtol=1e-7, atol=1e-13),
  338. data_gsl(mathieu_ms2_scaled, 'mathieu_mc_ms', (0, 1, 2), 6, rtol=1e-7, atol=1e-13),
  339. ]
  340. @pytest.mark.parametrize('test', GSL_TESTS, ids=repr)
  341. def test_gsl(test):
  342. _test_factory(test)
  343. LOCAL_TESTS = [
  344. data_local(ellipkinc, 'ellipkinc_neg_m', (0, 1), 2),
  345. data_local(ellipkm1, 'ellipkm1', 0, 1),
  346. data_local(ellipeinc, 'ellipeinc_neg_m', (0, 1), 2),
  347. data_local(clog1p, 'log1p_expm1_complex', (0,1), (2,3), rtol=1e-14),
  348. data_local(cexpm1, 'log1p_expm1_complex', (0,1), (4,5), rtol=1e-14),
  349. data_local(gammainc, 'gammainc', (0, 1), 2, rtol=1e-12),
  350. data_local(gammaincc, 'gammaincc', (0, 1), 2, rtol=1e-11),
  351. data_local(ellip_harm_2, 'ellip',(0, 1, 2, 3, 4), 6, rtol=1e-10, atol=1e-13),
  352. data_local(ellip_harm, 'ellip',(0, 1, 2, 3, 4), 5, rtol=1e-10, atol=1e-13),
  353. ]
  354. @pytest.mark.parametrize('test', LOCAL_TESTS, ids=repr)
  355. def test_local(test):
  356. _test_factory(test)
  357. def _test_factory(test, dtype=np.double):
  358. """Boost test"""
  359. with suppress_warnings() as sup:
  360. sup.filter(IntegrationWarning, "The occurrence of roundoff error is detected")
  361. olderr = np.seterr(all='ignore')
  362. try:
  363. test.check(dtype=dtype)
  364. finally:
  365. np.seterr(**olderr)