[Rcpp-devel] Error detected in Rcpp module wrapper

Tama Ma pingnang at phys.ethz.ch
Sun Dec 5 19:57:41 CET 2010


Hi Romain,

	I agree with you that for fast development, inline looks more attractive. 
	Thank you for sharing!

Best regards,
Tama Ma



On Dec 5, 2010, at 6:09 PM, Romain Francois wrote:

> Tama,
> 
> While I'm on the subject (sorry it takes three emails), you might like using the inline package for rapid development. For example, you uniform example can be written, entirely in R :
> 
> require(inline)
> require(Rcpp)
> 
> fx <- cxxfunction( , '', includes = '
> 
> namespace gold {
> 
> template <class T>
> class Uniform {
> public:
> 
>  Uniform() { }
>  Uniform(T min_)         : _min(min_) { }
>  Uniform(T min_, T max_) : _min(min_), _max(max_){ }
> 
>  T min()  { return _min; }
>  T max()  { return _max; }
> 
> private:
>    T _min, _max ;
> };
> 
> }
> 
> typedef gold::Uniform<double> Uniform_double ;
> 
> RCPP_MODULE(gold){
> 
>    Rcpp::class_<Uniform_double>( "Uniform" )
> 
>        .constructor()
>        .constructor<double>()
>        .constructor<double,double>()
> 
>        .property( "max", &Uniform_double::max )
>        .property( "min", &Uniform_double::min )
>  ;
> 
> }
> ', plugin = "Rcpp" )
> populate( Module( "gold", getDynLib(fx), mustStart = TRUE ), globalenv() )
> u = new (Uniform, 10, 20)
> u$min
> u$max
> 
> 
> Romain
> 
> Le 05/12/10 18:04, Romain Francois a écrit :
>> Hi,
>> 
>> You might also notice that the .C suffix is no longer supported in R for
>> C++ files because of case insensitive OS.
>> 
>> When you include your code in a package, you should rename the files .cpp
>> 
>> Romain
>> 
>> Le 05/12/10 15:36, Tama Ma a écrit :
>>> Dear Rcpp developers,
>>> 
>>> I have written the following BlackScholesCallFiniteDifference class
>>> in<include/black-scholes/black-scholes-call-finite-difference.hpp>,
>>> with the Rcpp module wrapper
>>> in<src/black-scholes/black-scholes-call-finite-difference-R-module.C>.
>>> Then, I compile successfully using g++ (version 4.4) compiler
>>> to<lib/gold.so>, to be called within R. There, I met with some
>>> problem, given in the error log as follows. Is there any quick
>>> solution, or can I help?
>>> 
>>> Thank you very much.
>>> 
>>> Best regards,
>>> Tama Ma
>>> 
>>> 
>>> 
>>> error log
>>> =======
>>> 
>>> Tama-Mas-MacBook-Pro:R tamama$ R
>>> 
>>> R version 2.12.0 (2010-10-15)
>>> Copyright (C) 2010 The R Foundation for Statistical Computing
>>> ISBN 3-900051-07-0
>>> Platform: x86_64-apple-darwin10.5.0/x86_64 (64-bit)
>>> 
>>> R is free software and comes with ABSOLUTELY NO WARRANTY.
>>> You are welcome to redistribute it under certain conditions.
>>> Type 'license()' or 'licence()' for distribution details.
>>> 
>>> R is a collaborative project with many contributors.
>>> Type 'contributors()' for more information and
>>> 'citation()' on how to cite R or R packages in publications.
>>> 
>>> Type 'demo()' for some demos, 'help()' for on-line help, or
>>> 'help.start()' for an HTML browser interface to help.
>>> Type 'q()' to quit R.
>>> 
>>>> source("gold.R")
>>> Loading required package: dyn
>>> Loading required package: zoo
>>> Loading required package: Rcpp
>>>> ls()
>>> [1] "BlackScholesCallFiniteDifference" "E"
>>> [3] "GOLD_DYLIB" "GOLD_DYLIB_NAME"
>>> [5] "GOLD_DYLIB_PATH" "gold"
>>> [7] "r" "sigma"
>>> [9] "simulation"
>>>> cat(E,sep="\n")
>>> 1
>>>> cat(sigma,sep="\n")
>>> 0.2
>>>> cat(r,sep="\n")
>>> 0.1
>>>> 
>>>> 
>>>> simulation$E
>>> [1] 2.134972e-314
>>>> simulation$sigma
>>> [1] 2.143981e-314
>>>> simulation$r
>>> [1] 1.561247e-321
>>>> 
>>> 
>>> 
>>> [ Now, obviously, this is wrong. ]
>>> 
>>> 
>>> 
>>> <R/gold.R>
>>> =========
>>> 
>>> require(dyn)
>>> require(Rcpp)
>>> 
>>> GOLD_DYLIB_NAME = "gold"
>>> GOLD_DYLIB_PATH = "../lib"
>>> GOLD_DYLIB = paste(GOLD_DYLIB_PATH, "/", GOLD_DYLIB_NAME, ".so", sep="")
>>> 
>>> gold = Module("gold", dyn.load(GOLD_DYLIB))
>>> BlackScholesCallFiniteDifference = gold$BlackScholesCallFiniteDifference
>>> 
>>> E = 1.0;
>>> sigma = 0.2;
>>> r = 0.1;
>>> 
>>> simulation = new(BlackScholesCallFiniteDifference, E, sigma, r);
>>> 
>>> 
>>> 
>>> 
>>> <src/black-scholes/black-scholes-call-finite-difference-R-module.C>
>>> ====================================================
>>> 
>>> #include<iostream>
>>> #include<cmath>
>>> 
>>> #include<Rcpp.h>
>>> 
>>> #include "black-scholes/black-scholes-call-finite-difference.hpp"
>>> 
>>> 
>>> RCPP_MODULE(gold)
>>> {
>>> Rcpp::class_<Gold::BlackScholesCallFiniteDifference<unsigned int, int,
>>> double> >("BlackScholesCallFiniteDifference")
>>> .constructor()
>>> .constructor<double, double, double>()
>>> .constructor<double, double, double, unsigned int, unsigned int,
>>> double, double>()
>>> 
>>> .property("E",&Gold::BlackScholesCallFiniteDifference<unsigned int,
>>> int, double>::E)
>>> .property("sigma",&Gold::BlackScholesCallFiniteDifference<unsigned
>>> int, int, double>::sigma)
>>> .property("r",&Gold::BlackScholesCallFiniteDifference<unsigned int,
>>> int, double>::r)
>>> 
>>> ;
>>> }
>>> 
>>> 
>>> 
>>> <include/black-scholes/black-scholes-call-finite-difference.hpp>
>>> =======================================
>>> 
>>> #ifndef BLACK_SCHOLES_CALL_FINITE_DIFFERENCE_HPP
>>> #define BLACK_SCHOLES_CALL_FINITE_DIFFERENCE_HPP
>>> 
>>> #include<iostream>
>>> #include<cmath>
>>> #include<algorithm>
>>> #include<numeric>
>>> 
>>> #include<blitz/array.h>
>>> #include<blitz/tinyvec-et.h>
>>> 
>>> 
>>> namespace Gold {
>>> 
>>> template<class S1, class S2, class T>
>>> class BlackScholesCallFiniteDifference
>>> {
>>> public:
>>> typedef S1 size_type;
>>> typedef S1 index_type;
>>> typedef S2 blitz_size_type;
>>> typedef S2 blitz_index_type;
>>> typedef T parm_type;
>>> typedef T asset_type;
>>> typedef T option_type;
>>> typedef T tau_type;
>>> 
>>> asset_type E() { return _E; }
>>> parm_type sigma() { return _sigma; }
>>> parm_type r() { return _r; }
>>> 
>>> BlackScholesCallFiniteDifference()
>>> : _initialized (false)
>>> , _simulated (false)
>>> {}
>>> 
>>> BlackScholesCallFiniteDifference(asset_type E_, parm_type sigma_,
>>> parm_type r_)
>>> : _initialized(false)
>>> , _simulated(false)
>>> , _E(E_)
>>> , _sigma(sigma_)
>>> , _r(r_)
>>> {}
>>> 
>>> private:
>>> bool _initialized;
>>> bool _simulated;
>>> asset_type _E;
>>> parm_type _sigma;
>>> parm_type _r;
>>> };
>>> 
>>> }
>>> 
>>> #endif
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> _______________________________________________
>>> Rcpp-devel mailing list
>>> Rcpp-devel at lists.r-forge.r-project.org
>>> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
>>> 
>> 
>> 
> 
> 
> -- 
> Romain Francois
> Professional R Enthusiast
> +33(0) 6 28 91 30 30
> http://romainfrancois.blog.free.fr
> |- http://bit.ly/gpCSpH : Evolution of Rcpp code size
> |- http://bit.ly/hovakS : RcppGSL initial release
> `- http://bit.ly/iaxTdO : parser 0.0-12
> 
> 
> _______________________________________________
> Rcpp-devel mailing list
> Rcpp-devel at lists.r-forge.r-project.org
> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
> 



More information about the Rcpp-devel mailing list