DEoptim错误:由于foreachArgs规范
目标函数结果具有与参数矩阵不同的长度我有一个非常奇怪的DEoptim
错误,我有“固定”,但不明白。DEoptim错误:由于foreachArgs规范
当我使用DEoptim
的parallel
包(即pType=1
)的并行功能时,我没有问题。但是,当我使用foreach
(我必须使用可用的网格计算设置)时,我遇到了问题。下面是我的一个简化版本的MRE。 pType=1
作品,pType=2
指定foreachArgs
时返回错误:
objective function result has different length than parameter matrix
当我不指定foreachArgs
问题消失。有没有人有关于这个问题的根源的想法?
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()
从?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.
,你似乎与parVar
行为被混为一谈:
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.
你需要指定传递给foreach
作为name = value
对的参数。例如:
foreachArguments <- list(.export = c("myfunc1", "myfunc2", "loss_func", "ncal",
"n_left_cens", "astats", "X_ret", "disc_length", "X_acq","POP_0","POP_ann_growth")
我不确定是什么原因导致了那个特定的错误,但修复是“不这样做”。 ;)
下面是一个如何实际使用foreachArgs
参数的示例。请注意,我设置.verbose
参数,使foreach
打印诊断:
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)
谢谢乔希!虽然foreach没有为我导出变量,但是在使用foreachArgs时,foreachArguments的规范做了诀窍。它提供了与我通过手动导出而不使用foreachArgs获得的结果相同的结果。 – user052084
@ user052084:我不确定'foreach'会自动导出变量,所以我从我的答案中删除了该评论。对不起,有任何困惑。 –
当我运行你的代码,你的第一个例子失败,“错误clusterExport(...)对象‘foreachArguments’未发现”;而你的第二个例子会失败,“parallelArgs $ .packages中的错误:'symbol'类型的对象不是子集合”。所以你需要提供一个可重复的例子。 –
我的歉意Josh - 'foreachArguments'在下面定义时应该在上面定义。编辑。在新的R会话中,结果如他们所描述的那样 - 工作,不起作用,给出错误信息,然后工作... – user052084