|
Rcpp Version 0.9.10
|
00001 // -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 4 -*- 00002 // 00003 // rcauchy.h: Rcpp R/C++ interface class library -- 00004 // 00005 // Copyright (C) 2010 - 2011 Douglas Bates, 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__random_rcauchy_h 00023 #define Rcpp__stats__random_rcauchy_h 00024 00025 namespace Rcpp { 00026 namespace stats { 00027 00028 class CauchyGenerator : public ::Rcpp::Generator<false,double> { 00029 public: 00030 00031 CauchyGenerator( double location_, double scale_) : 00032 location(location_) , scale(scale_) {} 00033 00034 inline double operator()() const { 00035 return location + scale * ::tan(M_PI * unif_rand()) ; 00036 } 00037 00038 private: 00039 double location, scale ; 00040 } ; 00041 00042 class CauchyGenerator_1 : public ::Rcpp::Generator<false,double> { 00043 public: 00044 00045 CauchyGenerator_1( double location_) : 00046 location(location_){} 00047 00048 inline double operator()() const { 00049 return location + ::tan(M_PI * unif_rand()) ; 00050 } 00051 00052 private: 00053 double location ; 00054 } ; 00055 00056 class CauchyGenerator_0 : public ::Rcpp::Generator<false,double> { 00057 public: 00058 00059 CauchyGenerator_0(){} 00060 00061 inline double operator()() const { 00062 return ::tan(M_PI * unif_rand()) ; 00063 } 00064 00065 } ; 00066 00067 } // stats 00068 00069 // perhaps this should go to a cpp file 00070 00071 // Please make sure you to read Section 6.3 of "Writing R Extensions" 00072 // about the need to call GetRNGstate() and PutRNGstate() when using 00073 // the random number generators provided by R. 00074 inline NumericVector rcauchy( int n, double location, double scale ){ 00075 if (ISNAN(location) || !R_FINITE(scale) || scale < 0) 00076 return NumericVector( n, R_NaN ) ; 00077 00078 if (scale == 0. || !R_FINITE(location)) 00079 return NumericVector( n, location ) ; 00080 00081 return NumericVector( n, stats::CauchyGenerator( location, scale ) ) ; 00082 } 00083 00084 // Please make sure you to read Section 6.3 of "Writing R Extensions" 00085 // about the need to call GetRNGstate() and PutRNGstate() when using 00086 // the random number generators provided by R. 00087 inline NumericVector rcauchy( int n, double location /* , double scale [=1.0] */ ){ 00088 if (ISNAN(location)) 00089 return NumericVector( n, R_NaN ) ; 00090 00091 if (!R_FINITE(location)) 00092 return NumericVector( n, location ) ; 00093 00094 return NumericVector( n, stats::CauchyGenerator_1( location ) ) ; 00095 } 00096 00097 // Please make sure you to read Section 6.3 of "Writing R Extensions" 00098 // about the need to call GetRNGstate() and PutRNGstate() when using 00099 // the random number generators provided by R. 00100 inline NumericVector rcauchy( int n /*, double location [=0.0] , double scale [=1.0] */ ){ 00101 return NumericVector( n, stats::CauchyGenerator_0() ) ; 00102 } 00103 00104 } // Rcpp 00105 00106 #endif