On 21 November 2011 at 00:29, Jason Lessels wrote: | Hi List, | I was hoping that someone could possibly help me out with a problem I have. I am trying to use a Rcpp::List with the lbfgsb function provided by the R API. I have successfully replicated the example from help(optim), but was wondering if anyone could help me passing an Rcpp::List to the minimisation function. With my extremely limited c++ knowledge I don't know how to get around the void type of the function input, as the lbfgsb function requires the minimisation function to have the third parameter of type void. I have commented out the problem line in the fr function within the src.
The R API has only a C interface. Rcpp can help you to get values from R to your (C/C++ mixed) source code more easily. But at some point you have to unwrap the C++ data structures to their C equivalents as these are the only ones known to R and its plain-C API. Does that make sense? My RcppDE (draft) package is a rewrite of (an older version of) DEoptim using the Rcpp / RcppArmadillo paradigm. That may be of help, but I did some more advanced things there too as e.g. passing a C++ function down to be optimised by DEoptim. Dirk | Thanks | Jason | | library(inline) | library(RcppArmadillo) | inc<-' | #include <R_ext/Applic.h> | | double fr(int n, double *par, void *ex) { | double x1 = par[0]; | double x2 = par[1]; | // double blah = Rcpp::as<double>(ex["numbers"]); | return ( 100 * pow( ( x2 - x1 * x1 ) ,2.0 ) + pow ( ( 1 - x1 ) ,2.0 ) ); | } | void grr(int n, double *par, double *gr, void *ex) { | double x1 = par[0]; | double x2 = par[1]; | gr[0] = ( -400.0 * x1 * ( x2 - x1 * x1 ) - 2.0 * ( 1 - x1 ) ); | gr[1] = ( 200.0 * ( x2 - x1 * x1 ) ); | | } | | ' | | src<-' | Rcpp::List TheList(listIn); | double initial[2] = {0.8,1.0}; | double final; | int convergenceCode; | int trace = 6; | int fncount; | int grcount; | double lower[2] = {-1e+7,-1e+7}; | double upper[2] = {1e+7,1e+7}; | double pgtol = 0; | double factr = 1e-8; | int nbd[2] = {2,2}; | int lmm = 5; | int maxit = 100; | int nREPORT = 10; | char msg[100]; | | lbfgsb(2,lmm,initial,lower,upper,nbd,&final,fr,grr,&convergenceCode,TheList,factr,pgtol,&fncount,&grcount,maxit,msg,trace,nREPORT); | | /* std::cout << msg << std::endl; | std::cout << final << std::endl; | std::cout << convergenceCode << std::endl; | std::cout << initial[0]; | std::cout << initial[1] << std::endl; | */ | | Rcpp::NumericVector tes(initial,initial+2); | | return tes; | ' | | testing<-cxxfunction(signature(listIn="list"),src,includes=inc,plugin="RcppArmadillo") | testing(listIn=list(blah=100)) | | | _______________________________________________ | Rcpp-devel mailing list | Rcpp-devel@lists.r-forge.r-project.org | https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel -- "Outside of a dog, a book is a man's best friend. Inside of a dog, it is too dark to read." -- Groucho Marx _______________________________________________ Rcpp-devel mailing list Rcpp-devel@lists.r-forge.r-project.org https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel