DEoptim зависает в R
Я столкнулся с ситуацией, когда DEoptim
кажется, чтобы заморозить. Я не могу понять, почему и надеялся, что кто-то с большим опытом в C мог бы взглянуть на это.
Создать воспроизводимый пример довольно сложно, поэтому я просто сохранил всю среду за 50 итераций, прежде чем DEoptim зависнет. Файл ниже, 'Envir650.Rdata'
можно найти здесь.
rm(list = ls())
library(DstarM)
library(DEoptim)
load('Envir650.Rdata') # load the environment
# Adjust one function
argsList$fun.density = DstarM::Voss.density
argsList$control$trace = 1 # show intermediate output
argsList$control$parallelType = 0 # don't use parallel processing
.Random.seed = randomseed # set seed
out = do.call(DEoptim, argsList) # freezes at iteration 21 and crashes R.
Спасибо заранее!
РЕДАКТИРОВАТЬ: Я надеюсь, что проблема теперь воспроизводима.
1 ответ
Проблема в пакете rtdists, плотность исходного файла.c, функция интегрировать. Петля
for(x = a+0.5*step; x < b; x += step) {
result += step * F->f(x, F->data);
}
становится бесконечным, потому что step
очень маленький. Это так мало, что x+step==x
а также x
никогда не достигает b
, Код integrate
следует изменить так, чтобы step
никогда не бывает меньше чем EPSILON
:
--- orig/rtdists/src/density.c 2016-07-15 10:28:56.000000000 +0200
+++ mine/rtdists/src/density.c 2016-08-29 17:41:53.831078335 +0200
@@ -72 +72 @@
- double step = width / N;
+ double step = fmax(width / N, EPSILON);
С этим изменением ваш пример заканчивается на итерации 51 без зацикливания или сбоя. Я уведомил авторов rtdists; исправление теперь в github-версии пакета.