[Rcpp-commits] r3022 - pkg/playground
noreply at r-forge.r-project.org
noreply at r-forge.r-project.org
Tue Apr 26 20:57:57 CEST 2011
Author: romain
Date: 2011-04-26 20:57:56 +0200 (Tue, 26 Apr 2011)
New Revision: 3022
Added:
pkg/playground/RandomPromise.h
pkg/playground/random.h
pkg/playground/rnorm.h
Log:
something to play with when I'm bored
Added: pkg/playground/RandomPromise.h
===================================================================
--- pkg/playground/RandomPromise.h (rev 0)
+++ pkg/playground/RandomPromise.h 2011-04-26 18:57:56 UTC (rev 3022)
@@ -0,0 +1,60 @@
+// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 4 -*-
+//
+// RandomPromise.h: Rcpp R/C++ interface class library --
+//
+// Copyright (C) 2010 - 2011 Douglas Bates, Dirk Eddelbuettel and Romain Francois
+//
+// This file is part of Rcpp.
+//
+// Rcpp is free software: you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 2 of the License, or
+// (at your option) any later version.
+//
+// Rcpp is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Rcpp. If not, see <http://www.gnu.org/licenses/>.
+
+#ifndef Rcpp__stats__RandomPromise_h
+#define Rcpp__stats__RandomPromise_h
+
+namespace Rcpp {
+ namespace stats {
+
+ template < double Func(void) >
+ class RandomPromise_0 : public VectorBase<REALSXP,true,RandomPromise_0<Func> > {
+ public:
+ RandomPromise_0(int n_) : n(n_){}
+
+ inline double operator[]( int i ) const {
+ return Func() ;
+ }
+ inline int size() const { return n ; }
+
+ private:
+ int n ;
+ } ;
+
+ template < double Func(double) >
+ class RandomPromise_1 : public VectorBase<REALSXP,true,RandomPromise_1<Func> > {
+ public:
+ RandomPromise_1(int n_, double x0_ ) : n(n_), x0(x0_){}
+
+ inline double operator[]( int i ) const {
+ return Func(x0) ;
+ }
+ inline int size() const { return n ; }
+
+ private:
+ int n ;
+ double x0 ;
+ } ;
+
+ } // stats
+} // Rcpp
+
+#endif
Added: pkg/playground/random.h
===================================================================
--- pkg/playground/random.h (rev 0)
+++ pkg/playground/random.h 2011-04-26 18:57:56 UTC (rev 3022)
@@ -0,0 +1,49 @@
+// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 4 -*-
+//
+// random.h: Rcpp R/C++ interface class library --
+//
+// Copyright (C) 2010 - 2011 Douglas Bates, Dirk Eddelbuettel and Romain Francois
+//
+// This file is part of Rcpp.
+//
+// Rcpp is free software: you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 2 of the License, or
+// (at your option) any later version.
+//
+// Rcpp is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Rcpp. If not, see <http://www.gnu.org/licenses/>.
+
+#ifndef Rcpp__stats__random_random_h
+#define Rcpp__stats__random_random_h
+
+#include <Rcpp/stats/random/RandomPromise.h>
+
+#include <Rcpp/stats/random/rnorm.h>
+#include <Rcpp/stats/random/runif.h>
+#include <Rcpp/stats/random/rgamma.h>
+#include <Rcpp/stats/random/rbeta.h>
+#include <Rcpp/stats/random/rlnorm.h>
+#include <Rcpp/stats/random/rchisq.h>
+#include <Rcpp/stats/random/rnchisq.h>
+#include <Rcpp/stats/random/rf.h>
+#include <Rcpp/stats/random/rt.h>
+#include <Rcpp/stats/random/rbinom.h>
+#include <Rcpp/stats/random/rcauchy.h>
+#include <Rcpp/stats/random/rexp.h>
+#include <Rcpp/stats/random/rgeom.h>
+#include <Rcpp/stats/random/rnbinom.h>
+#include <Rcpp/stats/random/rnbinom_mu.h>
+#include <Rcpp/stats/random/rpois.h>
+#include <Rcpp/stats/random/rweibull.h>
+#include <Rcpp/stats/random/rlogis.h>
+#include <Rcpp/stats/random/rwilcox.h>
+#include <Rcpp/stats/random/rsignrank.h>
+#include <Rcpp/stats/random/rhyper.h>
+
+#endif
Added: pkg/playground/rnorm.h
===================================================================
--- pkg/playground/rnorm.h (rev 0)
+++ pkg/playground/rnorm.h 2011-04-26 18:57:56 UTC (rev 3022)
@@ -0,0 +1,121 @@
+// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 4 -*-
+//
+// rnorm.h: Rcpp R/C++ interface class library --
+//
+// Copyright (C) 2010 - 2011 Douglas Bates, Dirk Eddelbuettel and Romain Francois
+//
+// This file is part of Rcpp.
+//
+// Rcpp is free software: you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 2 of the License, or
+// (at your option) any later version.
+//
+// Rcpp is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Rcpp. If not, see <http://www.gnu.org/licenses/>.
+
+#ifndef Rcpp__stats__random_norm_h
+#define Rcpp__stats__random_norm_h
+
+namespace Rcpp {
+ namespace stats {
+
+ class NormGenerator : public Generator<false,double> {
+ public:
+
+ NormGenerator( double mean_ = 0.0 , double sd_ = 1.0 ) :
+ mean(mean_), sd(sd_) {}
+
+ inline double operator()() const {
+ return mean + sd * ::norm_rand() ;
+ }
+
+ private:
+ double mean ;
+ double sd ;
+ } ;
+
+
+ class NormGenerator__sd1 : public Generator<false,double> {
+ public:
+
+ NormGenerator__sd1( double mean_ = 0.0 ) : mean(mean_) {}
+
+ inline double operator()() const {
+ return mean + ::norm_rand() ;
+ }
+
+ private:
+ double mean ;
+ } ;
+
+
+ class NormGenerator__mean0 : public Generator<false,double> {
+ public:
+
+ NormGenerator__mean0( double sd_ = 1.0 ) : sd(sd_) {}
+
+ inline double operator()() const {
+ return sd * ::norm_rand() ;
+ }
+
+ private:
+ double sd ;
+ } ;
+
+
+ } // stats
+
+ // Please make sure you to read Section 6.3 of "Writing R Extensions"
+ // about the need to call GetRNGstate() and PutRNGstate() when using
+ // the random number generators provided by R.
+ inline NumericVector rnorm( int n, double mean, double sd){
+ if (ISNAN(mean) || !R_FINITE(sd) || sd < 0.){
+ // TODO: R also throws a warning in that case, should we ?
+ return NumericVector( n, R_NaN ) ;
+ } else if (sd == 0. || !R_FINITE(mean)){
+ return NumericVector( n, mean ) ;
+ } else {
+ bool sd1 = sd == 1.0 ;
+ bool mean0 = mean == 0.0 ;
+ if( sd1 && mean0 ){
+ return NumericVector( n, norm_rand ) ;
+ } else if( sd1 ){
+ return NumericVector( n, stats::NormGenerator__sd1( mean ) );
+ } else if( mean0 ){
+ return NumericVector( n, stats::NormGenerator__mean0( sd ) );
+ } else {
+ // general case
+ return NumericVector( n, stats::NormGenerator( mean, sd ) );
+ }
+ }
+ }
+
+ // helper function
+ inline double norm_rand__sd1( double mean ){
+ return mean + ::norm_rand() ;
+ }
+
+ // Please make sure you to read Section 6.3 of "Writing R Extensions"
+ // about the need to call GetRNGstate() and PutRNGstate() when using
+ // the random number generators provided by R.
+ inline stats::RandomPromise_1<norm_rand__sd1>
+ rnorm( int n, double mean /*, double sd [=1.0] */ ){
+ return stats::RandomPromise_1<norm_rand__sd1>( n, mean ) ;
+ }
+
+ // Please make sure you to read Section 6.3 of "Writing R Extensions"
+ // about the need to call GetRNGstate() and PutRNGstate() when using
+ // the random number generators provided by R.
+ inline stats::RandomPromise_0<norm_rand> rnorm( int n /*, double mean [=0.0], double sd [=1.0] */ ){
+ return stats::RandomPromise_0<norm_rand>( n ) ;
+ }
+
+} // Rcpp
+
+#endif
More information about the Rcpp-commits
mailing list