2016-07-04 4 views
2

Ich habe eine sehr ungerade DEoptim Fehler, den ich "behoben" habe, aber nicht verstehen.DEoptim Fehler: objektive Funktion Ergebnis hat andere Länge als Parameter-Matrix aufgrund ForeachArgs Spezifikation

Ich habe keine Probleme, wenn ich DEoptim 's parallele Fähigkeiten mit dem parallel Paket verwenden (d. H. pType=1). Wenn ich jedoch stattdessen foreach verwende (was ich auf dem Grid-Computing-Setup verwenden muss, das mir zur Verfügung steht), habe ich Probleme. Unten ist ein MRE einer viel vereinfachten Version des Problems, das ich hatte. pType=1 Werke, pType=2 wenn foreachArgs angegeben wird ein Fehler zurück:

objective function result has different length than parameter matrix

Wenn ich angeben foreachArgs nicht das Problem geht weg. Hat jemand Gedanken über die Ursache dieses Problems?

library(zoo) 
library(parallel) 
library(doParallel) 
library(DEoptim) 


myfunc1 <- function(params){ 
    s <- myfunc2(params,ncal,n_left_cens,astats, X_ret, disc_length, X_acq, POP_0, POP_ann_growth) 
    loss_func(s) 
    } 

myfunc2 = function(params,ncal,n_left_cens,astats, X_ret, disc_length, X_acq, POP_0, POP_ann_growth){ 
    sum(params) + ncal + n_left_cens + astats + X_ret + disc_length + X_acq + POP_0 + POP_ann_growth 
    } 

loss_func = function(s){ 
    s 
    } 


# General setup 
ncal = 1 
n_left_cens = 1 
astats= 1 
disc_length = 1 
POP_0 = 1 
POP_ann_growth = 1 
X_acq = 1 
X_ret = 1 
params = c(1,1) 
W = 1 

paral = TRUE 
itermax=100 
ncores = detectCores() 
cltype <- ifelse(.Platform$OS.type != "windows", "FORK", "PSOCK") 
trace=TRUE 

# bounds for search for DEoptim 
lower = rep(-1,length(params)) 
upper = lower*-1 




# parallel: works    
pType = 1 
parVar = c("myfunc1","myfunc2","loss_func","W","ncal","n_left_cens","astats","X_ret","disc_length", 
         "X_acq","POP_0","POP_ann_growth")    
foreachArguments <- list("myfunc1","myfunc2","loss_func","ncal","n_left_cens","astats","X_ret","disc_length", 
         "X_acq","POP_0","POP_ann_growth") 
clusters <- makeCluster(ncores, type = cltype) 
registerDoParallel(clusters) 
clusterExport(cl=clusters, varlist=foreachArguments, envir=environment()) 
results <- DEoptim(fn=myfunc1,lower=lower,upper=upper, 
       DEoptim.control(itermax=itermax,trace=trace,parallelType=pType, 
       parVar=parVar)) 
showConnections(all = TRUE) 
closeAllConnections() 





# foreach with foreachArgs specified: doesn't work 
pType = 2    
clusters <- makeCluster(ncores, type = cltype) 
registerDoParallel(clusters) 
clusterExport(cl=clusters, varlist=foreachArguments, envir=environment()) 

results <- DEoptim(fn=myfunc1,lower=lower,upper=upper, 
       DEoptim.control(itermax=itermax,trace=trace,parallelType=pType, 
       foreachArgs=foreachArguments)) 
showConnections(all = TRUE) 
closeAllConnections() 





# foreach with foreachArgs unspecified: works 
pType = 2    
foreachArguments <- list("myfunc1","myfunc2","loss_func","ncal","n_left_cens","astats","X_ret","disc_length", 
         "X_acq","POP_0","POP_ann_growth") 
clusters <- makeCluster(ncores, type = cltype) 
registerDoParallel(clusters) 
clusterExport(cl=clusters, varlist=foreachArguments, envir=environment()) 

results <- DEoptim(fn=myfunc1,lower=lower,upper=upper, 
       DEoptim.control(itermax=itermax,trace=trace,parallelType=pType)) 
showConnections(all = TRUE) 
closeAllConnections() 
+0

Wenn ich Ihren Code ausführen, Ihr erstes Beispiel nicht mit, „Fehler in clusterExport (...) Objekt‚foreachArguments‘nicht gefunden“; und Ihr zweites Beispiel schlägt fehl mit "Fehler in parallelArgs $ .packages: Objekt des Typs 'Symbol' ist nicht Teilmenge". Sie müssen also ein reproduzierbares Beispiel angeben. –

+0

Ich entschuldige mich Josh - 'foreachArguments' wurde unten definiert, wenn es oben definiert werden sollte. Bearbeiten gemacht. In einer neuen R-Sitzung sind die Ergebnisse wie beschrieben - funktioniert, funktioniert nicht mit dieser Fehlermeldung, dann funktioniert ... – user052084

Antwort

0

Von ?DEoptim.control:

foreachArgs: A list of named arguments for the ‘foreach’ function from the package ‘foreach’. The arguments ‘i’, ‘.combine’ and ‘.export’ are not possible to set here; they are set internally.

Welche scheinen Sie mit dem Verhalten von parVar conflating werden:

parVar: Used if ‘parallelType=1’; a list of variable names (as strings) that need to exist in the environment for use by the objective function or are used as arguments by the objective function.

Sie müssen die Argumente foreach als name = value Paare übergeben spezifizieren. Zum Beispiel:

foreachArguments <- list(.export = c("myfunc1", "myfunc2", "loss_func", "ncal", 
"n_left_cens", "astats", "X_ret", "disc_length", "X_acq","POP_0","POP_ann_growth") 

Ich bin mir nicht sicher, was den spezifischen Fehler verursacht, aber die Lösung ist „tut das nicht.“ ;)

Hier ist ein Beispiel dafür, wie Sie das Argument foreachArgs tatsächlich verwenden würden. Beachten Sie, dass ich das .verbose Argument habe die Einrichtung foreach Druck Diagnose zu machen:

library(doParallel) 
library(DEoptim) 
clusters <- makeCluster(detectCores()) 
registerDoParallel(clusters) 
obj_func <- function(params) { sum(params) } 
results <- DEoptim(fn=obj_func, lower=c(-1, -1), upper=c(1, 1), 
    DEoptim.control(parallelType=2, foreachArgs=list(.verbose=TRUE))) 
stopCluster(clusters) 
+0

Danke Josh! Während foreach keine Variablen für mich exportiert hat, hat Ihre Spezifikation von foreachArguments den Zweck der Verwendung von foreachArgs erfüllt. Es lieferte die gleichen Ergebnisse wie das, was ich erhalte, wenn ich manuell exportiere und foreachArgs nicht verwende. – user052084

+0

@ user052084: Ich bin mir nicht sicher, 'foreach' exportiert automatisch Variablen, also habe ich diesen Kommentar aus meiner Antwort entfernt. Entschuldigung für jede Verwirrung. –

Verwandte Themen