2016-08-06 1 views
1

DEoptimがフリーズしているような状況が発生しました。私は理由を理解することができず、Cでより多くの経験を持つ誰かがそれを見ることができると期待していました。DEoptimがフリーズしているようです。

再現可能な例を作成することはむしろ難しいので、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. 

事前に感謝します。

EDIT:今問題が再現可能であることを願っています。

+0

まだ複製できません。 'load()'の後に '警告:namespace 'DstarM'は利用できず、オブジェクト 'argsList'を処理するときに.GlobalEnvに置き換えられました。それで 'do.call'は' FUN(newX [、i]、...)のエラーを返します:function "getPdf" 'を見つけることができませんでした... –

+0

@BenBolker:これは通常パッケージがインストールされていないことを意味します。 CRANでDstarMを見つけられませんでした(私もアーカイブをチェックしました)。また、 "DstarM rパッケージ"のGoogle検索でも見つかりませんでした。 –

+0

お詫び申し上げます、まもなくアップデートを提供します。 DstarMパッケージはまだ動作しており、まだCRANには載っていません。 DstarMの品質チェックを提供するためにシミュレーションを行う際に、DEoptimでこの問題が発生しました。 – Vandenman

答えて

3

問題は、rtdistsパッケージ、ソースファイルdensity.c、関数integrateにあります。ループ

for(x = a+0.5*step; x < b; x += step) { 
    result += step * F->f(x, F->data); 
} 

は、stepが小さすぎるため無限になります。それは小さいのでx+step==xxは決してbに届きません。 stepEPSILONよりも小さくならないようにintegrateのコードを変更する必要があります。

--- 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にあります。

関連する問題