2016-06-14 3 views
0
// [[Rcpp::depends(RcppParallel)]] 
#include <RcppParallel.h> 
#include <RcppArmadilloExtensions/sample.h> 
// [[Rcpp::depends(RcppArmadillo)]] 

using namespace Rcpp; 
using namespace RcppArmadillo; 
using namespace RcppParallel; 
using namespace std; 

struct Sum : public Worker 
{ 
    vector<string> output; 

    Sum() {} 
    Sum(const Sum& sum, Split) {} 

    void operator()(std::size_t begin, std::size_t end) { 
    vector<string> states; 
    states.push_back("a"); 
    states.push_back("b"); 
    states.push_back("c"); 
    states.push_back("d"); 

    vector<double> probs; 
    probs.push_back(0.3); 
    probs.push_back(0.4); 
    probs.push_back(0.1); 
    probs.push_back(0.2); 

    vector<string> rstat = sample(states, 1, false, wrap(probs)); 
    output.push_back(rstat[0]); 

    } 

    void join(const Sum& rhs) { 
    for(int i=0;i<rhs.output.size();i++) { 
     output.push_back(rhs.output[i]); 
    } 
    } 
}; 

// [[Rcpp::export]] 
CharacterVector parallelVectorSum(int n) { 

    Sum sum; 

    parallelReduce(0, n, sum); 

    return wrap(sum.output); 
} 

Приведенный выше код представляет собой просто эксперимент по изучению RcppParllel. Я много искал и обнаружил, что нам следует избегать использования типа данных, такого как CharacterVector, NumericVector и т. Д. Вот почему я использовал C++ STL.Несбалансированность стека при использовании RcppParallel

Выход 1

> parallelVectorSum(1) 
[1] "b" 

Выход 2

> parallelVectorSum(11) 
[1] "d" "a" "b" "b" "d" "a" "b" "b" "d" "b" "a" 

Выход 3

> parallelVectorSum(111) 
Warning: stack imbalance in '.Call', 7 then 6 
    [1] "a" "b" "d" "b" "a" "b" "d" "d" "a" "b" "a" "b" "d" "b" "b" "c" "a" "a" "a" "d" "b" "b" "b" "a" "c" "a" "b" "a" 
[29] "a" "b" "b" "d" "a" "b" "c" "b" "b" "d" "d" "b" "b" "a" "b" "a" "d" "b" "b" "a" "a" "a" "b" "b" "a" "a" "b" "d" 
[57] "a" "a" "b" "d" "a" "a" "c" "d" "b" "c" "a" "d" "a" "d" "d" "b" "a" "a" "d" "b" "b" "d" "d" "b" "b" "b" "a" "a" 
[85] "c" "a" "b" "d" "c" "b" "b" "a" "d" "d" "b" "b" "a" "a" "d" "d" "a" "c" "b" "b" "a" "a" "b" "b" "b" "c" "d" 

В последнем прогоне я получил предостерегающий g, связанных с дисбалансом стека, и я уверен, что это связано с использованием функции sample от RcppArmadillo. В определении метода sample я обнаружил, что используется тип данных R. Infact четвертый параметр sample сам по себе NumericVector, что является проблемой.

Какое может быть решение этой проблемы? Нужно ли мне реализовать свою собственную функцию sample (я не думаю, что это легко сделать - я новичок). Любое решение будет оценено по достоинству. Пожалуйста помоги.

ответ

3

Я уже портировал код с RcppArmadillo's sample.h только для использования arma::vec.

См:

https://github.com/SMAC-Group/gmwm/blob/f5f132c5a15820643286bb3c19b676b80d8f46c1/src/sampler.cpp

Функция, которую необходимо будет назвать это:

arma::vec rsample(const arma::vec &x, const int size, const bool replace, arma::vec prob_); 

Единственная проблема, это не будет работать с std::string, как arma не имеет тип, определенный для этого. (Я полагаю, вы могли бы написать его с помощью template

+0

Nice. Должны ли мы PR, которые меняются для 'sample()' обратно в RcppArmadillo? –

+0

@DirkEddelbuettel нужно, вероятно, настроить «шаблон», тогда PR хорош. проблемы с зависимостью? – coatless

+0

Зависимости от или от? Легкий вес будет хорошим. –

Смежные вопросы