Как использовать C ++ 17 или C ++ 2a с Rcpp - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь использовать sourceCpp, но я хочу использовать C ++ 17 или C ++ 2a.Вот мой файл .cpp:

#include <Rcpp.h>
#include "../include/brownian_bridge_min.hpp"
#include "../include/inverse_gauss.hpp"

using namespace Rcpp;

// [[Rcpp::plugins(cpp17)]]

// [[Rcpp::export]]
double M_function(const double &a, const double &x, const double &y, const double &s, const double &t) {
  // M function that is used to simulate a minimum of a Brownian bridge
  return exp(-2.0 * (a-x) * (a-y) / (t-s));
}

// [[Rcpp::export]]
std::array<double, 2> min_sampler(const double &x, const double &y,
                                  const double &s, const double &t,
                                  const double &low_bound, const double &up_bound,
                                  std::mt19937 &RNG)
{
  // function simulates a minimum of a Brownian bridge between (low_bound) and (up_bound)
  // first element returned is the simulated minimum
  // second element returned is the simulated time which the minimum occurs

  // calculate bounds for u1
  double low_M {M_function(low_bound, x, y, s, t)};
  double up_M {M_function(up_bound, x, y, s, t)};

  // simulate uniform random variables
  std::uniform_real_distribution<double> u1(low_M, up_M);
  std::uniform_real_distribution<double> u2(0.0, 1.0);

  // set simulated minimum value
  double min {x - (0.5*(sqrt((y-x)*(y-x) - 2.0*(t-s)*log(u1(RNG))) - y + x))};

  // condition for setting V
  double condition {(x-min)/(x+y-(2.0*min))};
  // simulating from Inverse Gaussian
  double mu, lambda, V;
  if (u2(RNG) < condition) {
    mu = (y-min)/(x-min);
    lambda = (y-min)*(y-min)/(t-s);
    V = inv_gauss_sampler(mu, lambda, RNG);
  } else {
    mu = (x-min)/(y-min);
    lambda = (x-min)*(x-min)/(t-s);
    V = 1.0 / inv_gauss_sampler(mu, lambda, RNG);
  }

  // set tau (time of simualted minimum)
  double tau{((s*V)+t)/(1.0+V)};
  // setting simulated minimum and tau in array
  std::array<double, 2> simulated_min {min, tau};

  return simulated_min;
}

Если я не пытаюсь указать требуемый стандарт C ++, я получаю следующие синтаксические ошибки:

brownian_bridge_rcpp.cpp: 34: 15: ошибка: ожидается ';'в конце объявления double low_M {M_function (low_bound, x, y, s, t)};

Но этот тип инициализации хорош.Я пытался использовать: '// [[Rcpp :: plugins (cpp17)]]'

в моем файле .cpp, но теперь получаю следующую ошибку:

error: invalid value 'gnu ++ 17 'in' -std = gnu ++ 17 'make: *** [brownian_bridge_rcpp.o] Ошибка 1 / usr / local / clang4 / bin / clang ++ -std = gnu ++ 17 -I "/ Library /Frameworks / R.framework / Resources / include "-DNDEBUG -I" /Users/rchan/Library/R/3.5/library/Rcpp/include "-I" / Users / rchan / OneDrive - Институт Алана Тьюринга / freefor7 / bessel_layers_cpp/ R "-I / usr / local / include -fPIC -Wall -g -O2 -c brownian_bridge_rcpp.cpp -o brownian_bridge_rcpp.o Ошибка в Rcpp :: sourceCpp (" brownian_bridge_rcpp.cpp "): Ошибка 1 при создании общей библиотеки.

Кто-нибудь знает, как я могу это исправить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...