<div dir="ltr"><div>Dear rcpp-devel,</div><div> </div><div>I have been working for some time on an R package to perform simulation and inference for stochastic differential equations (SDEs).  Due to a large number of serial calculations, I have achieved a speed-up of several orders of magnitude by writing most of the code in C++.  However, for the useR to work with his or her own SDE, it is necessary to modify a very small portion of the C++ code and then recompile it.  The C++ code looks something like this:<br>
<br>double useRsde(double x) {<br>  // stuff<br></div><div>}<br><br><br><br></div><div>extern "C" {<br></div><div>  void sdeSim(double *y, double *x, int *N) {<br></div><div>    // do stuff requiring useRsde<br>
</div>    return;<br><div>  }<br><br></div><div>  void sdePost(double *y, double *x, int *N) {<br></div><div>    // do stuff requiring useRsde<br></div><div>   return;<br></div><div>  }<br></div><div>}<br></div><div><div>
<div><br><br></div><div>This all goes into a DLL which gets called from R:<br><br></div><div>sde.sim <- function(arg1, arg2, ...) {<br></div><div>  # do a bunch of preprocessing of the args<br></div><div>  dyn.load("sdeMain.dll")<br>
</div><div>  ans <- .C("sdeSim", as.double(y), as.double(x), as.integer(N))<br></div><div>  ans$y<br></div><div>}<br></div><div><br><div>sde.post <- function(arg1, arg2, ...) {<br></div><div>  # do a bunch of preprocessing of the args<br>
</div><div>  dyn.load("sdeMain.dll")<br></div><div>  ans <- .C("sdePost", as.double(y), as.double(x), as.integer(N))<br></div><div>  ans$y<br></div><div>}<br></div><br><br>I would like to create an R function called "make.sde.model" which works like this:<br>
<br></div><div>make.sde.model <- function(<a href="http://model.name/" target="_blank"><font color="#0066cc">model.name</font></a>, useRcode) {<br></div><div>  # compile DLL, create functions sde.sim and sde.post which are individually renamed<br>
</div><div>}<br><br></div><div><a href="http://model.name/" target="_blank"><font color="#0066cc">model.name</font></a> <- "cir"<br></div><div>useRcode <- "character string of c++ code"<br><br></div>
<div>make.sde.model(<a href="http://model.name/" target="_blank"><font color="#0066cc">model.name</font></a>, useRcode)<br><br></div><div>cir.sim(x0, theta, N, dt)<br><br></div><div>cir.post(x0, theta0, nsamples)<br></div>
<div><br><br></div>In other words, make.sde.model created cir.sim and cir.post, which are copies of the generic functions sde.sim and sde.post, but which call the right DLL.<br><br></div><div>As it stands, I am:<br><br>- not able to automatically create the cir.sim and cir.post functions.  I copy-paste large blocks of code every time I use a new SDE model.<br>
</div><div>- more importantly, not able to compile the C++ code from within R.  I'm not comfortable enough to navigate my way around the "system" calls, and I would not expect anything that works on my computer to work for anyone else, especially if they are on a different OS...<br>
<br><br></div><div>I've spent a good amount of time looking at the "Inline" package.  I'd really like to use it to do most the of the C++ compiling magic.  There's tons of documentation and help for it online.  I figure if the useR can get a simple "return R_NilValue" function to compile then they should be able to compile my code as well (it's really nothing fancy: no external libraries or even header files).  Also, the function "setCmethod" seems to create the R functions silently exactly as I would like.  However, I can't quite figure out how to put all the pieces together using Inline.  Specifically, I'm not sure how to best combine the R preprocessing steps with Inline's capabilities.  I guess I could potentially do all the processing in C++, but there's quite a bit of it to do and it really doesn't seem like the right place to do it...<br>
<br>I would very much appreciate if you would care to answer the following questions:<br><br></div><div>1.  Can I use Inline (or any of the tools in the Rcpp suite) to achieve the effect I desire?<br></div><div>2.  Can you think of any problems with the implementation I've described, i.e. horrible consequences to an unsuspecting useR?<br>
</div><div>3.  If the answers to 1 and 2 are No and Yes, could you please suggest as to how I should proceed?<br></div><div><div><br><br>Thank you very much for your time.<br><br>Best wishes,</div><div> </div><div>Antoine</div>
</div></div></div>