2016-07-04 1 views
2

У меня очень странная ошибка 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() 
+0

Когда я запускаю свой код, ваш первый пример терпит неудачу с, «Ошибка в clusterExport (...) объекта„foreachArguments“не найден»; и ваш второй пример завершился неудачей, «Ошибка в parallelArgs $ .packages: объект типа« символ »не является подмножеством». Поэтому вам нужно предоставить воспроизводимый пример. –

+0

Мои извинения Джош - «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 не экспортировал переменные для меня, ваша спецификация foreachArguments сделала трюк при использовании foreachArgs. Он обеспечивал те же результаты, что и я получаю, экспортируя вручную, а не используя foreachArgs. – user052084

+0

@ user052084: Я не уверен, что 'foreach' автоматически экспортирует переменные, поэтому я удалил этот комментарий из своего ответа. Извините за любую путаницу. –