[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