Rcpp Version 0.9.10
rcauchy.h
Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Friends Defines