Occasional segfault when returning tuple as R list from exposed function
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 25/100
Direzione di ricerca
Inizia dal punto di ingresso functions.stan e cmdstanr::cmdstan_model(..., compile_standalone = TRUE)$functions, quindi analizza le chiamate ripetute alla funzione esposta che restituisce una tupla nelle versioni di R e CmdStan indicate. Il lavoro è completato quando la corruzione della memoria può essere riprodotta o esclusa e le restituzioni ripetute di tuple non causano più un segmentation fault o un errore dell’allocator.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
I have written several Stan functions that return tuples (as R lists). Most of the time they work as intended, but occasionally R crashes due to a segfault with a message such as
*** caught segfault ***
address 0x5647a22ee788, cause 'memory not mapped'
Similarly, I have also had core dumps with the messages corrupted double-linked list or malloc(): unsorted double linked list corrupted.
I have not been able to get it to happen in a reproducible manner - it seems like the same input can sometimes lead to successful execution and sometimes to a segfault.
I use Fedora 40, R 4.4.0, cmdstan 2.35.0, cmdstanr 0.8.1.
As an example, one of my functions that occasionally gives this issue is
tuple(real, vector, matrix)
prep_multi_cens_log_lik(vector yo,
array[] real to, array[] real tc,
array[] int to_is, array[] int tc_is,
array[] int Jo, array[] int Jc,
real magnitude_mu, real length_scale_mu,
real magnitude_eta, real length_scale_eta,
real sigma)
{
int n = num_elements(Jc); /* number of groups */
int No = sum(Jo);
int Nc = sum(Jc);
int row_start, row_end, col_start, col_end;
matrix[Nc, Nc] cov_c;
row_end = 0;
for (i in 1:n) {
if (Jc[i] == 0)
continue;
row_start = row_end + 1;
row_end = row_end + Jc[i];
col_end = 0;
for (j in 1:n) {
if (Jc[j] == 0)
continue;
col_start = col_end + 1;
col_end = col_end + Jc[j];
if (i == j) {
cov_c[row_start:row_end, col_start:col_end] =
add_diag(gp_exp_quad_cov(tc[row_start:row_end], tc[col_start:col_end],
magnitude_mu, length_scale_mu) +
gp_exp_quad_cov(tc[row_start:row_end], tc[col_start:col_end],
magnitude_eta, length_scale_eta),
sigma^2);
} else {
cov_c[row_start:row_end, col_start:col_end] =
gp_exp_quad_cov(tc[row_start:row_end], tc[col_start:col_end],
magnitude_mu, length_scale_mu) -
gp_exp_quad_cov(tc[row_start:row_end], tc[col_start:col_end],
magnitude_eta, length_scale_eta) / (n-1);
}
}
}
matrix[Nc, No] cov_c_o;
row_end = 0;
for (i in 1:n) {
if (Jc[i] == 0)
continue;
row_start = row_end + 1;
row_end = row_end + Jc[i];
col_end = 0;
array[Jc[i]] real tc_slice = tc[row_start:row_end];
for (j in 1:n) {
if (Jo[j] == 0)
continue;
col_start = col_end + 1;
col_end = col_end + Jo[j];
array[Jo[j]] real to_slice = to[col_start:col_end];
if (i == j) {
cov_c_o[row_start:row_end, col_start:col_end] =
gp_exp_quad_cov(tc_slice, to_slice,
magnitude_mu, length_scale_mu) +
gp_exp_quad_cov(tc_slice, to_slice,
magnitude_eta, length_scale_eta);
} else {
cov_c_o[row_start:row_end, col_start:col_end] =
gp_exp_quad_cov(tc_slice, to_slice,
magnitude_mu, length_scale_mu) -
gp_exp_quad_cov(tc_slice, to_slice,
magnitude_eta, length_scale_eta) / (n-1);
}
}
}
matrix[No, No] cov_o;
row_end = 0;
for (i in 1:n) {
if (Jo[i] == 0)
continue;
row_start = row_end + 1;
row_end = row_end + Jo[i];
col_end = 0;
for (j in 1:n) {
if (Jo[j] == 0)
continue;
col_start = col_end + 1;
col_end = col_end + Jo[j];
if (i == j) {
cov_o[row_start:row_end, col_start:col_end] =
add_diag(gp_exp_quad_cov(to[row_start:row_end], to[col_start:col_end],
magnitude_mu, length_scale_mu) +
gp_exp_quad_cov(to[row_start:row_end], to[col_start:col_end],
magnitude_eta, length_scale_eta),
sigma^2);
} else {
cov_o[row_start:row_end, col_start:col_end] =
gp_exp_quad_cov(to[row_start:row_end], to[col_start:col_end],
magnitude_mu, length_scale_mu) -
gp_exp_quad_cov(to[row_start:row_end], to[col_start:col_end],
magnitude_eta, length_scale_eta) / (n-1);
}
}
}
real lpdf_o = multi_normal_lpdf(yo | rep_vector(0, No), cov_o);
vector[Nc] mean_c_cond_o = cov_c_o * (cov_o \ yo);
matrix[Nc, Nc] cov_c_cond_o = cov_c - cov_c_o * (cov_o \ cov_c_o');
return (lpdf_o,
mean_c_cond_o,
cov_c_cond_o);
}
which I expose to R using
stan_funs <- cmdstanr::cmdstan_model("functions.stan",
force_recompile = TRUE,
compile_standalone = TRUE)$functions
- Lingua principale
- R
- Stelle
- 164
- Fork
- 69
- Merge medio
- 1g 10h
- PR unite (30g)
- 47
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di stan-dev/cmdstanr
-
internal-code
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno
-
documentation
Difficoltà 2/5 1-3 ore Idoneità per principianti 64/100
stan-dev/cmdstanr#506 · 7 commenti · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
-
Model methods fail on a reloaded fit when the data was passed in memoryForse già presa @jgabry l’ha presa 2 giorni fa. Apertabug
Difficoltà 3/5 1-2 giorni Idoneità per principianti 45/100
I maintainer di solito rispondono entro 1 giorno
-
internal-code
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
stan-dev/cmdstanr#1314 · 4 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
feature
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
stan-dev/cmdstanr#1175 · 1 commento · 2 reazioni ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di stan-dev/cmdstanr
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
HelenaLC/spatialdataR#284 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 71/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
-
Hackathon: Tier 1
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
pharmaverse/logrx#309 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
I maintainer di solito rispondono entro 1 giorno