'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