我可以使用RcppNumerical在重复的一维集成中避开'抽象类')>

问题描述 投票:0回答:1

我正在寻找用于2D数值积分的确定性线程安全Rcpp算法。 RcppNumerical为古巴提供了多维集成的部分接口,但是从我的试验来看,RcppParallel在线程安全方面似乎并不安全,它可能使用了蒙特卡洛方法。那使我回到重复的一维积分上。我已经成功使用了R函数Rdqags(不是线程安全的),但是我的RcppNumerical代码(可能是幼稚的)无法编译,因为嵌套类是抽象的。可能是由于operator()虚函数。

任何人都可以在RcppNumerical中提出解决此问题的方法或其他替代方法吗?

我的模拟https://github.com/yixuan/RcppNumerical中2D示例的测试代码如下。它给出错误,例如

无法声明变量'f2'为抽象类型'Normal2'

无法声明变量'f1'为抽象类型'Normal1'

墨累

// [[Rcpp::depends(RcppEigen)]]
// [[Rcpp::depends(RcppNumerical)]]
#include <RcppNumerical.h>
using namespace Numer;

// P(a1 < X1 < b1, a2 < X2 < b2), (X1, X2) ~ N([0], [1   rho])
//                                            ([0], [rho   1])

class Normal2: public Func
{
private:
    const double rho;
    const double x;
    double const1;  // 2 * (1 - rho^2)
    double const2;  // 1 / (2 * PI) / sqrt(1 - rho^2)
public:
    Normal2(const double& rho_, const double& x_) : rho(rho_), x(x_)
    {
        const1 = 2.0 * (1.0 - rho * rho);
        const2 = 1.0 / (2 * M_PI) / std::sqrt(1.0 - rho * rho);
    }

    // PDF of bivariate normal
    double operator()(const double& y)
    {
        double z = x * x - 2 * rho * x * y + y * y;
        return const2 * std::exp(-z / const1);
    }
};


class Normal1: public Func
{
private:
    const double rho;
    double a2, b2;
public:
    Normal1(const double& rho_, const double& a2_, const double& b2_) : rho(rho_), a2(a2_), b2(b2_) {}

    // integral in y dimension for given x
    double operator()(const double& x)
    {
        Normal2 f2(rho, x);
        double err_est;
        int err_code;
        const double res = integrate(f2, a2, b2, err_est, err_code);
        return res;
    }
};

// [[Rcpp::export]]
Rcpp::List integrate_test3()
{
    double a1 = -1.0;
    double b1 =  1.0;
    double a2 = -1.0;
    double b2 =  1.0;
    Normal1 f1(0.5, a2, b2);  // rho = 0.5

    double err_est;
    int err_code;
    const double res = integrate(f1, a1, b1, err_est, err_code);
    return Rcpp::List::create(
        Rcpp::Named("approximate") = res,
        Rcpp::Named("error_estimate") = err_est,
        Rcpp::Named("error_code") = err_code
    );
}

我正在寻找用于2D数值积分的确定性线程安全Rcpp算法。 RcppNumerical为古巴提供了多维集成的部分接口,但是根据我的试验,...

rcpp rcppparallel
1个回答
0
投票

Numer::Func类是抽象类,因为有一个未定义的方法:

© www.soinside.com 2019 - 2024. All rights reserved.