celestialgod

test for lbfgs (objfunExtPtr.cpp)

Dec 29th, 2016
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.53 KB | None | 0 0
  1. // [[Rcpp::depends(RcppArmadillo)]]
  2. #include <RcppArmadillo.h>
  3. using namespace arma;
  4.  
  5. Rcpp::NumericVector objfun(SEXP xs, SEXP env)
  6. {
  7.   vec x = Rcpp::as<vec>(xs);
  8.   Rcpp::Environment e = Rcpp::as<Rcpp::Environment>(env);
  9.   int funIdx = Rcpp::as<int>(e["funIdx"]);
  10.   Rcpp::NumericVector out(1);
  11.   switch (funIdx) {
  12.   case 0: {
  13.     double p1 = (x[0] + 2*x[1] - 7);
  14.     double p2 = (2*x[0] + x[1] - 5);
  15.     out[0] = p1*p1 + p2*p2;
  16.     break;
  17.   }
  18.   case 1: {
  19.     out[0] = sum(square(x.subvec(0, 1)))*0.26 - 0.48 * prod(x.subvec(0, 1));
  20.     break;
  21.   }
  22.   case 2: {
  23.     out[0] = sum(square(x));
  24.     break;
  25.   }
  26.   }
  27.   return out;
  28. }
  29.  
  30. Rcpp::NumericVector gradfun(SEXP xs, SEXP env)
  31. {
  32.   vec x = Rcpp::as<vec>(xs);
  33.   Rcpp::Environment e = Rcpp::as<Rcpp::Environment>(env);
  34.   int funIdx = Rcpp::as<int>(e["funIdx"]);
  35.   int size = funIdx == 2 ? x.n_elem : 2;
  36.   Rcpp::NumericVector out(size);
  37.   switch (funIdx) {
  38.   case 0: {
  39.     double p1 = (x[0] + 2*x[1] - 7);
  40.     double p2 = (2*x[0] + x[1] - 5);
  41.     out[0] = 2*p1 + 4*p2;
  42.     out[1] = 4*p1 + 2*p2;
  43.     break;
  44.   }
  45.   case 1: {
  46.     out[0] = 0.52 * x[0] - 0.48 * x[1];
  47.     out[1] = 0.52 * x[0] - 0.48 * x[1];
  48.     break;
  49.   }
  50.   case 2: {
  51.     out = 2 * x;
  52.     break;
  53.   }
  54.   }
  55.   return out;
  56. }
  57.  
  58. typedef Rcpp::NumericVector (*funcPtr)(SEXP, SEXP);
  59.  
  60. // [[Rcpp::export]]
  61. Rcpp::XPtr<funcPtr> objfunExtPtr(){
  62.   return Rcpp::XPtr<funcPtr>( new funcPtr(&objfun) );
  63. }
  64.  
  65. // [[Rcpp::export]]
  66. Rcpp::XPtr<funcPtr> gradfunExtPtr(){
  67.   return Rcpp::XPtr<funcPtr>( new funcPtr(&gradfun) );
  68. }
Add Comment
Please, Sign In to add comment