Changeset 306 for trunk/src/random.py
- Timestamp:
- 04/24/08 15:38:32 (5 years ago)
- Files:
-
- 1 modified
-
trunk/src/random.py (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/random.py
r275 r306 56 56 """Wrapper for the numpy.random.RandomState class (Mersenne Twister PRNG).""" 57 57 58 def __init__(self, seed=None ):58 def __init__(self, seed=None, rank=0, num_processes=1, parallel_safe=False): 59 59 AbstractRNG.__init__(self, seed) 60 60 self.rng = numpy.random.RandomState() … … 63 63 else: 64 64 self.rng.seed() 65 self.rank = rank # MPI rank 66 self.num_processes = num_processes # total number of MPI processes 67 self.parallel_safe = parallel_safe 65 68 66 69 def __getattr__(self, name): … … 72 75 73 76 If n is 1, return a float, if n > 1, return a numpy array, 74 if n < 0, raise an Exception.""" 77 if n < 0, raise an Exception.""" 75 78 if n == 0: 76 return numpy.random.rand(0) # We return an empty array 77 if n > 0: 78 return getattr(self.rng, distribution)(size=n, *parameters) 79 rarr = numpy.random.rand(0) # We return an empty array 80 elif n > 0: 81 if self.num_processes > 1 and not self.parallel_safe: 82 # n is the number for the whole model, so if we do not care about 83 # having exactly the same random numbers independent of the 84 # number of processors (m), we only need generate n/m+1 per node 85 # (assuming round-robin distribution of cells between processors) 86 n = n/self.num_processes + 1 87 rarr = getattr(self.rng, distribution)(size=n, *parameters) 79 88 #elif n == 1: 80 # r eturngetattr(self.rng, distribution)(size=1, *parameters)[0]89 # rarr = getattr(self.rng, distribution)(size=1, *parameters)[0] 81 90 else: 82 91 raise ValueError, "The sample number must be positive" 83 92 if self.parallel_safe and self.num_processes > 1: 93 # strip out the random numbers that should be used on other processors 94 rarr = rarr[numpy.arange(self.rank, len(rarr), self.num_processes)] 95 return rarr 84 96 85 97 class GSLRNG(AbstractRNG):
