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()
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. –
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