DEoptim错误:由于foreachArgs规范

问题描述:

目标函数结果具有与参数矩阵不同的长度我有一个非常奇怪的DEoptim错误,我有“固定”,但不明白。DEoptim错误:由于foreachArgs规范

当我使用DEoptimparallel包(即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() 
+0

当我运行你的代码,你的第一个例子失败,“错误clusterExport(...)对象‘foreachArguments’未发现”;而你的第二个例子会失败,“parallelArgs $ .packages中的错误:'symbol'类型的对象不是子集合”。所以你需要提供一个可重复的例子。 –

+0

我的歉意Josh - 'foreachArguments'在下面定义时应该在上面定义。编辑。在新的R会话中,结果如他们所描述的那样 - 工作,不起作用,给出错误信息,然后工作... – user052084

?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) 
+0

谢谢乔希!虽然foreach没有为我导出变量,但是在使用foreachArgs时,foreachArguments的规范做了诀窍。它提供了与我通过手动导出而不使用foreachArgs获得的结果相同的结果。 – user052084

+0

@ user052084:我不确定'foreach'会自动导出变量,所以我从我的答案中删除了该评论。对不起,有任何困惑。 –