summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/math/reporting/accuracy/bindings.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/math/reporting/accuracy/bindings.hpp')
-rw-r--r--src/boost/libs/math/reporting/accuracy/bindings.hpp765
1 files changed, 765 insertions, 0 deletions
diff --git a/src/boost/libs/math/reporting/accuracy/bindings.hpp b/src/boost/libs/math/reporting/accuracy/bindings.hpp
new file mode 100644
index 00000000..f2d49a03
--- /dev/null
+++ b/src/boost/libs/math/reporting/accuracy/bindings.hpp
@@ -0,0 +1,765 @@
+// Copyright John Maddock 2015.
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_BINDINGS
+#define BOOST_MATH_BINDINGS
+
+#define ERROR_REPORTING_MODE
+#include <stdexcept>
+
+#if TEST_CXX17_CMATH
+
+#include <cmath>
+
+#define TEST_LIBRARY_NAME "<cmath>"
+
+#define LOG1P_FUNCTION_TO_TEST std::log1p
+#define EXPM1_FUNCTION_TO_TEST std::expm1
+
+#define CBRT_FUNCTION_TO_TEST std::cbrt
+#define ERF_FUNCTION_TO_TEST std::erf
+#define ERFC_FUNCTION_TO_TEST std::erfc
+
+#define LGAMMA_FUNCTION_TO_TEST std::lgamma
+#define TGAMMA_FUNCTION_TO_TEST std::tgamma
+
+#define BESSEL_I_FUNCTION_TO_TEST std::cyl_bessel_i
+#define BESSEL_IN_FUNCTION_TO_TEST std::cyl_bessel_i
+#define BESSEL_J_FUNCTION_TO_TEST std::cyl_bessel_j
+#define BESSEL_JN_FUNCTION_TO_TEST std::cyl_bessel_j
+#define BESSEL_JS_FUNCTION_TO_TEST std::sph_bessel
+#define BESSEL_K_FUNCTION_TO_TEST std::cyl_bessel_k
+#define BESSEL_KN_FUNCTION_TO_TEST std::cyl_bessel_k
+#define BESSEL_Y_FUNCTION_TO_TEST std::cyl_neumann
+#define BESSEL_YN_FUNCTION_TO_TEST std::cyl_neumann
+#define BESSEL_YS_FUNCTION_TO_TEST std::sph_neumann
+
+#define BETA_FUNCTION_TO_TEST std::beta
+
+#define ELLINT_1_FUNCTION_TO_TEST std::ellint_1
+#define ELLINT_1C_FUNCTION_TO_TEST std::comp_ellint_1
+#define ELLINT_2_FUNCTION_TO_TEST std::ellint_2
+#define ELLINT_2C_FUNCTION_TO_TEST std::comp_ellint_2
+#define ELLINT_3_FUNCTION_TO_TEST std::ellint_3
+#define ELLINT_3C_FUNCTION_TO_TEST std::comp_ellint_3
+
+#define EI_FUNCTION_TO_TEST std::expint
+
+#define LAGUERRE_FUNCTION_TO_TEST std::laguerre
+#define ASSOC_LAGUERRE_FUNCTION_TO_TEST std::assoc_laguerre
+
+inline long double legendre_p_binder(int i, long double d)
+{
+ if(i < 0)
+ throw std::domain_error("order parameters less than 0 not supported in TR1");
+ return std::legendre(i, d);
+}
+inline long double assoc_legendre_p_binder(int i, int j, long double d)
+{
+ if((i < 0) || (j < 0))
+ throw std::domain_error("order parameters less than 0 not supported in TR1");
+ return std::assoc_legendre(i, j, d);
+}
+
+#define LEGENDRE_P_FUNCTION_TO_TEST legendre_p_binder
+#define LEGENDRE_PA_FUNCTION_TO_TEST assoc_legendre_p_binder
+#define ZETA_FUNCTION_TO_TEST std::riemann_zeta
+
+#define TYPE_TO_TEST long double
+
+#elif defined(TEST_C99)
+
+#include <math.h>
+
+#define TEST_LIBRARY_NAME "<math.h>"
+
+#ifdef _MSC_VER
+
+#define LOG1P_FUNCTION_TO_TEST ::log1p
+#define EXPM1_FUNCTION_TO_TEST ::expm1
+
+#define CBRT_FUNCTION_TO_TEST ::cbrt
+#define ERF_FUNCTION_TO_TEST ::erf
+#define ERFC_FUNCTION_TO_TEST ::erfc
+
+#define LGAMMA_FUNCTION_TO_TEST ::lgamma
+#define TGAMMA_FUNCTION_TO_TEST ::tgamma
+#define BESSEL_JN_FUNCTION_TO_TEST ::jn
+#define BESSEL_YN_FUNCTION_TO_TEST ::yn
+
+#define TYPE_TO_TEST double
+
+#else
+
+#define LOG1P_FUNCTION_TO_TEST ::log1pl
+#define EXPM1_FUNCTION_TO_TEST ::expm1l
+
+#define CBRT_FUNCTION_TO_TEST ::cbrtl
+#define ERF_FUNCTION_TO_TEST ::erfl
+#define ERFC_FUNCTION_TO_TEST ::erfcl
+
+#define LGAMMA_FUNCTION_TO_TEST ::lgammal
+#define TGAMMA_FUNCTION_TO_TEST ::tgammal
+//#define BESSEL_JN_FUNCTION_TO_TEST ::jnl
+//#define BESSEL_JN_FUNCTION_TO_TEST ::ynl
+
+#define TYPE_TO_TEST long double
+#endif
+
+#elif defined(TEST_GSL)
+
+#include <stdexcept>
+
+#include <gsl/gsl_sf.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_version.h>
+
+#define TEST_LIBRARY_NAME "GSL " GSL_VERSION
+
+void gsl_handler(const char * reason, const char * file, int line, int gsl_errno)
+{
+ if(gsl_errno == GSL_ERANGE) return; // handle zero or infinity in our test code.
+ throw std::domain_error(reason);
+}
+
+struct gsl_error_handler_setter
+{
+ gsl_error_handler_t * old_handler;
+ gsl_error_handler_setter()
+ {
+ old_handler = gsl_set_error_handler(gsl_handler);
+ }
+ ~gsl_error_handler_setter()
+ {
+ gsl_set_error_handler(old_handler);
+ }
+};
+
+static const gsl_error_handler_setter handler;
+
+inline double gsl_bessel_ys(unsigned i, double d)
+{
+ return gsl_sf_bessel_yl(i, d);
+}
+
+inline double gsl_bessel_js(unsigned i, double d)
+{
+ return gsl_sf_bessel_jl(i, d);
+}
+
+//#define CBRT_FUNCTION_TO_TEST boost::cbrt
+#define ERF_FUNCTION_TO_TEST gsl_sf_erf
+#define ERFC_FUNCTION_TO_TEST gsl_sf_erfc
+//#define ERF_INV_FUNCTION_TO_TEST boost::math::erf_inv
+//#define ERFC_INV_FUNCTION_TO_TEST boost::math::erfc_inv
+
+#define LGAMMA_FUNCTION_TO_TEST gsl_sf_lngamma
+#define TGAMMA_FUNCTION_TO_TEST gsl_sf_gamma
+//#define TGAMMA1PM1_FUNCTION_TO_TEST boost::math::tgamma1pm1
+
+#define BESSEL_I_FUNCTION_TO_TEST gsl_sf_bessel_Inu
+#define BESSEL_IN_FUNCTION_TO_TEST gsl_sf_bessel_In
+//#define BESSEL_IP_FUNCTION_TO_TEST boost::math::cyl_bessel_i_prime
+//#define BESSEL_IPN_FUNCTION_TO_TEST boost::math::cyl_bessel_i_prime
+#define BESSEL_J_FUNCTION_TO_TEST gsl_sf_bessel_Jnu
+#define BESSEL_JN_FUNCTION_TO_TEST gsl_sf_bessel_Jn
+#define BESSEL_JS_FUNCTION_TO_TEST gsl_bessel_js
+//#define BESSEL_JP_FUNCTION_TO_TEST boost::math::cyl_bessel_j_prime
+//#define BESSEL_JPN_FUNCTION_TO_TEST boost::math::cyl_bessel_j_prime
+//#define BESSEL_JPS_FUNCTION_TO_TEST boost::math::sph_bessel_prime
+#define BESSEL_K_FUNCTION_TO_TEST gsl_sf_bessel_Knu
+#define BESSEL_KN_FUNCTION_TO_TEST gsl_sf_bessel_Kn
+//#define BESSEL_KP_FUNCTION_TO_TEST boost::math::cyl_bessel_k_prime
+//#define BESSEL_KPN_FUNCTION_TO_TEST boost::math::cyl_bessel_k_prime
+#define BESSEL_Y_FUNCTION_TO_TEST gsl_sf_bessel_Ynu
+#define BESSEL_YN_FUNCTION_TO_TEST gsl_sf_bessel_Yn
+#define BESSEL_YS_FUNCTION_TO_TEST gsl_bessel_ys
+//#define BESSEL_YP_FUNCTION_TO_TEST boost::math::cyl_neumann_prime
+//#define BESSEL_YNP_FUNCTION_TO_TEST boost::math::cyl_neumann_prime
+//#define BESSEL_YSP_FUNCTION_TO_TEST boost::math::sph_neumann_prime
+
+#define BETA_FUNCTION_TO_TEST gsl_sf_beta
+//#define BINOMIAL_FUNCTION_TO_TEST boost::math::binomial_coefficient<T>
+
+inline double RC(double a, double b)
+{
+ return gsl_sf_ellint_RC(a, b, GSL_PREC_DOUBLE);
+}
+inline double RD(double a, double b, double c)
+{
+ return gsl_sf_ellint_RD(a, b, c, GSL_PREC_DOUBLE);
+}
+inline double RF(double a, double b, double c)
+{
+ return gsl_sf_ellint_RF(a, b, c, GSL_PREC_DOUBLE);
+}
+inline double RJ(double a, double b, double c, double d)
+{
+ return gsl_sf_ellint_RJ(a, b, c, d, GSL_PREC_DOUBLE);
+}
+
+
+#define ELLINT_RC_FUNCTION_TO_TEST RC
+#define ELLINT_RD_FUNCTION_TO_TEST RD
+#define ELLINT_RF_FUNCTION_TO_TEST RF
+//#define ELLINT_RG_FUNCTION_TO_TEST boost::math::ellint_rg
+#define ELLINT_RJ_FUNCTION_TO_TEST RJ
+
+#define DIGAMMA_FUNCTION_TO_TEST gsl_sf_psi
+
+inline double ellintK(double a) { return gsl_sf_ellint_Kcomp(a, GSL_PREC_DOUBLE); }
+inline double ellintE(double a) { return gsl_sf_ellint_Ecomp(a, GSL_PREC_DOUBLE); }
+inline double ellintP(double a, double b) { return gsl_sf_ellint_Pcomp(a, -b, GSL_PREC_DOUBLE); }
+
+inline double ellintF(double a, double b) { return gsl_sf_ellint_F(b, a, GSL_PREC_DOUBLE); }
+inline double ellintE2(double a, double b) { return gsl_sf_ellint_E(b, a, GSL_PREC_DOUBLE); }
+inline double ellintP3(double a, double b, double c) { return gsl_sf_ellint_P(c, a, -b, GSL_PREC_DOUBLE); }
+inline double ellintD2(double a, double b) { return gsl_sf_ellint_D(b, a, GSL_PREC_DOUBLE); }
+
+#define ELLINT_1_FUNCTION_TO_TEST ellintF
+#define ELLINT_1C_FUNCTION_TO_TEST ellintK
+#define ELLINT_2_FUNCTION_TO_TEST ellintE2
+#define ELLINT_2C_FUNCTION_TO_TEST ellintE
+#define ELLINT_3_FUNCTION_TO_TEST ellintP3
+#define ELLINT_3C_FUNCTION_TO_TEST ellintP
+#define ELLINT_D2_FUNCTION_TO_TEST ellintD2
+//#define ELLINT_D1_FUNCTION_TO_TEST boost::math::ellint_d
+
+#define EI_FUNCTION_TO_TEST gsl_sf_expint_Ei
+#define EN_FUNCTION_TO_TEST gsl_sf_expint_En
+
+//#define HERMITE_FUNCTION_TO_TEST boost::math::hermite
+//#define HEUMAN_LAMBDA_FUNCTION_TO_TEST boost::math::heuman_lambda
+
+//#define BETA_INC_FUNCTION_TO_TEST boost::math::beta
+//#define BETAC_INC_FUNCTION_TO_TEST boost::math::betac
+#define IBETA_FUNCTION_TO_TEST gsl_sf_beta_inc
+//#define IBETAC_FUNCTION_TO_TEST boost::math::ibetac
+//#define IBETA_INV_FUNCTION_TO_TEST boost::math::ibeta_inv
+//#define IBETAC_INV_FUNCTION_TO_TEST boost::math::ibetac_inv
+//#define IBETA_INVA_FUNCTION_TO_TEST boost::math::ibeta_inva
+//#define IBETAC_INVA_FUNCTION_TO_TEST boost::math::ibetac_inva
+//#define IBETA_INVB_FUNCTION_TO_TEST boost::math::ibeta_invb
+//#define IBETAC_INVB_FUNCTION_TO_TEST boost::math::ibetac_invb
+
+#define IGAMMA_FUNCTION_TO_TEST gsl_sf_gamma_inc
+//#define IGAMMAL_FUNCTION_TO_TEST boost::math::tgamma_lower
+#define GAMMAP_FUNCTION_TO_TEST gsl_sf_gamma_inc_P
+#define GAMMAQ_FUNCTION_TO_TEST gsl_sf_gamma_inc_Q
+//#define GAMMAP_INV_FUNCTION_TO_TEST boost::math::gamma_p_inv
+//#define GAMMAQ_INV_FUNCTION_TO_TEST boost::math::gamma_q_inv
+//#define GAMMAP_INVA_FUNCTION_TO_TEST boost::math::gamma_p_inva
+//#define GAMMAQ_INVA_FUNCTION_TO_TEST boost::math::gamma_q_inva
+
+inline double sn(double k, double u)
+{
+ double s, c, d;
+ gsl_sf_elljac_e(u, k * k, &s, &c, &d);
+ return s;
+}
+inline double cn(double k, double u)
+{
+ double s, c, d;
+ gsl_sf_elljac_e(u, k * k, &s, &c, &d);
+ return c;
+}
+inline double dn(double k, double u)
+{
+ double s, c, d;
+ gsl_sf_elljac_e(u, k * k, &s, &c, &d);
+ return d;
+}
+
+#define SN_FUNCTION_TO_TEST sn
+#define CN_FUNCTION_TO_TEST cn
+#define DN_FUNCTION_TO_TEST dn
+//#define JACOBI_ZETA_FUNCTION_TO_TEST boost::math::jacobi_zeta
+
+inline double laguerre(unsigned n, unsigned m, double x){ return gsl_sf_laguerre_n(n, m, x); }
+inline double laguerre_0(unsigned n, double x){ return gsl_sf_laguerre_n(n, 0, x); }
+
+#define LAGUERRE_FUNCTION_TO_TEST laguerre_0
+#define ASSOC_LAGUERRE_FUNCTION_TO_TEST laguerre
+
+inline double legendre_q(unsigned n, double x) { return gsl_sf_legendre_Ql(n, x); }
+
+#define LEGENDRE_P_FUNCTION_TO_TEST gsl_sf_legendre_Pl
+#define LEGENDRE_Q_FUNCTION_TO_TEST legendre_q
+#define LEGENDRE_PA_FUNCTION_TO_TEST gsl_sf_legendre_Plm
+
+#define POLYGAMMA_FUNCTION_TO_TEST gsl_sf_psi_n
+//#define TGAMMA_RATIO_FUNCTION_TO_TEST boost::math::tgamma_ratio
+//#define TGAMMA_DELTA_RATIO_FUNCTION_TO_TEST boost::math::tgamma_delta_ratio
+//#define SIN_PI_RATIO_FUNCTION_TO_TEST boost::math::sin_pi
+//#define COS_PI_RATIO_FUNCTION_TO_TEST boost::math::cos_pi
+#define TRIGAMMA_RATIO_FUNCTION_TO_TEST gsl_sf_psi_1
+#define ZETA_FUNCTION_TO_TEST gsl_sf_zeta
+
+#define TYPE_TO_TEST double
+
+#elif defined(TEST_RMATH)
+
+#define MATHLIB_STANDALONE
+#include <Rmath.h>
+
+#undef trunc
+
+#define TEST_LIBRARY_NAME "Rmath " R_VERSION_STRING
+
+#define LOG1P_FUNCTION_TO_TEST log1p
+#define EXPM1_FUNCTION_TO_TEST expm1
+
+//#define CBRT_FUNCTION_TO_TEST boost::math::cbrt
+//#define ERF_FUNCTION_TO_TEST boost::math::erf
+//#define ERFC_FUNCTION_TO_TEST boost::math::erfc
+//#define ERF_INV_FUNCTION_TO_TEST boost::math::erf_inv
+//#define ERFC_INV_FUNCTION_TO_TEST boost::math::erfc_inv
+
+#define LGAMMA_FUNCTION_TO_TEST lgammafn
+#define TGAMMA_FUNCTION_TO_TEST gammafn
+//#define TGAMMA1PM1_FUNCTION_TO_TEST boost::math::tgamma1pm1
+
+inline double I(double n, double x)
+{
+ if (x < 0)
+ throw std::domain_error("Unsupported domain");
+ return bessel_i(x, n, 1);
+}
+inline double K(double n, double x) { return bessel_k(x, n, 1); }
+inline double J(double n, double x)
+{
+ if (x < 0)
+ throw std::domain_error("Unsupported domain");
+ return bessel_j(x, n);
+}
+inline double Y(double n, double x) { return bessel_y(x, n); }
+
+#define BESSEL_I_FUNCTION_TO_TEST I
+#define BESSEL_IN_FUNCTION_TO_TEST I
+//#define BESSEL_IP_FUNCTION_TO_TEST boost::math::cyl_bessel_i_prime
+//#define BESSEL_IPN_FUNCTION_TO_TEST boost::math::cyl_bessel_i_prime
+#define BESSEL_J_FUNCTION_TO_TEST J
+#define BESSEL_JN_FUNCTION_TO_TEST J
+//#define BESSEL_JS_FUNCTION_TO_TEST boost::math::sph_bessel
+//#define BESSEL_JP_FUNCTION_TO_TEST boost::math::cyl_bessel_j_prime
+//#define BESSEL_JPN_FUNCTION_TO_TEST boost::math::cyl_bessel_j_prime
+//#define BESSEL_JPS_FUNCTION_TO_TEST boost::math::sph_bessel_prime
+#define BESSEL_K_FUNCTION_TO_TEST K
+#define BESSEL_KN_FUNCTION_TO_TEST K
+//#define BESSEL_KP_FUNCTION_TO_TEST boost::math::cyl_bessel_k_prime
+//#define BESSEL_KPN_FUNCTION_TO_TEST boost::math::cyl_bessel_k_prime
+#define BESSEL_Y_FUNCTION_TO_TEST Y
+#define BESSEL_YN_FUNCTION_TO_TEST Y
+//#define BESSEL_YS_FUNCTION_TO_TEST boost::math::sph_neumann
+//#define BESSEL_YP_FUNCTION_TO_TEST boost::math::cyl_neumann_prime
+//#define BESSEL_YNP_FUNCTION_TO_TEST boost::math::cyl_neumann_prime
+//#define BESSEL_YSP_FUNCTION_TO_TEST boost::math::sph_neumann_prime
+
+#define BETA_FUNCTION_TO_TEST beta
+//#define BINOMIAL_FUNCTION_TO_TEST boost::math::binomial_coefficient<T>
+
+//#define ELLINT_RC_FUNCTION_TO_TEST boost::math::ellint_rc
+//#define ELLINT_RD_FUNCTION_TO_TEST boost::math::ellint_rd
+//#define ELLINT_RF_FUNCTION_TO_TEST boost::math::ellint_rf
+//#define ELLINT_RG_FUNCTION_TO_TEST boost::math::ellint_rg
+//#define ELLINT_RJ_FUNCTION_TO_TEST boost::math::ellint_rj
+
+#define DIGAMMA_FUNCTION_TO_TEST digamma
+
+//#define ELLINT_1_FUNCTION_TO_TEST boost::math::ellint_1
+//#define ELLINT_1C_FUNCTION_TO_TEST boost::math::ellint_1
+//#define ELLINT_2_FUNCTION_TO_TEST boost::math::ellint_2
+//#define ELLINT_2C_FUNCTION_TO_TEST boost::math::ellint_2
+//#define ELLINT_3_FUNCTION_TO_TEST boost::math::ellint_3
+//#define ELLINT_3C_FUNCTION_TO_TEST boost::math::ellint_3
+//#define ELLINT_D2_FUNCTION_TO_TEST boost::math::ellint_d
+//#define ELLINT_D1_FUNCTION_TO_TEST boost::math::ellint_d
+
+//#define EI_FUNCTION_TO_TEST boost::math::expint
+//#define EN_FUNCTION_TO_TEST boost::math::expint
+
+//#define HERMITE_FUNCTION_TO_TEST boost::math::hermite
+//#define HEUMAN_LAMBDA_FUNCTION_TO_TEST boost::math::heuman_lambda
+
+inline double ibeta(double a, double b, double x) { return pbeta(x, a, b, 1, 0); }
+inline double ibetac(double a, double b, double x) { return pbeta(x, a, b, 0, 0); }
+inline double ibeta_inv(double a, double b, double x) { return qbeta(x, a, b, 1, 0); }
+inline double ibetac_inv(double a, double b, double x) { return qbeta(x, a, b, 0, 0); }
+
+//#define BETA_INC_FUNCTION_TO_TEST boost::math::beta
+//#define BETAC_INC_FUNCTION_TO_TEST boost::math::betac
+#define IBETA_FUNCTION_TO_TEST ibeta
+#define IBETAC_FUNCTION_TO_TEST ibetac
+#define IBETA_INV_FUNCTION_TO_TEST ibeta_inv
+#define IBETAC_INV_FUNCTION_TO_TEST ibetac_inv
+//#define IBETA_INVA_FUNCTION_TO_TEST boost::math::ibeta_inva
+//#define IBETAC_INVA_FUNCTION_TO_TEST boost::math::ibetac_inva
+//#define IBETA_INVB_FUNCTION_TO_TEST boost::math::ibeta_invb
+//#define IBETAC_INVB_FUNCTION_TO_TEST boost::math::ibetac_invb
+
+inline double gamma_p(double a, double x) { return pgamma(x, a, 1.0, 1, 0); }
+inline double gamma_q(double a, double x) { return pgamma(x, a, 1.0, 0, 0); }
+inline double gamma_p_inv(double a, double x) { return qgamma(x, a, 1.0, 1, 0); }
+inline double gamma_q_inv(double a, double x) { return qgamma(x, a, 1.0, 0, 0); }
+
+//#define IGAMMA_FUNCTION_TO_TEST boost::math::tgamma
+//#define IGAMMAL_FUNCTION_TO_TEST boost::math::tgamma_lower
+#define GAMMAP_FUNCTION_TO_TEST gamma_p
+#define GAMMAQ_FUNCTION_TO_TEST gamma_q
+#define GAMMAP_INV_FUNCTION_TO_TEST gamma_p_inv
+#define GAMMAQ_INV_FUNCTION_TO_TEST gamma_q_inv
+//#define GAMMAP_INVA_FUNCTION_TO_TEST boost::math::gamma_p_inva
+//#define GAMMAQ_INVA_FUNCTION_TO_TEST boost::math::gamma_q_inva
+
+//#define SN_FUNCTION_TO_TEST boost::math::jacobi_sn
+//#define CN_FUNCTION_TO_TEST boost::math::jacobi_cn
+//#define DN_FUNCTION_TO_TEST boost::math::jacobi_dn
+//#define JACOBI_ZETA_FUNCTION_TO_TEST boost::math::jacobi_zeta
+
+//#define LAGUERRE_FUNCTION_TO_TEST boost::math::laguerre
+//#define ASSOC_LAGUERRE_FUNCTION_TO_TEST boost::math::laguerre
+
+//#define LEGENDRE_P_FUNCTION_TO_TEST boost::math::legendre_p
+//#define LEGENDRE_Q_FUNCTION_TO_TEST boost::math::legendre_q
+//#define LEGENDRE_PA_FUNCTION_TO_TEST boost::math::legendre_p
+
+inline double polygamma(int n, double x)
+{
+ if (x < 0)
+ throw std::domain_error("Outside supported domain");
+ return psigamma(x, n);
+}
+
+#define POLYGAMMA_FUNCTION_TO_TEST polygamma
+//#define TGAMMA_RATIO_FUNCTION_TO_TEST boost::math::tgamma_ratio
+//#define TGAMMA_DELTA_RATIO_FUNCTION_TO_TEST boost::math::tgamma_delta_ratio
+//#define SIN_PI_RATIO_FUNCTION_TO_TEST sinpi
+//#define COS_PI_RATIO_FUNCTION_TO_TEST cospi
+#define TRIGAMMA_RATIO_FUNCTION_TO_TEST trigamma
+//#define ZETA_FUNCTION_TO_TEST boost::math::zeta
+
+//#define SQRT1PM1_FUNCTION_TO_TEST boost::math::sqrt1pm1
+//#define POWM1_FUNCTION_TO_TEST boost::math::powm1
+//#define OWENS_T_FUNCTION_TO_TEST boost::math::owens_t
+//#define SPHERICAL_HARMONIC_R_FUNCTION_TO_TEST boost::math::spherical_harmonic_r
+//#define SPHERICAL_HARMONIC_I_FUNCTION_TO_TEST boost::math::spherical_harmonic_i
+
+template <class T> T do_nc_beta_cdf(T a, T b, T nc, T x){ return pnbeta(x, a, b, nc, 1, 0); }
+template <class T> T do_nc_beta_ccdf(T a, T b, T nc, T x){ return pnbeta(x, a, b, nc, 0, 0); }
+template <class T> T do_nc_chi_squared_cdf(T df, T nc, T x){ return pnchisq(x, df, nc, 1, 0); }
+template <class T> T do_nc_chi_squared_ccdf(T df, T nc, T x){ return pnchisq(x, df, nc, 0, 0); }
+template <class T> T do_nc_t_cdf(T df, T nc, T x){ return pnt(x, df, nc, 1, 0); }
+template <class T> T do_nc_t_ccdf(T df, T nc, T x){ return pnt(x, df, nc, 0, 0); }
+
+#define NC_BETA_CDF_FUNCTION_TO_TEST do_nc_beta_cdf
+#define NC_BETA_CCDF_FUNCTION_TO_TEST do_nc_beta_ccdf
+#define NC_CHI_SQUARED_CDF_FUNCTION_TO_TEST do_nc_chi_squared_cdf
+#define NC_CHI_SQUARED_CCDF_FUNCTION_TO_TEST do_nc_chi_squared_ccdf
+#define NC_T_CDF_FUNCTION_TO_TEST do_nc_t_cdf
+#define NC_T_CCDF_FUNCTION_TO_TEST do_nc_t_ccdf
+
+#define TYPE_TO_TEST double
+
+#elif defined(TEST_CEPHES)
+
+#define TEST_LIBRARY_NAME "Cephes"
+#define TYPE_TO_TEST double
+
+extern "C" {
+
+ double log1p(double) throw();
+ double expm1(double) throw();
+ double cbrt(double) throw();
+ double erf(double) throw();
+ double erfc(double) throw();
+ double gamma(double) throw();
+ double lgam(double) throw();
+
+ double iv(double, double) throw();
+ double jv(double, double) throw();
+ double jn(int, double) throw();
+ double kn(int, double) throw();
+ double yn(int, double) throw();
+
+ double beta(double, double)throw();
+ double psi(double);
+
+ double ellik(double, double);
+ double ellpk(double);
+ double ellie(double, double);
+ double ellpe(double);
+
+ double ei(double);
+ // Can't get any sensible values from Cephes expn???
+ //double expn(double, double);
+
+ double incbet(double, double, double);
+ double incbi(double, double, double);
+
+ double igam(double, double);
+ double igamc(double, double);
+ double igami(double, double);
+
+ double ellpj(double u, double m, double *sn, double *cn, double *dn, double *phi);
+
+ double zetac(double);
+
+}
+
+inline double ellint_1(double k, double phi) { return ellik(phi, k * k); }
+inline double ellint_2(double k, double phi) { return ellie(phi, k * k); }
+inline double ellint_1(double k) { return ellpk(k * k); }
+inline double ellint_2(double k) { return ellpe(k * k); }
+
+inline double sn(double k, double u)
+{
+ double sn, cn, dn, phi;
+ ellpj(u, k * k, &sn, &cn, &dn, &phi);
+ return sn;
+}
+inline double cn(double k, double u)
+{
+ double sn, cn, dn, phi;
+ ellpj(u, k * k, &sn, &cn, &dn, &phi);
+ return cn;
+}
+
+inline double dn(double k, double u)
+{
+ double sn, cn, dn, phi;
+ ellpj(u, k * k, &sn, &cn, &dn, &phi);
+ return dn;
+}
+
+#define LOG1P_FUNCTION_TO_TEST log1p
+#define EXPM1_FUNCTION_TO_TEST expm1
+
+#define CBRT_FUNCTION_TO_TEST cbrt
+#define ERF_FUNCTION_TO_TEST erf
+#define ERFC_FUNCTION_TO_TEST erfc
+//#define ERF_INV_FUNCTION_TO_TEST boost::math::erf_inv
+//#define ERFC_INV_FUNCTION_TO_TEST boost::math::erfc_inv
+
+#define LGAMMA_FUNCTION_TO_TEST lgam
+#define TGAMMA_FUNCTION_TO_TEST gamma
+//#define TGAMMA1PM1_FUNCTION_TO_TEST boost::math::tgamma1pm1
+
+#define BESSEL_I_FUNCTION_TO_TEST iv
+#define BESSEL_IN_FUNCTION_TO_TEST iv
+//#define BESSEL_IP_FUNCTION_TO_TEST boost::math::cyl_bessel_i_prime
+//#define BESSEL_IPN_FUNCTION_TO_TEST boost::math::cyl_bessel_i_prime
+#define BESSEL_J_FUNCTION_TO_TEST jv
+#define BESSEL_JN_FUNCTION_TO_TEST jn
+//#define BESSEL_JS_FUNCTION_TO_TEST boost::math::sph_bessel
+//#define BESSEL_JP_FUNCTION_TO_TEST boost::math::cyl_bessel_j_prime
+//#define BESSEL_JPN_FUNCTION_TO_TEST boost::math::cyl_bessel_j_prime
+//#define BESSEL_JPS_FUNCTION_TO_TEST boost::math::sph_bessel_prime
+//#define BESSEL_K_FUNCTION_TO_TEST boost::math::cyl_bessel_k
+#define BESSEL_KN_FUNCTION_TO_TEST kn
+//#define BESSEL_KP_FUNCTION_TO_TEST boost::math::cyl_bessel_k_prime
+//#define BESSEL_KPN_FUNCTION_TO_TEST boost::math::cyl_bessel_k_prime
+//#define BESSEL_Y_FUNCTION_TO_TEST boost::math::cyl_neumann
+#define BESSEL_YN_FUNCTION_TO_TEST yn
+//#define BESSEL_YS_FUNCTION_TO_TEST boost::math::sph_neumann
+//#define BESSEL_YP_FUNCTION_TO_TEST boost::math::cyl_neumann_prime
+//#define BESSEL_YNP_FUNCTION_TO_TEST boost::math::cyl_neumann_prime
+//#define BESSEL_YSP_FUNCTION_TO_TEST boost::math::sph_neumann_prime
+
+#define BETA_FUNCTION_TO_TEST beta
+//#define BINOMIAL_FUNCTION_TO_TEST boost::math::binomial_coefficient<T>
+
+//#define ELLINT_RC_FUNCTION_TO_TEST boost::math::ellint_rc
+//#define ELLINT_RD_FUNCTION_TO_TEST boost::math::ellint_rd
+//#define ELLINT_RF_FUNCTION_TO_TEST boost::math::ellint_rf
+//#define ELLINT_RG_FUNCTION_TO_TEST boost::math::ellint_rg
+//#define ELLINT_RJ_FUNCTION_TO_TEST boost::math::ellint_rj
+
+#define DIGAMMA_FUNCTION_TO_TEST psi
+
+#define ELLINT_1_FUNCTION_TO_TEST ellint_1
+// Can't seem to get sensible answers from Cephes complete elliptic integrals???
+//#define ELLINT_1C_FUNCTION_TO_TEST ellint_1
+#define ELLINT_2_FUNCTION_TO_TEST ellint_2
+//#define ELLINT_2C_FUNCTION_TO_TEST ellint_2
+//#define ELLINT_3_FUNCTION_TO_TEST boost::math::ellint_3
+//#define ELLINT_3C_FUNCTION_TO_TEST boost::math::ellint_3
+//#define ELLINT_D2_FUNCTION_TO_TEST boost::math::ellint_d
+//#define ELLINT_D1_FUNCTION_TO_TEST boost::math::ellint_d
+
+#define EI_FUNCTION_TO_TEST ei
+//#define EN_FUNCTION_TO_TEST expn
+
+//#define HERMITE_FUNCTION_TO_TEST boost::math::hermite
+//#define HEUMAN_LAMBDA_FUNCTION_TO_TEST boost::math::heuman_lambda
+
+//#define BETA_INC_FUNCTION_TO_TEST incbet
+//#define BETAC_INC_FUNCTION_TO_TEST boost::math::betac
+#define IBETA_FUNCTION_TO_TEST incbet
+//#define IBETAC_FUNCTION_TO_TEST boost::math::ibetac
+#define IBETA_INV_FUNCTION_TO_TEST incbi
+//#define IBETAC_INV_FUNCTION_TO_TEST boost::math::ibetac_inv
+//#define IBETA_INVA_FUNCTION_TO_TEST boost::math::ibeta_inva
+//#define IBETAC_INVA_FUNCTION_TO_TEST boost::math::ibetac_inva
+//#define IBETA_INVB_FUNCTION_TO_TEST boost::math::ibeta_invb
+//#define IBETAC_INVB_FUNCTION_TO_TEST boost::math::ibetac_invb
+
+//#define IGAMMA_FUNCTION_TO_TEST boost::math::tgamma
+//#define IGAMMAL_FUNCTION_TO_TEST boost::math::tgamma_lower
+#define GAMMAP_FUNCTION_TO_TEST igam
+#define GAMMAQ_FUNCTION_TO_TEST igamc
+//#define GAMMAP_INV_FUNCTION_TO_TEST boost::math::gamma_p_inv
+#define GAMMAQ_INV_FUNCTION_TO_TEST igami
+//#define GAMMAP_INVA_FUNCTION_TO_TEST boost::math::gamma_p_inva
+//#define GAMMAQ_INVA_FUNCTION_TO_TEST boost::math::gamma_q_inva
+
+#define SN_FUNCTION_TO_TEST sn
+#define CN_FUNCTION_TO_TEST cn
+#define DN_FUNCTION_TO_TEST dn
+
+#define ZETA_FUNCTION_TO_TEST zetac
+
+#else
+
+#include <boost/math/distributions/non_central_beta.hpp>
+#include <boost/math/distributions/non_central_chi_squared.hpp>
+#include <boost/math/distributions/non_central_t.hpp>
+
+#define TEST_LIBRARY_NAME "boost"
+
+#define LOG1P_FUNCTION_TO_TEST boost::math::log1p
+#define EXPM1_FUNCTION_TO_TEST boost::math::expm1
+
+#define CBRT_FUNCTION_TO_TEST boost::math::cbrt
+#define ERF_FUNCTION_TO_TEST boost::math::erf
+#define ERFC_FUNCTION_TO_TEST boost::math::erfc
+#define ERF_INV_FUNCTION_TO_TEST boost::math::erf_inv
+#define ERFC_INV_FUNCTION_TO_TEST boost::math::erfc_inv
+
+#define LGAMMA_FUNCTION_TO_TEST boost::math::lgamma
+#define TGAMMA_FUNCTION_TO_TEST boost::math::tgamma
+#define TGAMMA1PM1_FUNCTION_TO_TEST boost::math::tgamma1pm1
+
+#define BESSEL_I_FUNCTION_TO_TEST boost::math::cyl_bessel_i
+#define BESSEL_IN_FUNCTION_TO_TEST boost::math::cyl_bessel_i
+#define BESSEL_IP_FUNCTION_TO_TEST boost::math::cyl_bessel_i_prime
+#define BESSEL_IPN_FUNCTION_TO_TEST boost::math::cyl_bessel_i_prime
+#define BESSEL_J_FUNCTION_TO_TEST boost::math::cyl_bessel_j
+#define BESSEL_JN_FUNCTION_TO_TEST boost::math::cyl_bessel_j
+#define BESSEL_JS_FUNCTION_TO_TEST boost::math::sph_bessel
+#define BESSEL_JP_FUNCTION_TO_TEST boost::math::cyl_bessel_j_prime
+#define BESSEL_JPN_FUNCTION_TO_TEST boost::math::cyl_bessel_j_prime
+#define BESSEL_JPS_FUNCTION_TO_TEST boost::math::sph_bessel_prime
+#define BESSEL_K_FUNCTION_TO_TEST boost::math::cyl_bessel_k
+#define BESSEL_KN_FUNCTION_TO_TEST boost::math::cyl_bessel_k
+#define BESSEL_KP_FUNCTION_TO_TEST boost::math::cyl_bessel_k_prime
+#define BESSEL_KPN_FUNCTION_TO_TEST boost::math::cyl_bessel_k_prime
+#define BESSEL_Y_FUNCTION_TO_TEST boost::math::cyl_neumann
+#define BESSEL_YN_FUNCTION_TO_TEST boost::math::cyl_neumann
+#define BESSEL_YS_FUNCTION_TO_TEST boost::math::sph_neumann
+#define BESSEL_YP_FUNCTION_TO_TEST boost::math::cyl_neumann_prime
+#define BESSEL_YNP_FUNCTION_TO_TEST boost::math::cyl_neumann_prime
+#define BESSEL_YSP_FUNCTION_TO_TEST boost::math::sph_neumann_prime
+
+#define BETA_FUNCTION_TO_TEST boost::math::beta
+#define BINOMIAL_FUNCTION_TO_TEST boost::math::binomial_coefficient<T>
+
+#define ELLINT_RC_FUNCTION_TO_TEST boost::math::ellint_rc
+#define ELLINT_RD_FUNCTION_TO_TEST boost::math::ellint_rd
+#define ELLINT_RF_FUNCTION_TO_TEST boost::math::ellint_rf
+#define ELLINT_RG_FUNCTION_TO_TEST boost::math::ellint_rg
+#define ELLINT_RJ_FUNCTION_TO_TEST boost::math::ellint_rj
+
+#define DIGAMMA_FUNCTION_TO_TEST boost::math::digamma
+
+#define ELLINT_1_FUNCTION_TO_TEST boost::math::ellint_1
+#define ELLINT_1C_FUNCTION_TO_TEST boost::math::ellint_1
+#define ELLINT_2_FUNCTION_TO_TEST boost::math::ellint_2
+#define ELLINT_2C_FUNCTION_TO_TEST boost::math::ellint_2
+#define ELLINT_3_FUNCTION_TO_TEST boost::math::ellint_3
+#define ELLINT_3C_FUNCTION_TO_TEST boost::math::ellint_3
+#define ELLINT_D2_FUNCTION_TO_TEST boost::math::ellint_d
+#define ELLINT_D1_FUNCTION_TO_TEST boost::math::ellint_d
+
+#define EI_FUNCTION_TO_TEST boost::math::expint
+#define EN_FUNCTION_TO_TEST boost::math::expint
+
+#define HERMITE_FUNCTION_TO_TEST boost::math::hermite
+#define HEUMAN_LAMBDA_FUNCTION_TO_TEST boost::math::heuman_lambda
+
+#define BETA_INC_FUNCTION_TO_TEST boost::math::beta
+#define BETAC_INC_FUNCTION_TO_TEST boost::math::betac
+#define IBETA_FUNCTION_TO_TEST boost::math::ibeta
+#define IBETAC_FUNCTION_TO_TEST boost::math::ibetac
+#define IBETA_INV_FUNCTION_TO_TEST boost::math::ibeta_inv
+#define IBETAC_INV_FUNCTION_TO_TEST boost::math::ibetac_inv
+#define IBETA_INVA_FUNCTION_TO_TEST boost::math::ibeta_inva
+#define IBETAC_INVA_FUNCTION_TO_TEST boost::math::ibetac_inva
+#define IBETA_INVB_FUNCTION_TO_TEST boost::math::ibeta_invb
+#define IBETAC_INVB_FUNCTION_TO_TEST boost::math::ibetac_invb
+
+#define IGAMMA_FUNCTION_TO_TEST boost::math::tgamma
+#define IGAMMAL_FUNCTION_TO_TEST boost::math::tgamma_lower
+#define GAMMAP_FUNCTION_TO_TEST boost::math::gamma_p
+#define GAMMAQ_FUNCTION_TO_TEST boost::math::gamma_q
+#define GAMMAP_INV_FUNCTION_TO_TEST boost::math::gamma_p_inv
+#define GAMMAQ_INV_FUNCTION_TO_TEST boost::math::gamma_q_inv
+#define GAMMAP_INVA_FUNCTION_TO_TEST boost::math::gamma_p_inva
+#define GAMMAQ_INVA_FUNCTION_TO_TEST boost::math::gamma_q_inva
+
+#define SN_FUNCTION_TO_TEST boost::math::jacobi_sn
+#define CN_FUNCTION_TO_TEST boost::math::jacobi_cn
+#define DN_FUNCTION_TO_TEST boost::math::jacobi_dn
+#define JACOBI_ZETA_FUNCTION_TO_TEST boost::math::jacobi_zeta
+
+#define LAGUERRE_FUNCTION_TO_TEST boost::math::laguerre
+#define ASSOC_LAGUERRE_FUNCTION_TO_TEST boost::math::laguerre
+
+#define LEGENDRE_P_FUNCTION_TO_TEST boost::math::legendre_p
+#define LEGENDRE_Q_FUNCTION_TO_TEST boost::math::legendre_q
+#define LEGENDRE_PA_FUNCTION_TO_TEST boost::math::legendre_p
+
+#define POLYGAMMA_FUNCTION_TO_TEST boost::math::polygamma
+#define TGAMMA_RATIO_FUNCTION_TO_TEST boost::math::tgamma_ratio
+#define TGAMMA_DELTA_RATIO_FUNCTION_TO_TEST boost::math::tgamma_delta_ratio
+#define SIN_PI_RATIO_FUNCTION_TO_TEST boost::math::sin_pi
+#define COS_PI_RATIO_FUNCTION_TO_TEST boost::math::cos_pi
+#define TRIGAMMA_RATIO_FUNCTION_TO_TEST boost::math::trigamma
+#define ZETA_FUNCTION_TO_TEST boost::math::zeta
+
+#define SQRT1PM1_FUNCTION_TO_TEST boost::math::sqrt1pm1
+#define POWM1_FUNCTION_TO_TEST boost::math::powm1
+#define OWENS_T_FUNCTION_TO_TEST boost::math::owens_t
+#define SPHERICAL_HARMONIC_R_FUNCTION_TO_TEST boost::math::spherical_harmonic_r
+#define SPHERICAL_HARMONIC_I_FUNCTION_TO_TEST boost::math::spherical_harmonic_i
+
+template <class T> T do_nc_beta_cdf(T a, T b, T nc, T x){ return cdf(boost::math::non_central_beta_distribution<T>(a, b, nc), x); }
+template <class T> T do_nc_beta_ccdf(T a, T b, T nc, T x){ return cdf(complement(boost::math::non_central_beta_distribution<T>(a, b, nc), x)); }
+template <class T> T do_nc_chi_squared_cdf(T df, T nc, T x){ return cdf(boost::math::non_central_chi_squared_distribution<T>(df, nc), x); }
+template <class T> T do_nc_chi_squared_ccdf(T df, T nc, T x){ return cdf(complement(boost::math::non_central_chi_squared_distribution<T>(df, nc), x)); }
+template <class T> T do_nc_t_cdf(T df, T nc, T x){ return cdf(boost::math::non_central_t_distribution<T>(df, nc), x); }
+template <class T> T do_nc_t_ccdf(T df, T nc, T x){ return cdf(complement(boost::math::non_central_t_distribution<T>(df, nc), x)); }
+
+#define NC_BETA_CDF_FUNCTION_TO_TEST do_nc_beta_cdf
+#define NC_BETA_CCDF_FUNCTION_TO_TEST do_nc_beta_ccdf
+#define NC_CHI_SQUARED_CDF_FUNCTION_TO_TEST do_nc_chi_squared_cdf
+#define NC_CHI_SQUARED_CCDF_FUNCTION_TO_TEST do_nc_chi_squared_ccdf
+#define NC_T_CDF_FUNCTION_TO_TEST do_nc_t_cdf
+#define NC_T_CCDF_FUNCTION_TO_TEST do_nc_t_ccdf
+
+
+#endif
+
+#if defined(TYPE_TO_TEST) && !defined(NAME_OF_TYPE_TO_TEST)
+#define NAME_OF_TYPE_TO_TEST BOOST_STRINGIZE(TYPE_TO_TEST)
+#endif
+
+//
+// This include has to come at the end after all the setup is done:
+//
+#include "handle_test_result.hpp"
+
+
+#endif
+