[Rcpp-devel] Error detected in Rcpp module wrapper
Tama Ma
pingnang at phys.ethz.ch
Sun Dec 5 17:33:56 CET 2010
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
>
More information about the Rcpp-devel
mailing list