DEoptim 似乎在 R 中冻结
DEoptim appears to freeze in R
我遇到过 DEoptim
似乎冻结的情况。我不明白为什么,希望有更多 C 语言经验的人可以看看它。
创建可重现的示例相当困难,因此我只是在 DEoptim 冻结之前将整个环境保存了 50 次迭代。下面的文件 'Envir650.Rdata'
可以在 here 中找到。
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.
非常感谢!
编辑:我希望问题现在可以重现。
问题出在 rtdists 包、源文件 density.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 次迭代时完成,没有循环或崩溃。我有
notified
rtdists 作者;修复程序现在位于软件包的 github version 中。
我遇到过 DEoptim
似乎冻结的情况。我不明白为什么,希望有更多 C 语言经验的人可以看看它。
创建可重现的示例相当困难,因此我只是在 DEoptim 冻结之前将整个环境保存了 50 次迭代。下面的文件 'Envir650.Rdata'
可以在 here 中找到。
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.
非常感谢!
编辑:我希望问题现在可以重现。
问题出在 rtdists 包、源文件 density.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 次迭代时完成,没有循环或崩溃。我有 notified rtdists 作者;修复程序现在位于软件包的 github version 中。