Marius Hofert
2013-Jan-23 00:53 UTC
[R] How to construct a valid seed for l'Ecuyer's method with given .Random.seed?
Dear expeRts, I struggle with the following problem using snow clusters for parallel computing: I would like to specify l'Ecuyer's random number generator. Base R creates a .Random.seed of length 7, the first value indicating the kind fo random number generator. I would thus like to use the components 2 to 7 as the seed for l'Ecuyer's random number generator. By doing so, I receive (see the minimal example below): ,---- | > Loading required package: Rmpi | Loading required package: grDevices | Loading required package: grDevices | Loading required package: grDevices | Loading required package: grDevices | 4 slaves are spawned successfully. 0 failed. | Loading required package: rlecuyer | Error in .lec.SetPackageSeed(seed) (from #11) : | Seed[0] >= -930997252, Seed is not set. `---- What's the problem? How can I construct a valid seed for l'Ecuyer's rng with just the information in .Random.seed? Thanks & Cheers, Marius Here is the minimal example: require(doSNOW) require(foreach) doForeach <- function(n, seed=1, type="MPI") { ## create cluster object cl <- snow::makeCluster(parallel::detectCores(), type=type) on.exit(snow::stopCluster(cl)) ## shut down cluster and terminate execution environment registerDoSNOW(cl) ## register the cluster object with foreach ## seed if(seed=="L'Ecuyer-CMRG") { if(!exists(".Random.seed")) stop(".Random.seed does not exist - in l'Ecuyer setting") .t <- snow::clusterSetupRNG(cl, seed=.Random.seed[2:7]) # => fails! } ## actual work foreach(i=seq_len(n)) %dopar% { runif(1) } } ## "standard" (base) way of specifying l'Ecuyer RNGkind("L'Ecuyer-CMRG") # => .Random.seed is of length 7 res <- doForeach(10, seed="L'Ecuyer-CMRG")
Marius Hofert
2013-Jan-23 07:02 UTC
[R] How to construct a valid seed for l'Ecuyer's method with given .Random.seed?
Dear Hana, Thanks a lot for helping. That's interesting. What package versions do you use? By executing your (even more) minimal example, I get this:> library(snow) > RNGkind("L'Ecuyer-CMRG") > cl <- makeCluster(parallel::detectCores(), type="MPI")Loading required package: Rmpi Loading required package: grDevices Loading required package: grDevices Loading required package: grDevices Loading required package: grDevices 4 slaves are spawned successfully. 0 failed.> .t <- snow::clusterSetupRNG(cl, seed=.Random.seed[2:7])Loading required package: rlecuyer Error in .lec.SetPackageSeed(seed) : Seed[0] >= -1002165933, Seed is not set.> traceback()4: .Call("r_set_package_seed", as.double(seed), PACKAGE = "rlecuyer") 3: .lec.SetPackageSeed(seed) 2: clusterSetupRNGstream(cl, ...) 1: snow::clusterSetupRNG(cl, seed = .Random.seed[2:7]) Here is the output of sessionInfo()> sessionInfo()R version 2.15.2 (2012-10-26) Platform: x86_64-pc-linux-gnu (64-bit) locale: [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 [7] LC_PAPER=C LC_NAME=C [9] LC_ADDRESS=C LC_TELEPHONE=C [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C attached base packages: [1] stats graphics utils datasets grDevices methods base other attached packages: [1] rlecuyer_0.3-3 Rmpi_0.5-9 snow_0.3-10 loaded via a namespace (and not attached): [1] compiler_2.15.2 parallel_2.15.2 tools_2.15.2>Hana Sevcikova writes:> Marius, > > It does not fail for me. I'm doing > >> library(snow) >> RNGkind("L'Ecuyer-CMRG") >> cl <- makeCluster(parallel::detectCores(), type="MPI") > 4 slaves are spawned successfully. 0 failed. >> .t <- snow::clusterSetupRNG(cl, seed=.Random.seed[2:7]) >> stopCluster(cl) > > Hana > > > On 1/22/13 4:53 PM, Marius Hofert wrote: >> Dear expeRts, >> >> I struggle with the following problem using snow clusters for parallel >> computing: I would like to specify l'Ecuyer's random number generator. Base R >> creates a .Random.seed of length 7, the first value indicating the kind fo >> random number generator. I would thus like to use the components 2 to 7 as the >> seed for l'Ecuyer's random number generator. >> >> By doing so, I receive (see the minimal example below): >> >> ,---- >> | > Loading required package: Rmpi >> | Loading required package: grDevices >> | Loading required package: grDevices >> | Loading required package: grDevices >> | Loading required package: grDevices >> | 4 slaves are spawned successfully. 0 failed. >> | Loading required package: rlecuyer >> | Error in .lec.SetPackageSeed(seed) (from #11) : >> | Seed[0] >= -930997252, Seed is not set. >> `---- >> >> What's the problem? How can I construct a valid seed for l'Ecuyer's rng with >> just the information in .Random.seed? >> >> Thanks & Cheers, >> >> Marius >> >> >> Here is the minimal example: >> >> require(doSNOW) >> require(foreach) >> >> doForeach <- function(n, seed=1, type="MPI") >> { >> ## create cluster object >> cl <- snow::makeCluster(parallel::detectCores(), type=type) >> on.exit(snow::stopCluster(cl)) ## shut down cluster and terminate execution environment >> registerDoSNOW(cl) ## register the cluster object with foreach >> >> ## seed >> if(seed=="L'Ecuyer-CMRG") { >> if(!exists(".Random.seed")) stop(".Random.seed does not exist - in l'Ecuyer setting") >> .t <- snow::clusterSetupRNG(cl, seed=.Random.seed[2:7]) # => fails! >> } >> >> ## actual work >> foreach(i=seq_len(n)) %dopar% { >> runif(1) >> } >> } >> >> ## "standard" (base) way of specifying l'Ecuyer >> RNGkind("L'Ecuyer-CMRG") # => .Random.seed is of length 7 >> res <- doForeach(10, seed="L'Ecuyer-CMRG") >> >
Marius Hofert
2013-Jan-23 07:22 UTC
[R] How to construct a valid seed for l'Ecuyer's method with given .Random.seed?
I updated to the latest CRAN versions of 'rlecuyer', 'Rmpi', and 'snow': ,----[ sessionInfo() ] | ... | other attached packages: | [1] rlecuyer_0.3-3 Rmpi_0.6-1 snow_0.3-10 | ... `---- But I still obtain: ,---- | Error in .lec.SetPackageSeed(seed) : | Seed[1] >= -1065242851, Seed is not set. `---- when executing ,---- | library(snow) | RNGkind("L'Ecuyer-CMRG") | cl <- makeCluster(parallel::detectCores(), type="MPI") | .t <- snow::clusterSetupRNG(cl, seed=.Random.seed[2:7]) | stopCluster(cl) `----
Marius Hofert
2013-Jan-24 07:09 UTC
[R] How to construct a valid seed for l'Ecuyer's method with given .Random.seed?
Dear Daniel, That's exactly what I also suspected (last post). The question now seems how to correctly convert .Random.seed from signed to unsigned so that it is accepted by the rlecuyer package. Cheers, Marius