2016-06-14 25 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を使用しています。私はwarninを得た最後の実行で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データ型が使用されていることがわかりました。実際にsampleの第4のパラメータはそれ自体問題である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::stringarmaとしてでは動作しませんです。 (templateを使って書くことができると思いますか?

+0

ニース「sample()」の変更をRcppArmadilloに戻す必要がありますか? –

+0

@DirkEddelbuettelはおそらく 'template'をセットアップしてPRが良いでしょう。依存関係の問題? – coatless

+0

軽量からの依存関係は良いでしょう –

関連する問題