1 // -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- 2 // 3 // Rmath.h: Rcpp R/C++ interface class library -- Wrappers for R's Rmath API 4 // 5 // Copyright (C) 2012 Dirk Eddelbuettel and Romain Francois 6 // 7 // This file is part of Rcpp. 8 // 9 // Rcpp is free software: you can redistribute it and/or modify it 10 // under the terms of the GNU General Public License as published by 11 // the Free Software Foundation, either version 2 of the License, or 12 // (at your option) any later version. 13 // 14 // Rcpp is distributed in the hope that it will be useful, but 15 // WITHOUT ANY WARRANTY; without even the implied warranty of 16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 // GNU General Public License for more details. 18 // 19 // You should have received a copy of the GNU General Public License 20 // along with Rcpp. If not, see <http://www.gnu.org/licenses/>. 21 22 #ifndef Rcpp_Rmath_h 23 #define Rcpp_Rmath_h 24 25 namespace R { 26 27 // see R's Rmath.h as well as Writing R Extension 28 29 /* Random Number Generators */ norm_rand(void)30 inline double norm_rand(void) { return ::norm_rand(); } unif_rand(void)31 inline double unif_rand(void) { return ::unif_rand(); } exp_rand(void)32 inline double exp_rand(void) { return ::exp_rand(); } 33 34 /* Normal Distribution */ dnorm(double x,double mu,double sigma,int lg)35 inline double dnorm(double x, double mu, double sigma, int lg) { return ::Rf_dnorm4(x, mu, sigma, lg); } pnorm(double x,double mu,double sigma,int lt,int lg)36 inline double pnorm(double x, double mu, double sigma, int lt, int lg) { return ::Rf_pnorm5(x, mu, sigma, lt, lg); } qnorm(double p,double mu,double sigma,int lt,int lg)37 inline double qnorm(double p, double mu, double sigma, int lt, int lg) { return ::Rf_qnorm5(p, mu, sigma, lt, lg); } rnorm(double mu,double sigma)38 inline double rnorm(double mu, double sigma) { return ::Rf_rnorm(mu, sigma); } pnorm_both(double x,double * cum,double * ccum,int lt,int lg)39 inline void pnorm_both(double x, double *cum, double *ccum, int lt, int lg) { return ::Rf_pnorm_both(x, cum, ccum, lt, lg); } 40 41 /* Uniform Distribution */ dunif(double x,double a,double b,int lg)42 inline double dunif(double x, double a, double b, int lg) { return ::Rf_dunif(x, a, b, lg); } punif(double x,double a,double b,int lt,int lg)43 inline double punif(double x, double a, double b, int lt, int lg) { return ::Rf_punif(x, a, b, lt, lg); } qunif(double p,double a,double b,int lt,int lg)44 inline double qunif(double p, double a, double b, int lt, int lg) { return ::Rf_qunif(p, a, b, lt, lg); } runif(double a,double b)45 inline double runif(double a, double b) { return ::Rf_runif(a, b); } 46 47 /* Gamma Distribution */ dgamma(double x,double shp,double scl,int lg)48 inline double dgamma(double x, double shp, double scl, int lg) { return ::Rf_dgamma(x, shp, scl, lg); } pgamma(double x,double alp,double scl,int lt,int lg)49 inline double pgamma(double x, double alp, double scl, int lt, int lg) { return ::Rf_pgamma(x, alp, scl, lt, lg); } qgamma(double p,double alp,double scl,int lt,int lg)50 inline double qgamma(double p, double alp, double scl, int lt, int lg) { return ::Rf_qgamma(p, alp, scl, lt, lg); } rgamma(double a,double scl)51 inline double rgamma(double a, double scl) { return ::Rf_rgamma(a, scl); } 52 log1pmx(double x)53 inline double log1pmx(double x) { return ::Rf_log1pmx(x); } log1pexp(double x)54 inline double log1pexp(double x) { return ::log1pexp(x); } // <-- ../nmath/plogis.c lgamma1p(double a)55 inline double lgamma1p(double a) { return ::Rf_lgamma1p(a); } logspace_add(double lx,double ly)56 inline double logspace_add(double lx, double ly) { return ::Rf_logspace_add(lx, ly); } logspace_sub(double lx,double ly)57 inline double logspace_sub(double lx, double ly) { return ::Rf_logspace_sub(lx, ly); } 58 59 /* Beta Distribution */ dbeta(double x,double a,double b,int lg)60 inline double dbeta(double x, double a, double b, int lg) { return ::Rf_dbeta(x, a, b, lg); } pbeta(double x,double p,double q,int lt,int lg)61 inline double pbeta(double x, double p, double q, int lt, int lg) { return ::Rf_pbeta(x, p, q, lt, lg); } qbeta(double a,double p,double q,int lt,int lg)62 inline double qbeta(double a, double p, double q, int lt, int lg) { return ::Rf_qbeta(a, p, q, lt, lg); } rbeta(double a,double b)63 inline double rbeta(double a, double b) { return ::Rf_rbeta(a, b); } 64 65 /* Lognormal Distribution */ dlnorm(double x,double ml,double sl,int lg)66 inline double dlnorm(double x, double ml, double sl, int lg) { return ::Rf_dlnorm(x, ml, sl, lg); } plnorm(double x,double ml,double sl,int lt,int lg)67 inline double plnorm(double x, double ml, double sl, int lt, int lg) { return ::Rf_plnorm(x, ml, sl, lt, lg); } qlnorm(double p,double ml,double sl,int lt,int lg)68 inline double qlnorm(double p, double ml, double sl, int lt, int lg) { return ::Rf_qlnorm(p, ml, sl, lt, lg); } rlnorm(double ml,double sl)69 inline double rlnorm(double ml, double sl) { return ::Rf_rlnorm(ml, sl); } 70 71 /* Chi-squared Distribution */ dchisq(double x,double df,int lg)72 inline double dchisq(double x, double df, int lg) { return ::Rf_dchisq(x, df, lg); } pchisq(double x,double df,int lt,int lg)73 inline double pchisq(double x, double df, int lt, int lg) { return ::Rf_pchisq(x, df, lt, lg); } qchisq(double p,double df,int lt,int lg)74 inline double qchisq(double p, double df, int lt, int lg) { return ::Rf_qchisq(p, df, lt, lg); } rchisq(double df)75 inline double rchisq(double df) { return ::Rf_rchisq(df); } 76 77 /* Non-central Chi-squared Distribution */ dnchisq(double x,double df,double ncp,int lg)78 inline double dnchisq(double x, double df, double ncp, int lg) { return ::Rf_dnchisq(x, df, ncp, lg); } pnchisq(double x,double df,double ncp,int lt,int lg)79 inline double pnchisq(double x, double df, double ncp, int lt, int lg) { return ::Rf_pnchisq(x, df, ncp, lt, lg); } qnchisq(double p,double df,double ncp,int lt,int lg)80 inline double qnchisq(double p, double df, double ncp, int lt, int lg) { return ::Rf_qnchisq(p, df, ncp, lt, lg); } rnchisq(double df,double lb)81 inline double rnchisq(double df, double lb) { return ::Rf_rnchisq(df, lb); } 82 83 /* F Distibution */ df(double x,double df1,double df2,int lg)84 inline double df(double x, double df1, double df2, int lg) { return ::Rf_df(x, df1, df2, lg); } pf(double x,double df1,double df2,int lt,int lg)85 inline double pf(double x, double df1, double df2, int lt, int lg) { return ::Rf_pf(x, df1, df2, lt, lg); } qf(double p,double df1,double df2,int lt,int lg)86 inline double qf(double p, double df1, double df2, int lt, int lg) { return ::Rf_qf(p, df1, df2, lt, lg); } rf(double df1,double df2)87 inline double rf(double df1, double df2) { return ::Rf_rf(df1, df2); } 88 89 /* Student t Distibution */ dt(double x,double n,int lg)90 inline double dt(double x, double n, int lg) { return ::Rf_dt(x, n, lg); } pt(double x,double n,int lt,int lg)91 inline double pt(double x, double n, int lt, int lg) { return ::Rf_pt(x, n, lt, lg); } qt(double p,double n,int lt,int lg)92 inline double qt(double p, double n, int lt, int lg) { return ::Rf_qt(p, n, lt, lg); } rt(double n)93 inline double rt(double n) { return ::Rf_rt(n); } 94 95 /* Binomial Distribution */ dbinom(double x,double n,double p,int lg)96 inline double dbinom(double x, double n, double p, int lg) { return ::Rf_dbinom(x, n, p, lg); } pbinom(double x,double n,double p,int lt,int lg)97 inline double pbinom(double x, double n, double p, int lt, int lg) { return ::Rf_pbinom(x, n, p, lt, lg); } qbinom(double p,double n,double m,int lt,int lg)98 inline double qbinom(double p, double n, double m, int lt, int lg) { return ::Rf_qbinom(p, n, m, lt, lg); } rbinom(double n,double p)99 inline double rbinom(double n, double p) { return ::Rf_rbinom(n, p); } 100 101 /* Multnomial Distribution */ rmultinom(int n,double * prob,int k,int * rn)102 inline void rmultinom(int n, double* prob, int k, int* rn) { return ::rmultinom(n, prob, k, rn); } 103 104 /* Cauchy Distribution */ dcauchy(double x,double lc,double sl,int lg)105 inline double dcauchy(double x, double lc, double sl, int lg) { return ::Rf_dcauchy(x, lc, sl, lg); } pcauchy(double x,double lc,double sl,int lt,int lg)106 inline double pcauchy(double x, double lc, double sl, int lt, int lg) { return ::Rf_pcauchy(x, lc, sl, lt, lg); } qcauchy(double p,double lc,double sl,int lt,int lg)107 inline double qcauchy(double p, double lc, double sl, int lt, int lg) { return ::Rf_qcauchy(p, lc, sl, lt, lg); } rcauchy(double lc,double sl)108 inline double rcauchy(double lc, double sl) { return ::Rf_rcauchy(lc, sl); } 109 110 /* Exponential Distribution */ dexp(double x,double sl,int lg)111 inline double dexp(double x, double sl, int lg) { return ::Rf_dexp(x, sl, lg); } pexp(double x,double sl,int lt,int lg)112 inline double pexp(double x, double sl, int lt, int lg) { return ::Rf_pexp(x, sl, lt, lg); } qexp(double p,double sl,int lt,int lg)113 inline double qexp(double p, double sl, int lt, int lg) { return ::Rf_qexp(p, sl, lt, lg); } rexp(double sl)114 inline double rexp(double sl) { return ::Rf_rexp(sl); } 115 116 /* Geometric Distribution */ dgeom(double x,double p,int lg)117 inline double dgeom(double x, double p, int lg) { return ::Rf_dgeom(x, p, lg); } pgeom(double x,double p,int lt,int lg)118 inline double pgeom(double x, double p, int lt, int lg) { return ::Rf_pgeom(x, p, lt, lg); } qgeom(double p,double pb,int lt,int lg)119 inline double qgeom(double p, double pb, int lt, int lg) { return ::Rf_qgeom(p, pb, lt, lg); } rgeom(double p)120 inline double rgeom(double p) { return ::Rf_rgeom(p); } 121 122 /* Hypergeometric Distibution */ dhyper(double x,double r,double b,double n,int lg)123 inline double dhyper(double x, double r, double b, double n, int lg) { return ::Rf_dhyper(x, r, b, n, lg); } phyper(double x,double r,double b,double n,int lt,int lg)124 inline double phyper(double x, double r, double b, double n, int lt, int lg) { return ::Rf_phyper(x, r, b, n, lt, lg); } qhyper(double p,double r,double b,double n,int lt,int lg)125 inline double qhyper(double p, double r, double b, double n, int lt, int lg) { return ::Rf_qhyper(p, r, b, n, lt, lg); } rhyper(double r,double b,double n)126 inline double rhyper(double r, double b, double n) { return ::Rf_rhyper(r, b, n); } 127 128 /* Negative Binomial Distribution */ dnbinom(double x,double sz,double pb,int lg)129 inline double dnbinom(double x, double sz, double pb, int lg) { return ::Rf_dnbinom(x, sz, pb, lg); } pnbinom(double x,double sz,double pb,int lt,int lg)130 inline double pnbinom(double x, double sz, double pb, int lt, int lg) { return ::Rf_pnbinom(x, sz, pb, lt, lg); } qnbinom(double p,double sz,double pb,int lt,int lg)131 inline double qnbinom(double p, double sz, double pb, int lt, int lg) { return ::Rf_qnbinom(p, sz, pb, lt, lg); } rnbinom(double sz,double pb)132 inline double rnbinom(double sz, double pb) { return ::Rf_rnbinom(sz, pb); } 133 134 #if R_VERSION >= R_Version(3, 1, 2) dnbinom_mu(double x,double sz,double mu,int lg)135 inline double dnbinom_mu(double x, double sz, double mu, int lg) { return ::Rf_dnbinom_mu(x, sz, mu, lg); } pnbinom_mu(double x,double sz,double mu,int lt,int lg)136 inline double pnbinom_mu(double x, double sz, double mu, int lt, int lg) { return ::Rf_pnbinom_mu(x, sz, mu, lt, lg); } qnbinom_mu(double x,double sz,double mu,int lt,int lg)137 inline double qnbinom_mu(double x, double sz, double mu, int lt, int lg) { return ::Rf_qnbinom_mu(x, sz, mu, lt, lg); } 138 //inline double rnbinom_mu(double sz, double mu) { return ::Rf_rnbinom_mu(sz, mu); } 139 #endif 140 141 /* Poisson Distribution */ dpois(double x,double lb,int lg)142 inline double dpois(double x, double lb, int lg) { return ::Rf_dpois(x, lb, lg); } ppois(double x,double lb,int lt,int lg)143 inline double ppois(double x, double lb, int lt, int lg) { return ::Rf_ppois(x, lb, lt, lg); } qpois(double p,double lb,int lt,int lg)144 inline double qpois(double p, double lb, int lt, int lg) { return ::Rf_qpois(p, lb, lt, lg); } rpois(double mu)145 inline double rpois(double mu) { return ::Rf_rpois(mu); } 146 147 /* Weibull Distribution */ dweibull(double x,double sh,double sl,int lg)148 inline double dweibull(double x, double sh, double sl, int lg) { return ::Rf_dweibull(x, sh, sl, lg); } pweibull(double x,double sh,double sl,int lt,int lg)149 inline double pweibull(double x, double sh, double sl, int lt, int lg) { return ::Rf_pweibull(x, sh, sl, lt, lg); } qweibull(double p,double sh,double sl,int lt,int lg)150 inline double qweibull(double p, double sh, double sl, int lt, int lg) { return ::Rf_qweibull(p, sh, sl, lt, lg); } rweibull(double sh,double sl)151 inline double rweibull(double sh, double sl) { return ::Rf_rweibull(sh, sl); } 152 153 /* Logistic Distribution */ dlogis(double x,double lc,double sl,int lg)154 inline double dlogis(double x, double lc, double sl, int lg) { return ::Rf_dlogis(x, lc, sl, lg); } plogis(double x,double lc,double sl,int lt,int lg)155 inline double plogis(double x, double lc, double sl, int lt, int lg) { return ::Rf_plogis(x, lc, sl, lt, lg); } qlogis(double p,double lc,double sl,int lt,int lg)156 inline double qlogis(double p, double lc, double sl, int lt, int lg) { return ::Rf_qlogis(p, lc, sl, lt, lg); } rlogis(double lc,double sl)157 inline double rlogis(double lc, double sl) { return ::Rf_rlogis(lc, sl); } 158 159 /* Non-central Beta Distribution */ dnbeta(double x,double a,double b,double ncp,int lg)160 inline double dnbeta(double x, double a, double b, double ncp, int lg) { return ::Rf_dnbeta(x, a, b, ncp, lg); } pnbeta(double x,double a,double b,double ncp,int lt,int lg)161 inline double pnbeta(double x, double a, double b, double ncp, int lt, int lg) { return ::Rf_pnbeta(x, a, b, ncp, lt, lg); } qnbeta(double p,double a,double b,double ncp,int lt,int lg)162 inline double qnbeta(double p, double a, double b, double ncp, int lt, int lg) { return ::Rf_qnbeta(p, a, b, ncp, lt, lg); } rnbeta(double a,double b,double np)163 inline double rnbeta(double a, double b, double np) { return ::Rf_rnbeta(a, b, np); } 164 165 /* Non-central F Distribution */ dnf(double x,double df1,double df2,double ncp,int lg)166 inline double dnf(double x, double df1, double df2, double ncp, int lg) { return ::Rf_dnf(x, df1, df2, ncp, lg); } pnf(double x,double df1,double df2,double ncp,int lt,int lg)167 inline double pnf(double x, double df1, double df2, double ncp, int lt, int lg) { return ::Rf_pnf(x, df1, df2, ncp, lt, lg); } qnf(double p,double df1,double df2,double ncp,int lt,int lg)168 inline double qnf(double p, double df1, double df2, double ncp, int lt, int lg) { return ::Rf_qnf(p, df1, df2, ncp, lt, lg); } 169 170 /* Non-central Student t Distribution */ dnt(double x,double df,double ncp,int lg)171 inline double dnt(double x, double df, double ncp, int lg) { return ::Rf_dnt(x, df, ncp, lg); } pnt(double x,double df,double ncp,int lt,int lg)172 inline double pnt(double x, double df, double ncp, int lt, int lg) { return ::Rf_pnt(x, df, ncp, lt, lg); } qnt(double p,double df,double ncp,int lt,int lg)173 inline double qnt(double p, double df, double ncp, int lt, int lg) { return ::Rf_qnt(p, df, ncp, lt, lg); } 174 175 /* Studentized Range Distribution */ ptukey(double q,double rr,double cc,double df,int lt,int lg)176 inline double ptukey(double q, double rr, double cc, double df, int lt, int lg) { return ::Rf_ptukey(q, rr, cc, df, lt, lg); } qtukey(double p,double rr,double cc,double df,int lt,int lg)177 inline double qtukey(double p, double rr, double cc, double df, int lt, int lg) { return ::Rf_qtukey(p, rr, cc, df, lt, lg); } 178 179 /* Wilcoxon Rank Sum Distribution */ dwilcox(double x,double m,double n,int lg)180 inline double dwilcox(double x, double m, double n, int lg) { return ::Rf_dwilcox(x, m, n, lg); } pwilcox(double q,double m,double n,int lt,int lg)181 inline double pwilcox(double q, double m, double n, int lt, int lg) { return ::Rf_pwilcox(q, m, n, lt, lg); } qwilcox(double x,double m,double n,int lt,int lg)182 inline double qwilcox(double x, double m, double n, int lt, int lg) { return ::Rf_qwilcox(x, m, n, lt, lg); } rwilcox(double m,double n)183 inline double rwilcox(double m, double n) { return ::Rf_rwilcox(m, n); } 184 185 /* Wilcoxon Signed Rank Distribution */ dsignrank(double x,double n,int lg)186 inline double dsignrank(double x, double n, int lg) { return ::Rf_dsignrank(x, n, lg); } psignrank(double x,double n,int lt,int lg)187 inline double psignrank(double x, double n, int lt, int lg) { return ::Rf_psignrank(x, n, lt, lg); } qsignrank(double x,double n,int lt,int lg)188 inline double qsignrank(double x, double n, int lt, int lg) { return ::Rf_qsignrank(x, n, lt, lg); } rsignrank(double n)189 inline double rsignrank(double n) { return ::Rf_rsignrank(n); } 190 191 /* Gamma and Related Functions */ gammafn(double x)192 inline double gammafn(double x) { return ::Rf_gammafn(x); } lgammafn(double x)193 inline double lgammafn(double x) { return ::Rf_lgammafn(x); } lgammafn_sign(double x,int * sgn)194 inline double lgammafn_sign(double x, int *sgn) { return ::Rf_lgammafn_sign(x, sgn); } dpsifn(double x,int n,int kode,int m,double * ans,int * nz,int * ierr)195 inline void dpsifn(double x, int n, int kode, int m, double *ans, int *nz, int *ierr) { return ::Rf_dpsifn(x, n, kode, m, ans, nz, ierr); } psigamma(double x,double deriv)196 inline double psigamma(double x, double deriv) { return ::Rf_psigamma(x, deriv); } digamma(double x)197 inline double digamma(double x) { return ::Rf_digamma(x); } trigamma(double x)198 inline double trigamma(double x) { return ::Rf_trigamma(x); } tetragamma(double x)199 inline double tetragamma(double x) { return ::Rf_tetragamma(x); } pentagamma(double x)200 inline double pentagamma(double x) { return ::Rf_pentagamma(x); } 201 beta(double a,double b)202 inline double beta(double a, double b) { return ::Rf_beta(a, b); } lbeta(double a,double b)203 inline double lbeta(double a, double b) { return ::Rf_lbeta(a, b); } 204 choose(double n,double k)205 inline double choose(double n, double k) { return ::Rf_choose(n, k); } lchoose(double n,double k)206 inline double lchoose(double n, double k) { return ::Rf_lchoose(n, k); } 207 208 /* Bessel Functions */ bessel_i(double x,double al,double ex)209 inline double bessel_i(double x, double al, double ex) { return ::Rf_bessel_i(x, al, ex); } bessel_j(double x,double al)210 inline double bessel_j(double x, double al) { return ::Rf_bessel_j(x, al); } bessel_k(double x,double al,double ex)211 inline double bessel_k(double x, double al, double ex) { return ::Rf_bessel_k(x, al, ex); } bessel_y(double x,double al)212 inline double bessel_y(double x, double al) { return ::Rf_bessel_y(x, al); } bessel_i_ex(double x,double al,double ex,double * bi)213 inline double bessel_i_ex(double x, double al, double ex, double *bi) { return ::Rf_bessel_i_ex(x, al, ex, bi); } bessel_j_ex(double x,double al,double * bj)214 inline double bessel_j_ex(double x, double al, double *bj) { return ::Rf_bessel_j_ex(x, al, bj); } bessel_k_ex(double x,double al,double ex,double * bk)215 inline double bessel_k_ex(double x, double al, double ex, double *bk) { return ::Rf_bessel_k_ex(x, al, ex, bk); } bessel_y_ex(double x,double al,double * by)216 inline double bessel_y_ex(double x, double al, double *by) { return ::Rf_bessel_y_ex(x, al, by); } 217 218 /* General Support Functions */ 219 #ifndef HAVE_HYPOT hypot(double a,double b)220 inline double hypot(double a, double b) { return ::Rf_hypot(a, b); } 221 #endif 222 /* Gone since R 2.14.0 according to Brian Ripley and is now comment out per his request */ 223 /* inline double pythag(double a, double b) { return ::Rf_pythag(a, b); } */ 224 #ifndef HAVE_EXPM1 225 inline double expm1(double x); /* = exp(x)-1 {care for small x} */ { return ::Rf_expm1(x); } 226 #endif 227 #ifndef HAVE_LOG1P 228 inline double log1p(double x); /* = log(1+x) {care for small x} */ { return ::Rf_log1p(x); } 229 #endif imax2(int x,int y)230 inline int imax2(int x, int y) { return ::Rf_imax2(x, y); } imin2(int x,int y)231 inline int imin2(int x, int y) { return ::Rf_imin2(x, y); } fmax2(double x,double y)232 inline double fmax2(double x, double y) { return ::Rf_fmax2(x, y); } fmin2(double x,double y)233 inline double fmin2(double x, double y) { return ::Rf_fmin2(x, y); } sign(double x)234 inline double sign(double x) { return ::Rf_sign(x); } fprec(double x,double dg)235 inline double fprec(double x, double dg) { return ::Rf_fprec(x, dg); } fround(double x,double dg)236 inline double fround(double x, double dg) { return ::Rf_fround(x, dg); } fsign(double x,double y)237 inline double fsign(double x, double y) { return ::Rf_fsign(x, y); } ftrunc(double x)238 inline double ftrunc(double x) { return ::Rf_ftrunc(x); } 239 240 } 241 242 #endif 243