Skip to content
Extraits de code Groupes Projets
Valider 11d8d322 rédigé par Anzo's avatar Anzo
Parcourir les fichiers

added mpi randomized values

parent e5e07105
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
#Uses MPI to dispatch random number generation on multiple nodes.
#files are saved into .npy files which can be loaded later with numpy
from mpi4py import MPI
from generators import *
from datetime import datetime
comm = MPI.COMM_WORLD
size = comm.Get_size() # we suppose > 1
rank = comm.Get_rank()
#Wrapper for outside call
def MPIBatchRandomNormalized(generator,elmPerNode):
name = type(generator).__name__
N = elmPerNode
if rank == 0:
print("processing "+name+"...")
#set seed with rank offset
generator.seed(rank + datetime.now().timestamp())
randomNumbers = generator.batchRandomNormalized(N)
#receives all the results.
gathered = comm.gather(data, root=0)
if rank==0:
data = np.array()
for l in gathered:
data += np.array(l)
print("Saving to "+name+".npz ...")
with open(name+".npy", "wb") as f:
np.save(f, data)
if __name__ == "__main__":
N = 1000000
generators = [ParkMiller(), KnuthLewis(), Marsaglia()
, LavauxJenssens(), Haynes(), MitchelMoore()
, MersenneTwister(), BlumBlumShub()]
for e in generators
MPIBatchRandomNormalized(e,N)
......@@ -4,6 +4,7 @@ import random
class RandomNumberGenerator:
def __init__(self):
self.max = 0 #for normalization
return NotImplementedError
def random(self):
......@@ -28,7 +29,7 @@ class RandomNumberGenerator:
"""
return n normalized values
"""
return [self.randomNorm() for i in range(n)]
return [self.random() for i in range(n)] / self.max
class LCG(RandomNumberGenerator):
......@@ -42,6 +43,7 @@ class LCG(RandomNumberGenerator):
self.c = c
self.a = a
self.x = 0 # default seed
self.max = self.m + 1
def random(self):
self.x = (self.a * self.x + self.c) % self.m
......@@ -51,7 +53,7 @@ class LCG(RandomNumberGenerator):
self.x = seed
def randomNorm(self):
return self.random() / (self.m + 1)
return self.random() / self.max
class ParkMiller(LCG):
......@@ -110,6 +112,7 @@ class LaggedFibonnaci(RandomNumberGenerator):
self.m = m
self.ParkMiller = ParkMiller()
self.values = []
self.max = self.m + 1
def seed(self, seed):
self.ParkMiller.seed(seed)
......@@ -124,7 +127,7 @@ class LaggedFibonnaci(RandomNumberGenerator):
return self.values[-1]
def randomNorm(self):
return self.random() / (self.m + 1)
return self.random() / self.max
class MitchelMoore(LaggedFibonnaci):
......@@ -164,6 +167,7 @@ class CNS(RandomNumberGenerator):
super().__init__()
self.M = M
self.x = x0 # must verify pgcd(M,x0) = 1
self.max = M + 1
def seed(self, seed):
self.x = seed
......@@ -173,7 +177,7 @@ class CNS(RandomNumberGenerator):
return self.x
def randomNorm(self):
return self.random() / (self.M + 1)
return self.random() / self.max
class BlumBlumShub(CNS):
......
......@@ -2,30 +2,43 @@ from generators import *
from datetime import datetime
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
if __name__=="__main__":
##INIT PARAMS##
N = 1000000
RESOLUTION = 100
#set seaborn params
sns.set_theme(style="darkgrid")
#bandwidth for smooth density
#https://en.wikipedia.org/wiki/Kernel_density_estimation#Bandwidth_selection
BW = 0.337
#init generators
generators = [ParkMiller(), KnuthLewis(), Marsaglia()
, LavauxJenssens(), Haynes(), MitchelMoore()
, MersenneTwister(), BlumBlumShub()]
#init seed on timesystem
seed = datetime.now().timestamp()
N = 1000000
RESOLUTION = 100
#generate each diagrams for each random func
for e in generators:
name = type(e).__name__
print("processing "+name+"...")
e.seed(seed)
res = e.batchRandomNormalized(N)
results.append(results)
print("building histograms..")
#matplotlib prep
#see https://matplotlib.org/stable/gallery/statistics/histogram_features.html#sphx-glr-gallery-statistics-histogram-features-py
fig, ax = plt.subplots()
n, bins, patches = ax.hist(res, RESOLUTION, density=True)
sns.displot(res, kde=True)
ax.set_xlabel('Value')
ax.set_ylabel('Probability density')
ax.set_title(type(e).__name__)
#plt.show()
plt.savefig(type(e).__name__+'.png')
#generate diagrams with all randoms
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter