RNGscope分段故障

时间:2013-03-02 21:52:42

标签: inline rcpp

我一直使用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

1 个答案:

答案 0 :(得分:0)

嗯,我看到两个问题:

a)您使用umat,但我们在R中没有unsigned int,因此这将获得许多非常低效的副本。我将其更改为mat,但imat也应该有效。

b)您使用for(i in 1:100000)循环很多。我们已经看到了与对象创作的“gazillions”类似的问题。我们不确定错误在哪里。

使用较小的N似乎不会发生(经常)。我们来看看RNGScope是否与它有关 - 但这是一个非常简单的对象。

感谢错误报告。请考虑下次使用rcpp-devel

编辑:另请注意,使用Rcpp向量时,错误似乎并未表现出来。所以你可以使用两步法首先初始化Rcpp对象,然后从中初始化Armadillo对象 - 包中的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")