|
Rcpp Version 0.9.10
|
00001 // -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 4 -*- 00002 // 00003 // dpq.h: Rcpp R/C++ interface class library -- normal distribution 00004 // 00005 // Copyright (C) 2010 - 2011 Dirk Eddelbuettel and Romain Francois 00006 // 00007 // This file is part of Rcpp. 00008 // 00009 // Rcpp is free software: you can redistribute it and/or modify it 00010 // under the terms of the GNU General Public License as published by 00011 // the Free Software Foundation, either version 2 of the License, or 00012 // (at your option) any later version. 00013 // 00014 // Rcpp is distributed in the hope that it will be useful, but 00015 // WITHOUT ANY WARRANTY; without even the implied warranty of 00016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00017 // GNU General Public License for more details. 00018 // 00019 // You should have received a copy of the GNU General Public License 00020 // along with Rcpp. If not, see <http://www.gnu.org/licenses/>. 00021 00022 #ifndef Rcpp__stats__dpq__dpq_h 00023 #define Rcpp__stats__dpq__dpq_h 00024 00025 #include <Rcpp/stats/dpq/macros.h> 00026 00027 namespace Rcpp { 00028 namespace stats { 00029 00030 // D 00031 00032 template <int RTYPE, bool NA, typename T> 00033 class D0 : public Rcpp::VectorBase< REALSXP, NA, D0<RTYPE,NA,T> > { 00034 public: 00035 typedef typename Rcpp::VectorBase<RTYPE,NA,T> VEC_TYPE ; 00036 typedef double (*FunPtr)(double,int) ; 00037 00038 D0( FunPtr ptr_, const VEC_TYPE& vec_, bool log_ ) : 00039 ptr(ptr_), vec(vec_), log(log_) {} 00040 00041 inline double operator[]( int i) const { 00042 return ptr( vec[i], log ); 00043 } 00044 00045 inline int size() const { return vec.size(); } 00046 00047 private: 00048 FunPtr ptr ; 00049 const VEC_TYPE& vec; 00050 int log; 00051 } ; 00052 00053 template <int RTYPE, bool NA, typename T> 00054 class D1 : public Rcpp::VectorBase< REALSXP, NA, D1<RTYPE,NA,T> > { 00055 public: 00056 typedef typename Rcpp::VectorBase<RTYPE,NA,T> VEC_TYPE ; 00057 typedef double (*FunPtr)(double,double,int) ; 00058 00059 D1( FunPtr ptr_, const VEC_TYPE& vec_, double p0_ , bool log_) : 00060 ptr(ptr_), vec(vec_), p0(p0_), log(log_) {} 00061 00062 inline double operator[]( int i) const { 00063 return ptr( vec[i], p0, log ); 00064 } 00065 00066 inline int size() const { return vec.size(); } 00067 00068 private: 00069 FunPtr ptr ; 00070 const VEC_TYPE& vec; 00071 double p0 ; 00072 int log; 00073 } ; 00074 00075 template <int RTYPE, bool NA, typename T> 00076 class D2 : public Rcpp::VectorBase< REALSXP, NA, D2<RTYPE,NA,T> > { 00077 public: 00078 typedef typename Rcpp::VectorBase<RTYPE,NA,T> VEC_TYPE ; 00079 typedef double (*FunPtr)(double,double,double,int) ; 00080 00081 D2( FunPtr ptr_, const VEC_TYPE& vec_, double p0_, double p1_ , bool log_) : 00082 ptr(ptr_), vec(vec_), p0(p0_), p1(p1_), log(log_) {} 00083 00084 inline double operator[]( int i) const { 00085 return ptr( vec[i], p0, p1, log ); 00086 } 00087 00088 inline int size() const { return vec.size(); } 00089 00090 private: 00091 FunPtr ptr ; 00092 const VEC_TYPE& vec; 00093 double p0, p1 ; 00094 int log; 00095 } ; 00096 00097 template <int RTYPE, bool NA, typename T> 00098 class D3 : public Rcpp::VectorBase< REALSXP, NA, D3<RTYPE,NA,T> > { 00099 public: 00100 typedef typename Rcpp::VectorBase<RTYPE,NA,T> VEC_TYPE ; 00101 typedef double (*FunPtr)(double,double,double,double,int) ; 00102 00103 D3( FunPtr ptr_, const VEC_TYPE& vec_, double p0_, double p1_, double p2_ , bool log_ ) : 00104 ptr(ptr_), vec(vec_), p0(p0_), p1(p1_), p2(p2_), log(log_) {} 00105 00106 inline double operator[]( int i) const { 00107 return ptr( vec[i], p0, p1, p2, log ); 00108 } 00109 00110 inline int size() const { return vec.size(); } 00111 00112 private: 00113 FunPtr ptr ; 00114 const VEC_TYPE& vec; 00115 double p0, p1, p2 ; 00116 int log; 00117 } ; 00118 00119 // P 00120 00121 00122 template <int RTYPE, bool NA, typename T> 00123 class P0 : public Rcpp::VectorBase< REALSXP, NA, P0<RTYPE,NA,T> >{ 00124 public: 00125 typedef typename Rcpp::VectorBase<RTYPE,NA,T> VEC_TYPE ; 00126 typedef double (*FunPtr)(double,int,int) ; 00127 00128 P0( FunPtr ptr_, const VEC_TYPE& vec_, 00129 bool lower_tail = true, bool log_ = false ) : 00130 ptr(ptr_), vec(vec_), lower(lower_tail), log(log_) {} 00131 00132 inline double operator[]( int i) const { 00133 return ptr( vec[i], lower, log ); 00134 } 00135 00136 inline int size() const { return vec.size(); } 00137 00138 private: 00139 FunPtr ptr ; 00140 const VEC_TYPE& vec; 00141 int lower, log; 00142 00143 }; 00144 00145 00146 template <int RTYPE, bool NA, typename T> 00147 class P1 : public Rcpp::VectorBase< REALSXP, NA, P1<RTYPE,NA,T> >{ 00148 public: 00149 typedef typename Rcpp::VectorBase<RTYPE,NA,T> VEC_TYPE ; 00150 typedef double (*FunPtr)(double,double,int,int) ; 00151 00152 P1( FunPtr ptr_, const VEC_TYPE& vec_, double p0_, 00153 bool lower_tail = true, bool log_ = false ) : 00154 ptr(ptr_), vec(vec_), p0(p0_), lower(lower_tail), log(log_) {} 00155 00156 inline double operator[]( int i) const { 00157 return ptr( vec[i], p0, lower, log ); 00158 } 00159 00160 inline int size() const { return vec.size(); } 00161 00162 private: 00163 FunPtr ptr ; 00164 const VEC_TYPE& vec; 00165 double p0 ; 00166 int lower, log; 00167 00168 }; 00169 00170 00171 template <int RTYPE, bool NA, typename T> 00172 class P2 : public Rcpp::VectorBase< REALSXP, NA, P2<RTYPE,NA,T> >{ 00173 public: 00174 typedef typename Rcpp::VectorBase<RTYPE,NA,T> VEC_TYPE ; 00175 typedef double (*FunPtr)(double,double,double,int,int) ; 00176 00177 P2( FunPtr ptr_, const VEC_TYPE& vec_, double p0_, double p1_, 00178 bool lower_tail = true, bool log_ = false ) : 00179 ptr(ptr_), vec(vec_), p0(p0_), p1(p1_), lower(lower_tail), log(log_) {} 00180 00181 inline double operator[]( int i) const { 00182 return ptr( vec[i], p0, p1, lower, log ); 00183 } 00184 00185 inline int size() const { return vec.size(); } 00186 00187 private: 00188 FunPtr ptr ; 00189 const VEC_TYPE& vec; 00190 double p0, p1 ; 00191 int lower, log; 00192 00193 }; 00194 00195 template <int RTYPE, bool NA, typename T> 00196 class P3 : public Rcpp::VectorBase< REALSXP, NA, P3<RTYPE,NA,T> >{ 00197 public: 00198 typedef typename Rcpp::VectorBase<RTYPE,NA,T> VEC_TYPE ; 00199 typedef double (*FunPtr)(double,double,double,double,int,int) ; 00200 00201 P3( FunPtr ptr_, const VEC_TYPE& vec_, double p0_, double p1_, double p2_, 00202 bool lower_tail = true, bool log_ = false ) : 00203 ptr(ptr_), vec(vec_), p0(p0_), p1(p1_), p2(p2_), lower(lower_tail), log(log_) {} 00204 00205 inline double operator[]( int i) const { 00206 return ptr( vec[i], p0, p1, p2, lower, log ); 00207 } 00208 00209 inline int size() const { return vec.size(); } 00210 00211 private: 00212 FunPtr ptr ; 00213 const VEC_TYPE& vec; 00214 double p0, p1,p2 ; 00215 int lower, log; 00216 00217 }; 00218 00219 // Q 00220 00221 00222 template <int RTYPE, bool NA, typename T> 00223 class Q0 : public Rcpp::VectorBase< REALSXP, NA, Q0<RTYPE,NA,T> >{ 00224 public: 00225 typedef typename Rcpp::VectorBase<RTYPE,NA,T> VEC_TYPE ; 00226 typedef double (*FunPtr)(double,int,int) ; 00227 00228 Q0( FunPtr ptr_, const VEC_TYPE& vec_, 00229 bool lower_tail = true, bool log_ = false ) : 00230 ptr(ptr_), vec(vec_), lower(lower_tail), log(log_) {} 00231 00232 inline double operator[]( int i) const { 00233 return ptr( vec[i], lower, log ); 00234 } 00235 00236 inline int size() const { return vec.size(); } 00237 00238 private: 00239 FunPtr ptr ; 00240 const VEC_TYPE& vec; 00241 int lower, log; 00242 00243 }; 00244 00245 template <int RTYPE, bool NA, typename T> 00246 class Q1 : public Rcpp::VectorBase< REALSXP, NA, Q1<RTYPE,NA,T> >{ 00247 public: 00248 typedef typename Rcpp::VectorBase<RTYPE,NA,T> VEC_TYPE ; 00249 typedef double (*FunPtr)(double,double,int,int) ; 00250 00251 Q1( FunPtr ptr_, const VEC_TYPE& vec_, double p0_, 00252 bool lower_tail = true, bool log_ = false ) : 00253 ptr(ptr_), vec(vec_), p0(p0_), lower(lower_tail), log(log_) {} 00254 00255 inline double operator[]( int i) const { 00256 return ptr( vec[i], p0, lower, log ); 00257 } 00258 00259 inline int size() const { return vec.size(); } 00260 00261 private: 00262 FunPtr ptr ; 00263 const VEC_TYPE& vec; 00264 double p0 ; 00265 int lower, log; 00266 00267 }; 00268 00269 template <int RTYPE, bool NA, typename T> 00270 class Q2 : public Rcpp::VectorBase< REALSXP, NA, Q2<RTYPE,NA,T> >{ 00271 public: 00272 typedef typename Rcpp::VectorBase<RTYPE,NA,T> VEC_TYPE ; 00273 typedef double (*FunPtr)(double,double,double,int,int) ; 00274 00275 Q2( FunPtr ptr_, const VEC_TYPE& vec_, double p0_, double p1_, 00276 bool lower_tail = true, bool log_ = false ) : 00277 ptr(ptr_), vec(vec_), p0(p0_), p1(p1_), lower(lower_tail), log(log_) {} 00278 00279 inline double operator[]( int i) const { 00280 return ptr( vec[i], p0, p1, lower, log ); 00281 } 00282 00283 inline int size() const { return vec.size(); } 00284 00285 private: 00286 FunPtr ptr ; 00287 const VEC_TYPE& vec; 00288 double p0, p1 ; 00289 int lower, log; 00290 00291 }; 00292 00293 template <int RTYPE, bool NA, typename T> 00294 class Q3 : public Rcpp::VectorBase< REALSXP, NA, Q3<RTYPE,NA,T> >{ 00295 public: 00296 typedef typename Rcpp::VectorBase<RTYPE,NA,T> VEC_TYPE ; 00297 typedef double (*FunPtr)(double,double,double,double,int,int) ; 00298 00299 Q3( FunPtr ptr_, const VEC_TYPE& vec_, double p0_, double p1_, double p2_, 00300 bool lower_tail = true, bool log_ = false ) : 00301 ptr(ptr_), vec(vec_), p0(p0_), p1(p1_), p2(p2_), lower(lower_tail), log(log_) {} 00302 00303 inline double operator[]( int i) const { 00304 return ptr( vec[i], p0, p1, p2, lower, log ); 00305 } 00306 00307 inline int size() const { return vec.size(); } 00308 00309 private: 00310 FunPtr ptr ; 00311 const VEC_TYPE& vec; 00312 double p0, p1, p2 ; 00313 int lower, log; 00314 00315 }; 00316 00317 00318 } // stats 00319 } // Rcpp 00320 00321 #define RCPP_DPQ_0(__NAME__,__D__,__P__,__Q__) \ 00322 namespace Rcpp { \ 00323 template <int RTYPE, bool NA, typename T> \ 00324 inline stats::D0<RTYPE,NA,T> d##__NAME__( \ 00325 const Rcpp::VectorBase<RTYPE,NA,T>& x, bool log = false \ 00326 ) { \ 00327 return stats::D0<RTYPE,NA,T>( __D__, x, log ); \ 00328 } \ 00329 template <int RTYPE, bool NA, typename T> \ 00330 inline stats::P0<RTYPE,NA,T> p##__NAME__( \ 00331 const Rcpp::VectorBase<RTYPE,NA,T>& x, bool lower = true, bool log = false \ 00332 ) { \ 00333 return stats::P0<RTYPE,NA,T>( __P__, x, lower, log ); \ 00334 } \ 00335 template <int RTYPE, bool NA, typename T> \ 00336 inline stats::Q0<RTYPE,NA,T> q##__NAME__( \ 00337 const Rcpp::VectorBase<RTYPE,NA,T>& x, bool lower = true, bool log = false \ 00338 ) { \ 00339 return stats::Q0<RTYPE,NA,T>( __Q__, x, lower, log ); \ 00340 } } 00341 00342 00343 #define RCPP_DPQ_1(__NAME__,__D__,__P__,__Q__) \ 00344 namespace Rcpp { \ 00345 template <int RTYPE, bool NA, typename T> \ 00346 inline stats::D1<RTYPE,NA,T> d##__NAME__( \ 00347 const Rcpp::VectorBase<RTYPE,NA,T>& x, double p0, bool log = false \ 00348 ) { \ 00349 return stats::D1<RTYPE,NA,T>( __D__, x, p0, log ); \ 00350 } \ 00351 template <int RTYPE, bool NA, typename T> \ 00352 inline stats::P1<RTYPE,NA,T> p##__NAME__( \ 00353 const Rcpp::VectorBase<RTYPE,NA,T>& x, double p0, bool lower = true, bool log = false \ 00354 ) { \ 00355 return stats::P1<RTYPE,NA,T>( __P__, x, p0, lower, log ); \ 00356 } \ 00357 template <int RTYPE, bool NA, typename T> \ 00358 inline stats::Q1<RTYPE,NA,T> q##__NAME__( \ 00359 const Rcpp::VectorBase<RTYPE,NA,T>& x, double p0, bool lower = true, bool log = false \ 00360 ) { \ 00361 return stats::Q1<RTYPE,NA,T>( __Q__, x, p0, lower, log ); \ 00362 } } 00363 00364 00365 00366 #define RCPP_DPQ_2(__NAME__,__D__,__P__,__Q__) \ 00367 namespace Rcpp { \ 00368 template <int RTYPE, bool NA, typename T> \ 00369 inline stats::D2<RTYPE,NA,T> d##__NAME__( \ 00370 const Rcpp::VectorBase<RTYPE,NA,T>& x, double p0, double p1, bool log = false \ 00371 ) { \ 00372 return stats::D2<RTYPE,NA,T>( __D__, x, p0, p1, log ); \ 00373 } \ 00374 template <int RTYPE, bool NA, typename T> \ 00375 inline stats::P2<RTYPE,NA,T> p##__NAME__( \ 00376 const Rcpp::VectorBase<RTYPE,NA,T>& x, double p0, double p1, bool lower = true, bool log = false \ 00377 ) { \ 00378 return stats::P2<RTYPE,NA,T>( __P__, x, p0, p1, lower, log ); \ 00379 } \ 00380 template <int RTYPE, bool NA, typename T> \ 00381 inline stats::Q2<RTYPE,NA,T> q##__NAME__( \ 00382 const Rcpp::VectorBase<RTYPE,NA,T>& x, double p0, double p1, bool lower = true, bool log = false \ 00383 ) { \ 00384 return stats::Q2<RTYPE,NA,T>( __Q__, x, p0, p1, lower, log ); \ 00385 } } 00386 00387 00388 00389 #define RCPP_DPQ_3(__NAME__,__D__,__P__,__Q__) \ 00390 namespace Rcpp { \ 00391 template <int RTYPE, bool NA, typename T> \ 00392 inline stats::D3<RTYPE,NA,T> d##__NAME__( \ 00393 const Rcpp::VectorBase<RTYPE,NA,T>& x, double p0, double p1, double p2, bool log = false \ 00394 ) { \ 00395 return stats::D3<RTYPE,NA,T>( __D__, x, p0, p1, p2, log ); \ 00396 } \ 00397 template <int RTYPE, bool NA, typename T> \ 00398 inline stats::P3<RTYPE,NA,T> p##__NAME__( \ 00399 const Rcpp::VectorBase<RTYPE,NA,T>& x, double p0, double p1, double p2, bool lower = true, bool log = false \ 00400 ) { \ 00401 return stats::P3<RTYPE,NA,T>( __P__, x, p0, p1, p2, lower, log ); \ 00402 } \ 00403 template <int RTYPE, bool NA, typename T> \ 00404 inline stats::Q3<RTYPE,NA,T> q##__NAME__( \ 00405 const Rcpp::VectorBase<RTYPE,NA,T>& x, double p0, double p1, double p2, bool lower = true, bool log = false \ 00406 ) { \ 00407 return stats::Q3<RTYPE,NA,T>( __Q__, x, p0, p1, p2, lower, log ); \ 00408 } } 00409 00410 00411 #endif