'Issues with seed setting in parallelised foreach loop R
I have a selection of tests I want to run in parallel. When I do this using foreach(), I get the expected output of 20 test - iteration pairs:
## Without seed
require(data.table)
require(foreach)
require(iterators)
require(doParallel)
require(doRNG)
numCores = 2
registerDoParallel(numCores)
iterations = 5
num_tests = 2:5
foreach( i = 1:iterations, .combine = 'rbind', .multicombine = TRUE, .inorder = FALSE ) %:%
foreach( n = num_tests, .combine = 'rbind', .multicombine = TRUE, .inorder = FALSE ) %dopar% {
## Print iteration
print(paste('Tests =',n,'Iteration =',i))
}
Output:
result.1 "Tests = 2 Iteration = 1"
result.2 "Tests = 3 Iteration = 1"
result.3 "Tests = 4 Iteration = 1"
result.4 "Tests = 5 Iteration = 1"
result.1 "Tests = 2 Iteration = 2"
result.2 "Tests = 3 Iteration = 2"
result.3 "Tests = 4 Iteration = 2"
result.4 "Tests = 5 Iteration = 2"
result.1 "Tests = 2 Iteration = 3"
result.2 "Tests = 3 Iteration = 3"
result.3 "Tests = 4 Iteration = 3"
result.4 "Tests = 5 Iteration = 3"
result.1 "Tests = 2 Iteration = 4"
result.2 "Tests = 3 Iteration = 4"
result.3 "Tests = 4 Iteration = 4"
result.4 "Tests = 5 Iteration = 4"
result.1 "Tests = 2 Iteration = 5"
result.2 "Tests = 3 Iteration = 5"
result.3 "Tests = 4 Iteration = 5"
result.4 "Tests = 5 Iteration = 5"
However, when I attempt to add a step to this loop that sets a random seed as described in the doRNG vignette, I get a different number of tests per iteration (14 test-iteration pairs):
## With seed
numCores = 2
registerDoParallel(numCores)
iterations = 5
num_tests = 2:5
rng <- RNGseq( iterations * (iterations+1) / 2, 1234)
foreach( i = 1:iterations, .combine = 'rbind', .multicombine = TRUE, .inorder = FALSE ) %:%
foreach( n = num_tests, r = rng[(i-1)*i/2 + 1:i], .combine = 'rbind', .multicombine = TRUE, .inorder = FALSE ) %dopar% {
##Set seed
rngtools::setRNG(r)
## Print iteration
print(paste('Tests =',n,'Iteration =',i))
}
Output:
result.1 "Tests = 2 Iteration = 1"
result.1 "Tests = 2 Iteration = 2"
result.2 "Tests = 3 Iteration = 2"
result.1 "Tests = 2 Iteration = 3"
result.2 "Tests = 3 Iteration = 3"
result.3 "Tests = 4 Iteration = 3"
result.1 "Tests = 2 Iteration = 4"
result.2 "Tests = 3 Iteration = 4"
result.3 "Tests = 4 Iteration = 4"
result.4 "Tests = 5 Iteration = 4"
result.1 "Tests = 2 Iteration = 5"
result.2 "Tests = 3 Iteration = 5"
result.3 "Tests = 4 Iteration = 5"
result.4 "Tests = 5 Iteration = 5"
I'm looking for a way to set seeds in parallel, nested foreach() loops with the correct number of iterations. Any ideas?
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
