From 4adafc759ad044d5a33d5c84663878ee41495a09 Mon Sep 17 00:00:00 2001 From: Enzo De Carvalho Bittencourt <enzo.decarvalhobittencourt@ensiie.eu> Date: Wed, 27 Sep 2023 15:19:45 +0200 Subject: [PATCH] algorithm shit --- Random/__pycache__/generators.cpython-311.pyc | Bin 11327 -> 12235 bytes Random/__pycache__/graph.cpython-311.pyc | Bin 0 -> 3372 bytes Random/generators.py | 17 ++-- Random/graph.py | 66 ++++++++++++++ Random/main.py | 84 ++++++++++++------ 5 files changed, 132 insertions(+), 35 deletions(-) create mode 100644 Random/__pycache__/graph.cpython-311.pyc diff --git a/Random/__pycache__/generators.cpython-311.pyc b/Random/__pycache__/generators.cpython-311.pyc index e579af00a05d62910d89bae5f79fead178f00e0d..1c7c6f91a25c41bbce2b366bb6cebb89630411f5 100644 GIT binary patch literal 12235 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 J9~9Hl{|7y182bPK literal 11327 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 diff --git a/Random/__pycache__/graph.cpython-311.pyc b/Random/__pycache__/graph.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4b02a4711d5363d2de598766976864cde8cc605 GIT binary patch literal 3372 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 DD{bVt literal 0 HcmV?d00001 diff --git a/Random/generators.py b/Random/generators.py index bbd6b19..378fb00 100644 --- a/Random/generators.py +++ b/Random/generators.py @@ -1,6 +1,6 @@ ## Various Random Generators ## import random - +import numpy as np class RandomNumberGenerator: def __init__(self): @@ -29,7 +29,7 @@ class RandomNumberGenerator: """ return n normalized values """ - return [self.random() for i in range(n)] / self.max + return np.divide(np.array([self.random() for i in range(n)]),self.max) class LCG(RandomNumberGenerator): @@ -62,7 +62,7 @@ class ParkMiller(LCG): """ def __init__(self): - super().__init__(16807, 0, 2147483647) + super().__init__(16807, 0, (2**31) - 1) class KnuthLewis(LCG): @@ -71,7 +71,7 @@ class KnuthLewis(LCG): """ def __init__(self): - super().__init__(1664525, 1013904223, 4294967296) + super().__init__(1664525, 1013904223, 2**32) class Marsaglia(LCG): @@ -80,7 +80,7 @@ class Marsaglia(LCG): """ def __init__(self): - super().__init__(69069, 0, 4294967296) + super().__init__(69069, 0, 2**32) class LavauxJenssens(LCG): @@ -89,7 +89,7 @@ class LavauxJenssens(LCG): """ def __init__(self): - super().__init__(31167285, 1, 281474976710656) + super().__init__(31167285, 1, 2**48) class Haynes(LCG): @@ -98,7 +98,7 @@ class Haynes(LCG): """ def __init__(self): - super().__init__(6364136223846793005, 1, 18446744073709552000) + super().__init__(6364136223846793005, 1, 2**64) class LaggedFibonnaci(RandomNumberGenerator): @@ -157,6 +157,9 @@ class MersenneTwister(RandomNumberGenerator): def random(self): return self.randomNorm() + def batchRandomNormalized(self,n): + return np.array([self.random() for i in range(n)]) + class CNS(RandomNumberGenerator): """ diff --git a/Random/graph.py b/Random/graph.py index e69de29..64974ff 100644 --- a/Random/graph.py +++ b/Random/graph.py @@ -0,0 +1,66 @@ +""" +Module for graphing +""" + +import matplotlib.pyplot as plt +import numpy as np +import seaborn as sns + +def hist_distributivity_graph(N,RESOLUTION,seed,data): + """ + graphs histograms + see values function in main module + """ + for name in data: + print("building "+str(name)+" histogram...") + xlabel= "Value" + ylabel="Count" + title_name= name +"\n N = "+str(N)+"\n seed = "+str(seed) + graph=sns.displot(data[name], kde=True) + graph.set(title=title_name) + graph.set_axis_labels(xlabel,ylabel) + graph.savefig(name+'_hist.png', bbox_inches='tight') + return + +def ecdf_graph(N,RESOLUTION,seed,data): + """ + graphs histograms + see values function in main module + """ + plt.clf() + for name in data: + print("building "+str(name)+" ecdf...") + xlabel= "Value" + ylabel="Cumulative Probability" + title_name= name +"\n N = "+str(N)+"\n seed = "+str(seed) + graph=sns.displot(data[name], kind="ecdf") + graph.set(title=title_name) + graph.set_axis_labels(xlabel,ylabel) + graph.savefig(name+'_ecdf.png', bbox_inches='tight') + return + +def compare(N, RESOLUTION, seed, data): + """ + Create graphs superposing two, already generated, + distributivity + """ + plt.clf() + BW = 0.337 + name = "compare_" + for e in data: + name += e+"_" + + #subdata = {k : data[k] for k in names} + print("graphing "+str(name)+"...") + + xlabel = "Value" + ylabel = "Density" + title_name="N = "+str(N)+"\n seed = "+str(seed) + if N == 0: + title_name = "seed = "+str(seed) + graph=sns.kdeplot(data,legend=True,bw_adjust=BW,common_norm=False) + graph.set(title=title_name) + plt.xlabel(xlabel) + plt.ylabel(ylabel) + plt.savefig(name+'.png', bbox_inches='tight') + return diff --git a/Random/main.py b/Random/main.py index 4473b35..936aeb7 100755 --- a/Random/main.py +++ b/Random/main.py @@ -1,29 +1,23 @@ from generators import * +import graph from datetime import datetime import matplotlib.pyplot as plt import numpy as np import seaborn as sns -if __name__=="__main__": +#shut up stupid warnings from not "the-most-up-to-date" libraries +import warnings +warnings.simplefilter(action='ignore', category=FutureWarning) - ##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() - +def subdict(keys,dictio): + return {k : dictio[k] for k in keys} + +def values(N, seed, generators): + """ + random values N elements and given seed. + Returns a dictionnary with values + """ + results = {} #generate each diagrams for each random func for e in generators: name = type(e).__name__ @@ -31,14 +25,48 @@ if __name__=="__main__": print("processing "+name+"...") e.seed(seed) res = e.batchRandomNormalized(N) - results.append(results) + results[name] = res + return results + +def iteratives(N, seed, generator): + """ + Random values iteratively with same seed and list N + """ + results = {} + #generate each diagrams for each random func + for n in N: + name = type(generator).__name__+"_"+str(n) - print("building histograms..") - fig, ax = plt.subplots() - sns.displot(res, kde=True) - ax.set_xlabel('Value') - ax.set_ylabel('Probability density') - ax.set_title(type(e).__name__) - plt.savefig(type(e).__name__+'.png') + print("processing "+name+"...") + generator.seed(seed) + res = generator.batchRandomNormalized(n) + results[name] = res + return results - #generate diagrams with all randoms +if __name__=="__main__": + ##INIT PARAMS## + N = 100 + RESOLUTION = 1000 + + #init generators + generators = [ParkMiller(), KnuthLewis(), Marsaglia() + , LavauxJenssens(), Haynes(), MitchelMoore() + , MersenneTwister(), BlumBlumShub()] + + #init seed on timesystem + seed = int(datetime.now().timestamp()) + + #set seaborn params + sns.set_theme(style="darkgrid") + + #generate all diagrams + data = values(N,seed,generators) + + #graph.hist_distributivity_graph(N,RESOLUTION,seed,data) + #graph.compare(N, RESOLUTION, seed + # , subdict(["ParkMiller","KnuthLewis","Haynes"], data)) + + #graph.ecdf_graph(N,RESOLUTION,seed,data) + + graph.compare(0, RESOLUTION, seed + , iteratives([1000, 100000, 100000000], seed, ParkMiller())) -- GitLab