2

inline/RcppArmadillo を使用していくつかのシミュレーションをコーディングしていて、RNGScope の問題に遭遇しました。これはバグですか、それとも私は本当にばかげたことをしていますか?? 関数を読みやすくするために空にしました (以下を参照)。

乾杯、エド

library(inline)
code_cpp <- '
using namespace arma;
// From R  
uvec               x0 = as<uvec>(x0_r);
vec          time_vec = as<vec>(time_vec_r);
// Declare variables
umat        simulation_data=zeros<umat>(x0.n_elem, time_vec.n_elem);
RNGScope scope;
return wrap(simulation_data);
'

gillespie_sim <- cxxfunction(body = code_cpp, 
                              sig = signature(x0_r = "integer", time_vec_r= "numeric"), 
                        plugin = "RcppArmadillo") 


x0    <- c(1,0,0,0,0,0)
time_vec <- 1:800
set.seed(23) 
for(i in 1:100000) out2  <- gillespie_sim(x0_r=x0,time_vec_r=time_vec)

私が得るエラー

R(43305) malloc: * オブジェクト 0x108c30a00 のエラー: 解放されたオブジェクトのチェックサムが正しくありません - オブジェクトは解放後に変更された可能性があります。* malloc_error_break にブレークポイントを設定して、中止トラップをデバッグします: 6

4

1 に答える 1

0

うーん、2 つの問題があります。

a) を使用しますumatが、R にはありませんunsigned int。そのため、非常に非効率的なコピーが大量に作成されます。に変更しましたmatが、imat動作するはずです。

b)でたくさんループしfor(i in 1:100000)ます。「膨大な数」のオブジェクト作成で同様の問題が発生しています。バグがどこにあるかはわかりません。

より小さい N では、(頻繁に) 発生しないようです。RNGScopeが何か関係があるか見てみますが、これは非常に単純なオブジェクトです。

バグ報告ありがとうございます。rcpp-devel次回のご利用もご検討ください。

編集:Rcppまた、ベクトルを使用する場合、エラーが発生していないように見えることに注意してください。したがって、最初に Rcpp オブジェクトを初期化し、次にそこから Armadillo オブジェクトを初期化するという 2 段階の方法を使用できますfastLm.r。パッケージ内のファイルにはその例があります。

suppressMessages(library(Rcpp))
suppressMessages(library(inline))

useRcpp <- function() {
    code_cpp <- '
// From R
NumericVector  x0(x0_r);
NumericVector  time_vec(time_vec_r);
// Declare variables
NumericMatrix  simulation_data(x0.size(), time_vec.size());
RNGScope scope;
return simulation_data;
'

cxxfunction(body = code_cpp,
            sig = signature(x0_r = "integer", time_vec_r= "numeric"),
            plugin = "Rcpp")
}

gillespie_sim <- useRcpp()

x0    <- c(1,0,0,0,0,0)
time_vec <- 1:800
set.seed(23)
for(i in 1:100000) out2  <- gillespie_sim(x0_r=x0,time_vec_r=time_vec)
cat("Done\n")
于 2013-03-03T13:19:29.300 に答える