Bootstrap modal 并行引导
我假设,或者更确切地说是希望,我有一个单一的可以解决的问题,或者可能有许多较小的问题,应该放弃。无论哪种方式,我对Rcpp都比较陌生,对并行计算一无所知,无法在线找到解决方案 问题通常是,R或R中的一个“致命错误”被卡在一个循环中,大约10次迭代5分钟,而非并行版本将在同一时间进行5K次迭代,粗略地说 由于该算法适用于一个更大的项目,我调用了其他几个函数,这些函数都在Rcpp中,我仅使用“arma”对象重写它们,因为这似乎有助于其他人。我还使用我在Rcpp中编写的“热图”优化器运行了优化部分,同样只在“arma”中运行,没有任何改进-我还应该指出这是作为“arma::vec”返回的Bootstrap modal 并行引导,bootstrap-modal,rcpp,armadillo,rcppparallel,Bootstrap Modal,Rcpp,Armadillo,Rcppparallel,我假设,或者更确切地说是希望,我有一个单一的可以解决的问题,或者可能有许多较小的问题,应该放弃。无论哪种方式,我对Rcpp都比较陌生,对并行计算一无所知,无法在线找到解决方案 问题通常是,R或R中的一个“致命错误”被卡在一个循环中,大约10次迭代5分钟,而非并行版本将在同一时间进行5K次迭代,粗略地说 由于该算法适用于一个更大的项目,我调用了其他几个函数,这些函数都在Rcpp中,我仅使用“arma”对象重写它们,因为这似乎有助于其他人。我还使用我在Rcpp中编写的“热图”优化器运行了优化部分,同
// [[Rcpp::depends("RcppArmadillo")]]
// [[Rcpp::depends("RcppParallel")]]
#include <RcppArmadillo.h>
#include <RcppParallel.h>
using namespace Rcpp;
using namespace std;
using namespace arma;
using namespace RcppParallel;
struct Boot_Worker : public Worker {
//Generate Inputs
// Source vector to keep track of the number of bootstraps
const arma::vec Boot_reps;
// Initial non-linear theta parameter values
const arma::vec init_val;
// Decimal date vector
const arma::colvec T_series;
// Generate the price series observational vector
const arma::colvec Y_est;
const arma::colvec Y_res;
// Generate the optimization constants
const arma::mat U;
const arma::colvec C;
const int N;
// Generate Output Matrix
arma::mat Boots_out;
// Initialize with the proper input and output
Boot_Worker( const arma::vec Boot_reps, const arma::vec init_val, const arma::colvec T_series, const arma::colvec Y_est, const arma::colvec Y_res, const arma::mat U, const arma::colvec C, const int N, arma::mat Boots_out)
: Boot_reps(Boot_reps), init_val(init_val), T_series(T_series), Y_est(Y_est), Y_res(Y_res), U(U), C(C), N(N), Boots_out(Boots_out) {}
void operator()(std::size_t begin, std::size_t end){
//load necessary stuffs from around
Rcpp::Environment stats("package:stats");
Rcpp::Function constrOptim = stats["constrOptim"];
Rcpp::Function SDK_pred_mad( "SDK_pred_mad");
arma::mat fake_data(N,2);
arma::colvec index(N);
for(unsigned int i = begin; i < end; i ++){
// Need a nested loop to create and fill the fake data matrix
arma::vec pool = arma::regspace(0, N-1) ;
std::random_shuffle(pool.begin(), pool.end());
for(int k = 0; k <= N-1; k++){
fake_data(k, 0) = Y_est[k] + Y_res[ pool[k] ];
fake_data(k, 1) = T_series[k];
}
// Call the optimization
Rcpp::List opt_results = constrOptim(Rcpp::_["theta"] = init_val,
Rcpp::_["f"] = SDK_pred_mad,
Rcpp::_["data_in"] = fake_data,
Rcpp::_["grad"] = "NULL",
Rcpp::_["method"] = "Nelder-Mead",
Rcpp::_["ui"] = U,
Rcpp::_["ci"] = C );
/// fill the output matrix ///
// need to create an place holder arma vector for the parameter output
arma::vec opt_param = Rcpp::as<arma::vec>(opt_results[0]);
Boots_out(i, 0) = opt_param[0];
Boots_out(i, 1) = opt_param[1];
Boots_out(i, 2) = opt_param[2];
// for the cost function value at optimization
arma::vec opt_value = Rcpp::as<arma::vec>(opt_results[1]);
Boots_out(i, 3) = opt_value[0];
// for the number of function calls (?)
arma::vec counts = Rcpp::as<arma::vec>(opt_results[2]);
Boots_out(i, 4) = counts[0];
// for thhe convergence code
arma::vec convergence = Rcpp::as<arma::vec>(opt_results[3]);
Boots_out(i, 5) = convergence[0];
}
}
};
// [[Rcpp::export]]
arma::mat SDK_boots_test(arma::vec init_val, arma::mat data_in, int boots_n){
//First establish theta_sp, estimate and residuals
const int N = arma::size(data_in)[0];
// Create the constraints for the constrained optimization
// Make a boundry boundry condition matrix of the form Ui*theta - ci >= 0
arma::mat U(6, 3);
U(0, 0) = 1;
U(1, 0) = -1;
U(2, 0) = 0;
U(3, 0) = 0;
U(4, 0) = 0;
U(5, 0) = 0;
U(0, 1) = 0;
U(1, 1) = 0;
U(2, 1) = 1;
U(3, 1) = -1;
U(4, 1) = 0;
U(5, 1) = 0;
U(0, 2) = 0;
U(1, 2) = 0;
U(2, 2) = 0;
U(3, 2) = 0;
U(4, 2) = 1;
U(5, 2) = -1;
arma::colvec C(6);
C[0] = 0;
C[1] = -data_in(N-1, 9)-0.5;
C[2] = 0;
C[3] = -3;
C[4] = 0;
C[5] = -50;
Rcpp::Function SDK_est( "SDK_est");
Rcpp::Function SDK_res( "SDK_res");
arma::vec Y_est = as<arma::vec>(SDK_est(init_val, data_in));
arma::vec Y_res = as<arma::vec>(SDK_res(init_val, data_in));
// Generate feed items for the Bootstrap Worker
arma::vec T_series = data_in( span(0, N-1), 9);
arma::vec Boots_reps(boots_n+1);
// Allocate the output matrix
arma::mat Boots_out(boots_n, 6);
// Pass input and output the Bootstrap Worker
Boot_Worker Boot_Worker(Boots_reps, init_val, T_series, Y_est, Y_res, U, C, N, Boots_out);
// Now finnaly call the parallel for loop
parallelFor(0, Boots_reps.size(), Boot_Worker);
return Boots_out;
}
/[[Rcpp::depends(“RcppArmadillo”)]]
//[[Rcpp::dependens(“RcppParallel”)]]
#包括
#包括
使用名称空间Rcpp;
使用名称空间std;
使用arma;
使用名称空间RcppParallel;
结构启动工作程序:公共工作程序{
//产生投入
//跟踪引导次数的源向量
常量arma::vec引导代表;
//初始非线性θ参数值
常量arma::vec init_val;
//十进制日期向量
常数arma::colvec T_系列;
//生成价格序列观测向量
常数arma::colvec Y__est;
常数arma::colvec Y_res;
//生成优化常数
常数arma::mat U;
常数arma::colvec;
const int N;
//生成输出矩阵
arma::垫子靴出;
//使用正确的输入和输出进行初始化
引导工人(持续arma::vec引导代表,持续arma::vec初始值,持续arma::colvec T_系列,持续arma::colvec Y_est,持续arma::colvec Y_res,持续arma::mat U,持续arma::colvec,持续int N,持续arma::mat引导)
:Boot_reps(Boot_reps)、init_val(init_val)、T_series(T_series)、Y_est(Y_est)、Y_res(Y_res)、U(U)、C(C)、N(N)、Boots_out(Boots_out){}
void运算符()(std::size\u t begin,std::size\u t end){
//从周围装载必要的物品
Rcpp::环境统计(“包:统计”);
Rcpp::函数constrOptim=stats[“constrOptim”];
Rcpp::函数SDK_pred_mad(“SDK_pred_mad”);
arma::mat伪_数据(N,2);
arma:colvec指数(N);
for(无符号整数i=begin;i
所以我写回我的“热算法”来解决优化问题,这完全是在Rcpp armadillo中,这大大简化了代码,因为约束被写入了优化器。此外,我删除了随机化,所以它只需要解决相同的优化问题;只是为了看看这是否是唯一的问题。毫无疑问,我仍然是具有相同的“致命错误”
这里是代码:
// [[Rcpp::depends("RcppArmadillo")]]
// [[Rcpp::depends("RcppParallel")]]
#include <RcppArmadillo.h>
#include <RcppParallel.h>
#include <random>
using namespace Rcpp;
using namespace std;
using namespace arma;
using namespace RcppParallel;
struct Boot_Worker : public Worker {
//Generate Inputs
// Source vector to keep track of the number of bootstraps
const arma::vec Boot_reps;
// Initial non-linear theta parameter values
const arma::vec init_val;
// Decimal date vector
const arma::colvec T_series;
// Generate the price series observational vector
const arma::colvec Y_est;
const arma::colvec Y_res;
const int N;
// Generate Output Matrix
arma::mat Boots_out;
// Initialize with the proper input and output
Boot_Worker( const arma::vec Boot_reps, const arma::vec init_val, const arma::colvec T_series, const arma::colvec Y_est, const arma::colvec Y_res, const int N, arma::mat Boots_out)
: Boot_reps(Boot_reps), init_val(init_val), T_series(T_series), Y_est(Y_est), Y_res(Y_res), N(N), Boots_out(Boots_out) {}
void operator()(std::size_t begin, std::size_t end){
//load necessary stuffs from around
Rcpp::Function SDK_heat( "SDK_heat");
arma::mat fake_data(N,2);
arma::colvec index(N);
for(unsigned int i = begin; i < end; i ++){
// Need a nested loop to create and fill the fake data matrix
//arma::vec pool = arma::shuffle( arma::regspace(0, N-1) );
for(int k = 0; k <= N-1; k++){
fake_data(k, 0) = Y_est[k] + Y_res[ k ];
//fake_data(k, 0) = Y_est[k] + Y_res[ pool[k] ];
fake_data(k, 1) = T_series[k];
}
// Call the optimization
arma::vec opt_results = Rcpp::as<arma::vec>( SDK_heat(Rcpp::_["data_in"] = fake_data, Rcpp::_["tol"] = 0.1) );
/// fill the output matrix ///
// need to create an place holder arma vector for the parameter output
Boots_out(i, 0) = opt_results[0];
Boots_out(i, 1) = opt_results[1];
Boots_out(i, 2) = opt_results[2];
// for the cost function value at optimization
Boots_out(i, 3) = opt_results[3];
}
}
};
// [[Rcpp::export]]
arma::mat SDK_boots_test(arma::vec init_val, arma::mat data_in, int boots_n){
//First establish theta_sp, estimate and residuals
const int N = arma::size(data_in)[0];
Rcpp::Function SDK_est( "SDK_est");
Rcpp::Function SDK_res( "SDK_res");
const arma::vec Y_est = as<arma::vec>(SDK_est(init_val, data_in));
const arma::vec Y_res = as<arma::vec>(SDK_res(init_val, data_in));
// Generate feed items for the Bootstrap Worker
const arma::vec T_series = data_in( span(0, N-1), 9);
arma::vec Boots_reps(boots_n+1);
// Allocate the output matrix
arma::mat Boots_out(boots_n, 4);
// Pass input and output the Bootstrap Worker
Boot_Worker Boot_Worker(Boots_reps, init_val, T_series, Y_est, Y_res, N, Boots_out);
// Now finnaly call the parallel for loop
parallelFor(0, Boots_reps.size(), Boot_Worker);
return Boots_out;
}
/[[Rcpp::depends(“RcppArmadillo”)]]
//[[Rcpp::dependens(“RcppParallel”)]]
#包括
#包括
#包括
使用名称空间Rcpp;
使用名称空间std;
使用arma;
使用名称空间RcppParallel;
结构启动工作程序:公共工作程序{
//产生投入
//跟踪引导次数的源向量
常量arma::vec引导代表;
//初始非线性θ参数值
常量arma::vec init_val;
//十进制日期向量
常数arma::colvec T_系列;
//生成价格序列观测向量
常数arma::colvec Y__est;
常数arma::colvec Y_res;
const int N;
//生成输出矩阵
arma::垫子靴出;
//使用正确的输入和输出进行初始化
Boot_Worker(const arma::vec Boot_reps,const arma::vec init_val,const arma::colvec T_series,const arma::colvec Y_est,const arma::colvec Y_res,const int N,arma::mat Boots_out)
:Boot_reps(Boot_reps),init_val(init_val),T_series(T_series),Y_est(Y_est),Y_res(Y_res),N(N),Boots_out(Boots_out){}
void运算符()(std::size\u t begin,std::size\u t end){
//从周围装载必要的物品
Rcpp::函数SDK_heat(“SDK_heat”);
arma::mat伪_数据(N,2);
arma:colvec指数(N);
for(无符号整数i=begin;i 对于(int k=0;k查看您的代码,我看到以下内容:
struct Boot\u Worker:公共工作者{
[...]
void运算符()(std::size\u t begin,std::size\u t end){
//从周围装载必要的物品
Rcpp::环境统计(“包:统计”);
Rcpp::函数constrOptim=stats[“constrOptim”];
Rcpp::函数SDK_pred_mad(“SDK_pred_mad”);
[...]
//调用优化
Rcpp::List opt_results=constrOptim(Rcpp::[“theta”]=init_val,
Rcpp::[“f”]=SDK