[Rcpp-commits] r359 - in pkg/inst/examples: . ConvolveBenchmarks

noreply at r-forge.r-project.org noreply at r-forge.r-project.org
Tue Jan 12 20:43:13 CET 2010


Author: edd
Date: 2010-01-12 20:43:13 +0100 (Tue, 12 Jan 2010)
New Revision: 359

Added:
   pkg/inst/examples/ConvolveBenchmarks/
   pkg/inst/examples/ConvolveBenchmarks/buildAndRun.sh
   pkg/inst/examples/ConvolveBenchmarks/convolve2.R
   pkg/inst/examples/ConvolveBenchmarks/convolve2_c.c
   pkg/inst/examples/ConvolveBenchmarks/convolve2_cpp.cpp
   pkg/inst/examples/ConvolveBenchmarks/exampleRCode.r
Log:
add beginnings of convolve2 benchmarks


Added: pkg/inst/examples/ConvolveBenchmarks/buildAndRun.sh
===================================================================
--- pkg/inst/examples/ConvolveBenchmarks/buildAndRun.sh	                        (rev 0)
+++ pkg/inst/examples/ConvolveBenchmarks/buildAndRun.sh	2010-01-12 19:43:13 UTC (rev 359)
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+# build the shared library for the C variant
+R CMD SHLIB convolve2_c.c
+
+# build the shared library for the C++ variant
+# we have to let R know where the Rcpp header and library are
+export PKG_CPPFLAGS=`r -e "Rcpp:::CxxFlags()"`
+export PKG_LIBS=`r -e "Rcpp:::LdFlags()"`
+R CMD SHLIB convolve2_cpp.cpp
+
+# call R so that we get an interactive session
+Rscript exampleRCode.r 
\ No newline at end of file


Property changes on: pkg/inst/examples/ConvolveBenchmarks/buildAndRun.sh
___________________________________________________________________
Name: svn:executable
   + *

Added: pkg/inst/examples/ConvolveBenchmarks/convolve2.R
===================================================================
--- pkg/inst/examples/ConvolveBenchmarks/convolve2.R	                        (rev 0)
+++ pkg/inst/examples/ConvolveBenchmarks/convolve2.R	2010-01-12 19:43:13 UTC (rev 359)
@@ -0,0 +1,6 @@
+#!/usr/bin/r -t
+
+## Section 5.10.1 of 'Writing R Extensions' has a simple .Call example
+## for convolution which we are rewriting here
+
+

Added: pkg/inst/examples/ConvolveBenchmarks/convolve2_c.c
===================================================================
--- pkg/inst/examples/ConvolveBenchmarks/convolve2_c.c	                        (rev 0)
+++ pkg/inst/examples/ConvolveBenchmarks/convolve2_c.c	2010-01-12 19:43:13 UTC (rev 359)
@@ -0,0 +1,24 @@
+
+/* This is from 'Writing R Extensions' section 5.10.1 */
+
+#include <R.h>
+#include <Rdefines.h>
+
+SEXP convolve2(SEXP a, SEXP b)
+{
+    int i, j, na, nb, nab;
+    double *xa, *xb, *xab;
+    SEXP ab;
+
+    PROTECT(a = AS_NUMERIC(a));
+    PROTECT(b = AS_NUMERIC(b));
+    na = LENGTH(a); nb = LENGTH(b); nab = na + nb - 1;
+    PROTECT(ab = NEW_NUMERIC(nab));
+    xa = NUMERIC_POINTER(a); xb = NUMERIC_POINTER(b);
+    xab = NUMERIC_POINTER(ab);
+    for(i = 0; i < nab; i++) xab[i] = 0.0;
+    for(i = 0; i < na; i++)
+	for(j = 0; j < nb; j++) xab[i + j] += xa[i] * xb[j];
+    UNPROTECT(3);
+    return(ab);
+}

Added: pkg/inst/examples/ConvolveBenchmarks/convolve2_cpp.cpp
===================================================================
--- pkg/inst/examples/ConvolveBenchmarks/convolve2_cpp.cpp	                        (rev 0)
+++ pkg/inst/examples/ConvolveBenchmarks/convolve2_cpp.cpp	2010-01-12 19:43:13 UTC (rev 359)
@@ -0,0 +1,24 @@
+// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8 -*-
+
+// This is a rewrite of the 'Writing R Extensions' section 5.10.1 example
+
+#include <Rcpp.h>
+
+RcppExport SEXP convolve2cpp(SEXP a, SEXP b)
+{
+    RcppVector<double> xa(a);
+    RcppVector<double> xb(b);
+
+    int nab = xa.size() + xb.size() - 1;
+
+    RcppVector<double> xab(nab);
+    for (int i = 0; i < nab; i++) xab(i) = 0.0;
+
+    for (int i = 0; i < xa.size(); i++)
+	for (int j = 0; j < xb.size(); j++) 
+	    xab(i + j) += xa(i) * xb(j);
+
+    RcppResultSet rs;
+    rs.add("ab", xab);
+    return rs.getReturnList();
+}

Added: pkg/inst/examples/ConvolveBenchmarks/exampleRCode.r
===================================================================
--- pkg/inst/examples/ConvolveBenchmarks/exampleRCode.r	                        (rev 0)
+++ pkg/inst/examples/ConvolveBenchmarks/exampleRCode.r	2010-01-12 19:43:13 UTC (rev 359)
@@ -0,0 +1,33 @@
+#!/usr/bin/r
+
+set.seed(42)
+a <- rnorm(100)
+b <- rnorm(100)
+
+## load shared library with wrapper code and callback class
+dyn.load("convolve2_c.so")
+
+## call the wrapper function provided in the shared library
+v1 <- .Call("convolve2", a, b)
+t1 <- system.time(replicate(1000, .Call("convolve2", a, b)))
+
+## load shared library with wrapper code and callback class
+dyn.load("convolve2_cpp.so")
+
+## call the wrapper function provided in the shared library
+v2 <- .Call("convolve2cpp", a, b)[[1]]
+t2 <- system.time(replicate(1000, .Call("convolve2cpp", a, b)))
+
+print(t1)
+print(t2)
+print(summary(v1))
+print(summary(v2))
+print(all.equal(v1, v2))
+
+
+
+
+
+
+
+



More information about the Rcpp-commits mailing list