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