[Rcpp-devel] Linking Rcpp and libcmaes within a package

Marie-Pierre ETIENNE marie.etienne at agroparistech.fr
Fri May 1 16:12:35 CEST 2015


Dear Rcpp and R developpers, 

I have recently used Rcpp to build a package and found it very well documented and easy as I don't need to go very deep in Writing R extensions mechanisms. 
My code uses an optimisation algorithm named cmaes, and this use was first made through a cmaes R package. As my function to be optimized depends on some Monte Carlo simulations performed using functions written in C++ this procedure requires a lot of exchange between R and C++ ( basically every step of cmaes calls a c++ function), which is of course not very efficient. 
So I would like to use the cmaes library libcmaes available on https://github.com/beniz/libcmaes to perform the optimization within the C++ code. 
I have tried the examples provided in the github repository and I am able to build and run them, so I assume that the cmaes library is correctly installed (in /usr/local) 
Then I have decided to embed the very simple example in R to check if I can use CMAES from R. I have built a toy package for that. 
This packahe only has a test.cpp file in directory src/ which is exactly the sample-code.cpp example but using NumericVector instead of std::vector<>. (presented below) 

I have tried to add the correct compilation option in the Makevars (even far to be portable for now) 


CXX_STD = CXX11 
PKG_CPPFLAGS=-I/usr/local/include/libcmaes -I../inst/include -I/usr/local/include/eigen3/ 
PKG_LIBS = -L/usr/local/lib -l cmaes`$(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()"` 


Everything seems fine except that the shared library cmaes.so.0 is not in the expected directory when loading the R package. Any help would be very much appreciated 

Cheers 

Marie 

Here is the log of the build (made using RStudio) 



==> R CMD INSTALL --preclean --no-multiarch --with-keep.source testCMaes 

* installing to library ‘/home/metienne/R/x86_64-pc-linux-gnu-library/3.1’ 
* installing *source* package ‘testCMaes’ ... 
** libs 
g++ -std=c++0x -I/usr/share/R/include -DNDEBUG -I/usr/local/include/libcmaes -I../inst/include -I/usr/local/include/eigen3/ -I"/home/metienne/R/x86_64-pc-linux-gnu-library/3.1/Rcpp/include" -fpic -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security -D_FORTIFY_SOURCE=2 -g -c RcppExports.cpp -o RcppExports.o 
g++ -std=c++0x -I/usr/share/R/include -DNDEBUG -I/usr/local/include/libcmaes -I../inst/include -I/usr/local/include/eigen3/ -I"/home/metienne/R/x86_64-pc-linux-gnu-library/3.1/Rcpp/include" -fpic -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security -D_FORTIFY_SOURCE=2 -g -c test.cpp -o test.o 
g++ -std=c++0x -shared -Wl,-Bsymbolic-functions -Wl,-z,relro -o testCMaes.so RcppExports.o test.o -L/usr/local/lib -l cmaes -L/usr/lib/R/lib -lR 
installing to /home/metienne/R/x86_64-pc-linux-gnu-library/3.1/testCMaes/libs 
** R 
** preparing package for lazy loading 
** help 
Warning: /home/metienne/EnCours/testCMaes/man/testCMaes-package.Rd:30: All text must be in a section 
Warning: /home/metienne/EnCours/testCMaes/man/testCMaes-package.Rd:31: All text must be in a section 
*** installing help indices 
** building package indices 
** testing if installed package can be loaded 
Error in dyn.load(file, DLLpath = DLLpath, ...) : 
unable to load shared object '/home/metienne/R/x86_64-pc-linux-gnu-library/3.1/testCMaes/libs/testCMaes.so': 
libcmaes.so.0: cannot open shared object file: No such file or directory 
Error: loading failed 
Execution halted 
ERROR: loading failed 
* removing ‘/home/metienne/R/x86_64-pc-linux-gnu-library/3.1/testCMaes’ 







Here is the test.cpp file 



#include <cmaes.h> 
#include <cmastrategy.h> 
#include <llogging.h> 
#include <Rcpp.h> 

using namespace Rcpp; 
using namespace libcmaes; 





libcmaes::FitFunc cigtab = [](const double *x, const int N) 
{ 
int i; 
double sum = 1e4*x[0]*x[0] + 1e-4*x[1]*x[1]; 
for(i = 2; i < N; ++i) 
sum += x[i]*x[i]; 
return sum; 
}; 

// [[Rcpp::export]] 
int test(const NumericVector x0, const NumericVector sigma) 
{ 

int dim = x0.size(); 
std::vector<double> x0_stl= Rcpp::as<std::vector<double> >(x0); 
std::vector<double> sigma_stl = Rcpp::as<std::vector<double> >(sigma); 

int lambda = x0.size(); 
CMAParameters<> cmaparams(x0_stl,sigma_stl,lambda); 
ESOptimizer<CMAStrategy<CovarianceUpdate>,CMAParameters<>> cmaes(cigtab,cmaparams); 
cmaes.optimize(); 
double edm = cmaes.edm(); 
std::cerr << "EDM=" << edm << " / EDM/fm=" << edm / cmaes.get_solutions().best_candidate().get_fvalue() << std::endl; 
}; 

Marie-Pierre Etienne 
AgroParistech /INRA UMR 518 MIA 
marie.etienne at agroparistech.fr 
http://mpetienne.org 
Tel : 01 44 08 86 82 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20150501/8e3c77e9/attachment.html>


More information about the Rcpp-devel mailing list