SCM

SCM Repository

[rmetrics] Annotation of /pkg/randtoolbox/R/pseudoRNG.R
ViewVC logotype

Annotation of /pkg/randtoolbox/R/pseudoRNG.R

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4236 - (view) (download)

1 : dutangc 4229 ##
2 :     # @file pseudoRNG.R
3 :     # @brief R file for all pseudo RNGs
4 :     #
5 :     # @author Christophe Dutang
6 :     # @author Petr Savicky
7 :     #
8 :     #
9 :     # Copyright (C) 2009, Christophe Dutang,
10 :     # Petr Savicky, Academy of Sciences of the Czech Republic.
11 :     # All rights reserved.
12 :     #
13 :     # The new BSD License is applied to this software.
14 :     # Copyright (c) 2009 Christophe Dutang, Petr Savicky.
15 :     # All rights reserved.
16 :     #
17 :     # Redistribution and use in source and binary forms, with or without
18 :     # modification, are permitted provided that the following conditions are
19 :     # met:
20 :     #
21 :     # - Redistributions of source code must retain the above copyright
22 :     # notice, this list of conditions and the following disclaimer.
23 :     # - Redistributions in binary form must reproduce the above
24 :     # copyright notice, this list of conditions and the following
25 :     # disclaimer in the documentation and/or other materials provided
26 :     # with the distribution.
27 :     # - Neither the name of the Academy of Sciences of the Czech Republic
28 :     # nor the names of its contributors may be used to endorse or promote
29 :     # products derived from this software without specific prior written
30 :     # permission.
31 :     #
32 :     # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33 :     # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34 :     # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
35 :     # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36 :     # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
37 :     # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
38 :     # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
39 :     # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
40 :     # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
41 :     # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
42 :     # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43 :     #
44 :     #
45 : dutangc 4236 #############################################################################
46 : dutangc 3644 ### pseudo random generation
47 :     ###
48 :     ### R functions
49 :     ###
50 :    
51 :    
52 :     ### set the seed ###
53 :    
54 :     setSeed <- function(seed)
55 :     invisible( .Call("doSetSeed", seed) )
56 :    
57 :    
58 :     ### pseudo random generation ###
59 :    
60 :     congruRand <- function(n, dim = 1, mod = 2^31-1, mult = 16807, incr = 0, echo)
61 :     {
62 :     if(!is.numeric(n) || any(n <=0))
63 :     stop("invalid argument 'n'")
64 :     if(!is.numeric(dim) || length(dim) !=1 || any(dim <= 0))
65 :     stop("invalid argument 'dim'")
66 :     if(!is.numeric(mod) || length(mod) !=1)
67 :     stop("invalid argument 'mod'")
68 :     if(!is.numeric(mult) || length(mult) != 1 || mult > mod || mult < 0)
69 :     stop("invalid argument 'mult'")
70 :     if(!is.numeric(incr) || length(incr) != 1 || incr > mod || incr < 0)
71 :     stop("invalid argument 'incr'")
72 :    
73 :     if(missing(echo))
74 :     echo <- FALSE
75 :    
76 :     if(length(n) > 1)
77 :     res <- .Call("doCongruRand", length(n), dim, mod, mult, incr, echo)
78 :     else
79 :     res <- .Call("doCongruRand", n, dim, mod, mult, incr, echo)
80 :     if(dim == 1)
81 :     as.vector(res)
82 :     else
83 :     as.matrix(res)
84 :     }
85 :    
86 :     SFMT <- function(n, dim = 1, mexp = 19937, usepset = TRUE, withtorus = FALSE, usetime = FALSE)
87 :     {
88 :     if(n <0 || is.array(n))
89 :     stop("invalid argument 'n'")
90 :     if(dim < 0 || length(dim) >1)
91 :     stop("invalid argument 'dim'")
92 :     if(!is.logical(withtorus) && !is.numeric(withtorus))
93 :     stop("invalid argument 'withtorus'")
94 :     if(!is.numeric(mexp))
95 :     stop("invalid argument 'mexp'")
96 :     if(!is.logical(usepset))
97 :     stop("invalid argument 'usepset'")
98 :    
99 :     authorizedParam <- c(607, 1279, 2281, 4253, 11213, 19937, 44497, 86243, 132049, 216091)
100 :    
101 :     if( !(mexp %in% authorizedParam) )
102 :     stop("'mexp' must be in {607, 1279, 2281, 4253, 11213, 19937, 44497, 86243, 132049, 216091}. ")
103 :    
104 :    
105 :     if(!is.logical(withtorus))
106 :     {
107 :     if(0 < withtorus && withtorus <= 1)
108 :     nbTorus <- floor( withtorus * n )
109 :     if(withtorus <=0 || withtorus > 1)
110 :     stop("invalid argument 'withtorus'")
111 :     }
112 :     if(is.logical(withtorus))
113 :     {
114 :     if(!withtorus)
115 :     nbTorus <- 0
116 :     else
117 :     stop("invalid argument 'withtorus'")
118 :     }
119 :    
120 :     if(nbTorus == 0)
121 :     {
122 :     if(length(n) > 1)
123 :     res <- .Call("doSFMersenneTwister", length(n), dim, mexp, usepset)
124 :     else
125 :     res <- .Call("doSFMersenneTwister", n, dim, mexp, usepset)
126 :     }
127 :     else
128 :     {
129 :     restorus <- torus(nbTorus, dim, mixed = FALSE, usetime = usetime)
130 :    
131 :     if(length(n) > 1)
132 :     res <- .Call("doSFMersenneTwister", length(n) - nbTorus, dim, mexp, usepset)
133 :     else
134 :     res <- .Call("doSFMersenneTwister", n- nbTorus, dim, mexp, usepset)
135 :    
136 :     res <- rbind(res, as.matrix( restorus, nbTorus, dim) )
137 :     }
138 :    
139 :     if(dim == 1)
140 :     as.vector(res)
141 :     else
142 :     as.matrix(res)
143 :     }
144 :    
145 :     WELL <- function(n, dim = 1, order = 512, temper = FALSE, version = "a")
146 :     {
147 :     if(n <0 || is.array(n))
148 :     stop("invalid argument 'n'")
149 :     if(dim < 0 || length(dim) >1)
150 :     stop("invalid argument 'dim'")
151 :     if(!is.numeric(order))
152 :     stop("invalid argument 'order'")
153 :     if( !(order %in% c(512, 521, 607, 800, 1024, 19937, 21701, 23209, 44497) ) )
154 :     stop("'order' must be in {512, 521, 607, 800, 1024, 19937, 21071, 23209, 44497}.")
155 :     if( !(version %in% c("a", "b") ) )
156 :     stop("'version' must be either 'a' or 'b'.")
157 :    
158 :     if(!is.logical(temper))
159 :     stop("invalid argument 'temper'")
160 :     if(temper && order %in% c(512, 521, 607, 1024))
161 :     stop("tempering impossible")
162 :    
163 :     zeversion <- 0
164 :     if(version == "a")
165 :     zeversion <- 1
166 :     if(version == "b")
167 :     zeversion <- 2
168 :     if(zeversion == 0)
169 :     stop("wrong version for WELL RNG")
170 :     if(version == "b" && order %in% c(512, 21701) )
171 :     stop("this WELL RNG does not have a 'b' version")
172 :    
173 :     if(length(n) > 1)
174 :     res <- .Call("doWELL", length(n), dim, order, temper, zeversion)
175 :     else
176 :     res <- .Call("doWELL", n, dim, order, temper, zeversion)
177 :    
178 :    
179 :    
180 :     if(dim == 1)
181 :     as.vector(res)
182 :     else
183 :     as.matrix(res)
184 :     }
185 :    
186 :     knuthTAOCP <- function(n, dim = 1)
187 :     {
188 :     if(n <0 || is.array(n))
189 :     stop("invalid argument 'n'")
190 :     if(dim < 0 || length(dim) >1)
191 :     stop("invalid argument 'dim'")
192 :    
193 :     if(length(n) > 1)
194 :     res <- .Call("doKnuthTAOCP", length(n), dim)
195 :     else
196 :     res <- .Call("doKnuthTAOCP", n, dim)
197 :    
198 :     if(dim == 1)
199 :     as.vector(res)
200 :     else
201 :     as.matrix(res)
202 :     }
203 :    

root@r-forge.r-project.org
ViewVC Help
Powered by ViewVC 1.0.0  
Thanks to:
Vienna University of Economics and Business Powered By FusionForge