Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // [[Rcpp::depends(RcppArmadillo)]]
- #include <RcppArmadillo.h>
- using namespace arma;
- Rcpp::NumericVector objfun(SEXP xs, SEXP env)
- {
- vec x = Rcpp::as<vec>(xs);
- Rcpp::Environment e = Rcpp::as<Rcpp::Environment>(env);
- int funIdx = Rcpp::as<int>(e["funIdx"]);
- Rcpp::NumericVector out(1);
- switch (funIdx) {
- case 0: {
- double p1 = (x[0] + 2*x[1] - 7);
- double p2 = (2*x[0] + x[1] - 5);
- out[0] = p1*p1 + p2*p2;
- break;
- }
- case 1: {
- out[0] = sum(square(x.subvec(0, 1)))*0.26 - 0.48 * prod(x.subvec(0, 1));
- break;
- }
- case 2: {
- out[0] = sum(square(x));
- break;
- }
- }
- return out;
- }
- Rcpp::NumericVector gradfun(SEXP xs, SEXP env)
- {
- vec x = Rcpp::as<vec>(xs);
- Rcpp::Environment e = Rcpp::as<Rcpp::Environment>(env);
- int funIdx = Rcpp::as<int>(e["funIdx"]);
- int size = funIdx == 2 ? x.n_elem : 2;
- Rcpp::NumericVector out(size);
- switch (funIdx) {
- case 0: {
- double p1 = (x[0] + 2*x[1] - 7);
- double p2 = (2*x[0] + x[1] - 5);
- out[0] = 2*p1 + 4*p2;
- out[1] = 4*p1 + 2*p2;
- break;
- }
- case 1: {
- out[0] = 0.52 * x[0] - 0.48 * x[1];
- out[1] = 0.52 * x[0] - 0.48 * x[1];
- break;
- }
- case 2: {
- out = 2 * x;
- break;
- }
- }
- return out;
- }
- typedef Rcpp::NumericVector (*funcPtr)(SEXP, SEXP);
- // [[Rcpp::export]]
- Rcpp::XPtr<funcPtr> objfunExtPtr(){
- return Rcpp::XPtr<funcPtr>( new funcPtr(&objfun) );
- }
- // [[Rcpp::export]]
- Rcpp::XPtr<funcPtr> gradfunExtPtr(){
- return Rcpp::XPtr<funcPtr>( new funcPtr(&gradfun) );
- }
Add Comment
Please, Sign In to add comment