2016-08-06 32 views
1

einzufrieren Ich habe eine Situation gefunden, in der DEoptim scheint einzufrieren. Ich kann nicht herausfinden, warum und hoffte, dass jemand mit mehr Erfahrung in C einen Blick darauf werfen könnte.DEoptim scheint in R

Es ist ziemlich schwierig, ein reproduzierbares Beispiel zu erstellen, also habe ich einfach die gesamte Umgebung 50 Iterationen gespeichert, bevor das DEoptim einfriert. Die Datei unten, 'Envir650.Rdata' kann here gefunden werden.

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. 

Vielen Dank im Voraus!

EDIT: Ich hoffe, das Problem ist jetzt reproduzierbar.

+0

Kann noch nicht repliziert werden. nach 'load()' bekomme ich 'Warnung: Namespace 'DstarM' ist nicht verfügbar und wurde durch .GlobalEnv ersetzt, wenn das Objekt 'argsList' verarbeitet wird. Dann 'do.call' gibt' Fehler in FUN (newX [, i], ...): konnte Funktion "getPdf" nicht finden ... –

+0

@BenBolker: das bedeutet normalerweise, dass das Paket nicht installiert ist, aber ich kann DstarM nicht auf CRAN finden (ich habe auch die Archive überprüft), auch nicht über eine Google-Suche nach "DstarM r package". –

+0

Entschuldigung, ich werde bald ein Update zur Verfügung stellen. Das DstarM-Paket ist noch in Arbeit und noch nicht auf CRAN. Wir stießen auf dieses Problem mit DEoptim während einer Simulationsstudie, um einen Qualitätscheck für DstarM bereitzustellen. – Vandenman

Antwort

3

Das Problem ist in Rtdists Paket, Quelldatei Density.c, Funktion integrieren. Die Schleife

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

wird unendlich, weil step zu klein ist. Es ist so klein, dass x+step==x und x niemals b erreicht. Der Code von integrate sollte geändert werden, so dass step ist nie kleiner als 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); 

Mit dieser Änderung angewandt, Ihr Beispiel bei Iteration beendet 51 ohne Looping oder abstürzt. Ich habe notified die rtdists Autoren; Das Update ist jetzt in der github version des Pakets.