कलात्मक http://gallery.rcpp.org/articles/parallel-distance-matrix/ से प्रेरित, मैं multithreads का उपयोग कर बैकटेस्टिंग के लिए उच्च-आयामी पैरामीट्रिक स्थान में ब्रूट-बल खोज चलाने के लिए RcppParallel का उपयोग करने का प्रयास करता हूं। मैं struct
भाग में स्वयं परिभाषित फ़ंक्शन को कॉल करने के तरीके में फंस गया हूं। विचार इस तरह है:RcppParallel में उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन को कैसे कॉल करें?
पहले, आर में एक पैरामीट्रिक मैट्रिक्स NumericMatrix params_mat
बनाने पहले, और इस तरह के रूप में List Data_1, NumericVector Data_2, CharacterVector Data_3, ...
List, NumericVector, CharacterVector
डेटाप्रकार साथ backtesting डेटा, है, जो प्रत्येक पैरामीट्रिक परिदृश्य params_vec
के लिए स्थिर रहे हैं का उपयोग करें (ध्यान दें कि यह पंक्ति है params_mat
)।
अगला, बैकटेस्टिंग फ़ंक्शन को परिभाषित करें जो एक वेक्टर आउटपुट करता है जिसमें रणनीति प्रदर्शन का मूल्यांकन करने के लिए 3 प्रमुख चर शामिल होते हैं।
यहां मेरे params_mat
और Backtesting_Fun
का एक उदाहरण है जो क्रमशः आर और आरसीपीपी में चलाया जा सकता है।
// [[Rcpp::depends(RcppParallel)]]
#include <RcppParallel.h>
using namespace RcppParallel;
RVector<double> Backtesting_Fun (const RVector<double> Data_1, const RVector<double> Data_2,
const RVector<string> Data_3,..., const RVector<double> params_vec)
{
// Main function parts to run backtesting for each params_vec scenario.
... etc;
// save 3 key result variables together with each params_vec
... etc;
return res;
}
struct Backtest_parallel : public Worker
{
// input matrix to read from
const RVector<List> Data_1;
const RVector<double> Data_2;
const RVector<string> Data_3;
...
const RMatrix<double> params_mat;
// output matrix to write to
RMatrix<double> rmat;
// initialize from Rcpp input and output matrixes (the RMatrix class
// can be automatically converted to from the Rcpp matrix type)
Backtest_parallel(const List Data_1, const NumericVector Data_2,
const CharacterVector Data_3, ..., const NumericMatrix params_mat)
: Data_1(Data_1), Data_2(Data_2), Data_3(Data_3), ..., params_mat(params_mat) {}
// function call operator that work for the specified range (begin/end)
void operator()(std::size_t begin, std::size_t end)
{
for (std::size_t ii = begin; ii < end; i++)
{
// params rows that we will operate on
RMatrix<double>::Row params_row = params_mat.row(ii);
// Run the backtesting function defined above
RVector<double> res = Backtesting_Fun(Data_1, Data_2, ..., params_row)
for (std::size_t jj = 0; jj < res.length(); jj++)
{
// write to output matrix
rmat(ii,jj) = res[jj];
}
}
}
};
// [[Rcpp::export]]
NumericMatrix rcpp_parallel_backtest(List Data_1, NumericVector Data_2, CharacterVector Data_3,
..., NumericMatrix params_mat)
{
// allocate the matrix we will return
NumericMatrix rmat(params_mat.nrow(), params_mat.nrow()+3);
// create the worker
Backtest_parallel backtest_parallel(Data_1, Date_2, ..., params_mat);
// call it with parallelFor
parallelFor(0, rmat.nrow(), backtest_parallel);
return rmat;
}
यहाँ मेरी सवाल कर रहे हैं:
//[[Rcpp::export]]
NumericMatrix data_frame_rcpp(const Rcpp::List& list_params)
{
NumericMatrix res = list_params[0];
return res;
}
# R codes to generate params_mat
params <- expand.grid (x_1=seq(1,100,1), x_2=seq(3,100,2), ..., x_n=seq(4,200,1));
list_params = list(ts(params));
tmp_params_data = data_frame_rcpp(list_params);
params_mat = matrix(tmp_params_data, ncol = ncol(tmp_params_data), dimnames = NULL);
params_vec = params_mat[ii,];
# User-defined Rcpp codes for backtesting
NumericVector Backtesting_Fun (List Data_1, NumericVector Data_2, CharacterVector Data_3, ..., NumericVector params_vec)
{
// Main function parts to run backtesting for each params_vec scenario.
... etc
// save 3 key result variables together with each params_vec (just a simple illustration).
NumericVector res = NumericVector::create(params_vec[0],...,params_vec[size-1],
key_1, key_2, key_3);
return res;
}
निश्चित रूप से हम पुनर्लेखन के लिए/RVector/RMatrix प्रकार के साथ मूल Rcpp Backtesting_Fun
संशोधित, और उसके बाद निम्न RcppParallel
कोड का उपयोग कॉल करने के लिए struct Backtest_parallel
में Backtesting_Fun
जरूरत
RVector
मेंList
डेटाटाइप, याRcppParallel
मेंList
रखने के लिए कोई विशिष्ट कंटेनर है;Backtesting_Fun
में, इनपुटRVector/RMatrix
प्रकार होना चाहिए, इसका मतलब यह है कि हम वास्तव मेंRVector
मेंNumericVector
साथ मूल Rcpp मुख्य कोड में परिवर्तित करने की आवश्यकता है?
या आरसीपीपीएरल में मेरे मामले के लिए समांतर कंप्यूटिंग करने का कोई बेहतर तरीका है? अग्रिम में धन्यवाद।
संपादित:
मैं http://gallery.rcpp.org/articles/parallel-matrix-transform/, http://gallery.rcpp.org/articles/parallel-inner-product/ में RcppPararrel के बारे में अन्य उदाहरण को देखो,
struct operator()
में आम विचार है,operator()
के लिए डेटा इनपुट में हेरफेर करने के संकेत दिए गए उपयोग करने के लिए है तो वहाँ किसी भी तरह से है पॉइंटर इनपुट के साथ मेरे मामले में एक उपयोगकर्ता परिभाषित समारोह बनाने के लिए?ऊपर जिस तरह से काम नहीं करता है, तो यह संभव
wrap
उपयोग करने के लिएoperator()
में वापस Rcpp डेटाप्रकार है, अर्थात मेंRVector/RMatrix
कन्वर्ट करने के लिए,NumericVector..
ताकि उपयोगकर्ता परिभाषित समारोहBacktesting_Fun
के इनपुट प्रकार में कोई बदलाव नहीं कर सकते हैं।
यदि आप एक छोटे, पूर्ण (अपने कार्यों में नहीं ...) उदाहरण प्रदान करते हैं तो शायद आपको उत्तर पाने की अधिक संभावना होगी। – nrussell
सुझाव @nrussell के लिए धन्यवाद, मैं जल्द ही सरल और सटीक उदाहरण के साथ प्रश्न अपडेट करूंगा – Alvin