Ошибка сегментации RNGscope

Я кодировал некоторые симуляции, используя 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


person user2127594    schedule 02.03.2013    source источник


Ответы (1)


Хм, я вижу две проблемы:

а) Вы используете umat, но у нас нет unsigned int в R, так что получится много очень неэффективных копий. Я изменил его на mat, но imat тоже должно работать.

б) Вы много зацикливаетесь с for(i in 1:100000). Мы видели аналогичную проблему с «миллионами» созданных объектов. Мы не уверены, где ошибка.

При меньшем 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")
person Dirk Eddelbuettel    schedule 03.03.2013
comment
Спасибо за быстрый ответ. Не уверен, что это поможет, но если я прокомментирую RNGScope и добавлю в GetRNGstate();PutRNGstate(); Я больше не получаю ошибку. Я принял к сведению rcpp-devel. Спасибо, Эд - person user2127594; 03.03.2013
comment
Это хорошее продолжение. Но взгляните на наш класс RNGScope — он такой же простой, как и кажется. Почему это может пойти наперекосяк? - person Dirk Eddelbuettel; 03.03.2013
comment
Да, это просто умный способ упростить материал RNGstate. Это не должно вызывать проблем. К сожалению, мои познания в С++ ничтожны, как бумага, поэтому я понятия не имею, почему это может что-то испортить. С другой стороны, по какой-то причине, если я поменяю возвратную обертку (simulation_data); для возврата целого числа return wrap(22); он также перестает падать. Эд - person user2127594; 03.03.2013
comment
Да, это совершенно очевидно, что это взаимодействие. Мы занимались этим какое-то время, но эту ошибку сложно устранить. - person Dirk Eddelbuettel; 03.03.2013
comment
Между прочим, Дирку удалось раздавить это по связанной с этим проблеме. lists.r-forge.r- project.org/pipermail/rcpp-devel/2013-May/ - person Robert Casey; 24.01.2014