2016-07-04 44 views
2

目標函數結果具有與參數矩陣不同的長度我有一個非常奇怪的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

回答

0

?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'會自動導出變量,所以我從我的答案中刪除了該評論。對不起,有任何困惑。 –