[Rcpp-devel] Error detected in Rcpp module wrapper (fixed with patch)
Tama Ma
pingnang at phys.ethz.ch
Sun Dec 5 17:51:58 CET 2010
Dear Dirk and Romain,
Here is my fix. The bug is in l.37 of <Rcpp/module/Module_generated_Constructor.h>:
instead of:
return new Class ;
it should be:
return new Class() ;
Anyway, the patch attached removes this bug.
Thank you very much.
Best regards,
Tama Ma
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: patch-r2721.txt
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20101205/298b348f/attachment.txt>
-------------- next part --------------
On Dec 5, 2010, at 5:33 PM, Tama Ma wrote:
> Hi Dirk,
>
>
> On Dec 5, 2010, at 4:02 PM, Dirk Eddelbuettel wrote:
>
>>
>> Hi Tama,
>>
>> On 5 December 2010 at 15:36, Tama Ma wrote:
>> | 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?
>>
>> I just got in from a run in the snow and have a bunch of errands to run parts
>> of the day so I may not get to this ... but if you're into Black/Scholes via
>> FDE, did you look at QuantLib (www.quantlib.org) and RQuantLib (my site, and
>> CRAN)? Maybe you'd like to contribute to the latter.... I have a some plans
>> on adding Rcpp modules to the mix.
>>
>
>
> Good luck to the snow. Anyway, I am more interested in the Rcpp module wrapper than the finance simulation. Hmm, I have located the problem anyway.
>
> The problem lies in the declaration of the empty constructor, with the description as follows.
> (Let me see if I can help to remove this bug from Rcpp itself.)
>
> Thank you very much!
>
> Best regards,
> Tama Ma
>
>
> <src/rcpp-test/rcpp-test-R-module.C>
> ==========================
> #include <Rcpp.h>
>
> 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 ;
> };
>
> }
>
>
> RCPP_MODULE(gold){
>
> Rcpp::class_<gold::Uniform<double> >( "Uniform" )
>
> .constructor()
> .constructor<double>()
> .constructor<double,double>()
>
> .property( "max", &gold::Uniform<double>::max )
> .property( "min", &gold::Uniform<double>::min )
> ;
>
> }
>
>
> Tama-Mas-MacBook-Pro:code tamama$ make test
> g++ -dynamiclib -I/Users/tamama/Work/acedemic/eth/computational-finance/option-pricing-introduction/code/include -I/opt/local/include -I/opt/local/lib/R/include -I/opt/local/lib/R/include/x86_64 -I/opt/local/share/R-packages/Rcpp-svn/pkg/Rcpp/inst/include -o /Users/tamama/Work/acedemic/eth/computational-finance/option-pricing-introduction/code/lib/test.so /Users/tamama/Work/acedemic/eth/computational-finance/option-pricing-introduction/code/src/rcpp-test/rcpp-test-R-module.C -L/opt/local/lib -lblitz -framework veclib -L/opt/local/lib/R/lib/x86_64 -lR -lRblas -lRlapack -L/opt/local/share/R-packages/Rcpp-svn/pkg/Rcpp/inst/lib/x86_64 -lRcpp
> Tama-Mas-MacBook-Pro:code tamama$ vi src/rcpp-test/rcpp-test-R-module.C
> Tama-Mas-MacBook-Pro:code tamama$ vi src/rcpp-test/rcpp-test-R-module.C
> Tama-Mas-MacBook-Pro:code tamama$ make test
> g++ -dynamiclib -I/Users/tamama/Work/acedemic/eth/computational-finance/option-pricing-introduction/code/include -I/opt/local/include -I/opt/local/lib/R/include -I/opt/local/lib/R/include/x86_64 -I/opt/local/share/R-packages/Rcpp-svn/pkg/Rcpp/inst/include -o /Users/tamama/Work/acedemic/eth/computational-finance/option-pricing-introduction/code/lib/test.so /Users/tamama/Work/acedemic/eth/computational-finance/option-pricing-introduction/code/src/rcpp-test/rcpp-test-R-module.C -L/opt/local/lib -lblitz -framework veclib -L/opt/local/lib/R/lib/x86_64 -lR -lRblas -lRlapack -L/opt/local/share/R-packages/Rcpp-svn/pkg/Rcpp/inst/lib/x86_64 -lRcpp
> Tama-Mas-MacBook-Pro:code tamama$ cd lib/
> Tama-Mas-MacBook-Pro:lib tamama$ ls
> gold.so* test.so*
> Tama-Mas-MacBook-Pro:lib 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.
>
>> require(dyn)
> Loading required package: dyn
> Loading required package: zoo
>> require(Rcpp)
> Loading required package: Rcpp
>> dll = dyn.load("test.so")
>> gold = Module( "gold", dll)
>> Uniform = gold$Uniform
>> u = new (Uniform, 10, 20)
>> u$min
> [1] 7.410985e-323
>>
>
> Thank you very much.
>
> Best regards,
> Tama Ma
>
>
>
>
>
>
>
>
>
>> Cheers, Dirk
>>
>> |
>> | 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
>>
>> --
>> Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com
>>
>
> _______________________________________________
> 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