From 85338186468637804cf0eaa13dde025cb4a447e0 Mon Sep 17 00:00:00 2001
From: Nguyen Samuel <samuel.nguyen.etu@a16p18.fil.univ-lille.fr>
Date: Wed, 26 Feb 2025 14:43:47 +0100
Subject: [PATCH] =?UTF-8?q?Partie=201=20finie.=20Partie=202=20commenc?=
 =?UTF-8?q?=C3=A9e=20jusqu'=C3=A0=20la=20question=202?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 mphf.png          | Bin 0 -> 34354 bytes
 tp_2_miso_dict.py |  18 +++++++-
 tp_2_miso_mphf.py | 114 +++++++++++++++++++++++++++++++---------------
 3 files changed, 94 insertions(+), 38 deletions(-)
 create mode 100644 mphf.png

diff --git a/mphf.png b/mphf.png
new file mode 100644
index 0000000000000000000000000000000000000000..f6cc3bd47d535596ce940f235d3855d4b9765fd7
GIT binary patch
literal 34354
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

literal 0
HcmV?d00001

diff --git a/tp_2_miso_dict.py b/tp_2_miso_dict.py
index 98d2a0c..2fb1d59 100644
--- a/tp_2_miso_dict.py
+++ b/tp_2_miso_dict.py
@@ -7,10 +7,26 @@ import sys
 
 ###### PARTIE 2 ######
 
-def experiment_load_factor(load_factors):
+def experiment_load_factor(load_factors : list):
 	"""
 	Étude du facteur de charge
+	Parameters
+	----------
+	load_factors : list
+		Une liste de facteurs de charge
+	Returns
+	-------
+	lists
+		Les temps d'insertion de clefs
+		Les nombres de réallocations de mémoire
+		Les tailles de mémoire occupée par le dictionnaire pour chaque facteur de charge
 	"""
+	insertion_times = []
+	num_resizes = []
+	sizes = []
+	for factor in load_factors :
+		dictio = {}
+	# num_elements = .......... QUESTION 2 PARTIE 2
 	return [],[],[]
 
 def experiment_longest():
diff --git a/tp_2_miso_mphf.py b/tp_2_miso_mphf.py
index ebc3d33..3aee1c4 100644
--- a/tp_2_miso_mphf.py
+++ b/tp_2_miso_mphf.py
@@ -39,42 +39,64 @@ def construction_mphf(set_kmer, n, gamma=2, nb_niveaux=3):
 	for _ in range(nb_niveaux):
 		if len(set_kmer_courant) > 0:
 			l = len(set_kmer_courant)
+			if l==0 :
+				break #Evite une division par 0
 			tableau_principal = [-1] * (gamma * l)
 			for kmer in set_kmer_courant:
-				pass # compléter
 				# hacher le k-mer (attention, hash() peut rendre des entiers signés, nous voulons des entiers positifs)
+				hachage = abs(hash(kmer))
 				# récupérer l'adresse
 				# si le tableau principal est déjà rempli à l'adresse:
 					# mettre le kmer dans collision()
-					#sinon, écrire le hash à l'adresse dans le tableau principal
-
+					# sinon, écrire le hash à l'adresse dans le tableau principal
+				adresse = hachage % (gamma * l)
+				if tableau_principal[adresse] != -1:
+					collision.add(kmer)
+				else:
+					tableau_principal[adresse] = hachage
 			tableaux.append(tableau_principal) # expliquer
+			# Chaque niveau de hachage produit un nouveau tableau de hachage.
+			# Donc on enregistre le tableau dans tableaux pour garder une trace des niveaux.
 			set_kmer_courant = collision.copy() # expliquer
+			# On hache à nouveau les k-mers qui ont causé des collisions.
 			collision = set() # expliquer
+			# On réinitialise collision pour le prochain niveau de hachage, pour pas que les valeurs dont on n'a plus besoin s'accumulent.
+			if not set_kmer_courant:  # Arrête la boucle si plus de collisions
+				break
 
 	# Construction de la MPHF
 	mphf = [] 
 	grand_tableau = []
 	for tableau in tableaux:
 		grand_tableau.extend(tableau) # expliquer
+	# Après avoir fait tous les hachages, on regroupe les tableaux finaux de hachage dans un seul tableau.
+	grand_tableau_dict = {val: i for i, val in enumerate(grand_tableau)}
 
-	rangs = []
 	max_rang = 0
 	i = 0
 	for kmer in set_kmer:
-		pass # compléter:
 		# hacher le kmer
+		hache = abs(hash(kmer))
 		# si le hash est dans le grand_tableau
 			# récupérer son index
 			# récupérer son rang (utiliser la fonction count())
 			# ajouter à la mphf [h, rang]
 			# mettre à jour max_rang
+		if hache in grand_tableau_dict :
+			index = grand_tableau_dict[hache]
+			rang = grand_tableau[:index].count(hache)
+			mphf.append([hache, rang])
+			max_rang = max(max_rang, rang)
 
 	for kmer in set_kmer_courant: #gestion des collisions: expliquer les 3 lignes du dessous
-		max_rang += 1
-		h = abs(hash(kmer))
-		mphf.append([h, max_rang])
-	
+		max_rang += 1 # On attribue un nouveau rang unique à chaque élément en collision.
+		h = abs(hash(kmer)) # Recalcul du hash, on veut uniquement des entiers positifs.
+		mphf.append([h, max_rang])  # On ajoute le k-mer à mphf
+		# On fait ces étapes car les collisions n'ont pas pu être placées avant,
+		#  on leur attribue un rang plus grand pour ne pas perturber l'ordre précédent
+	if not mphf:
+		print("⚠️ Attention : MPHF vide, vérifiez les données en entrée.")
+
 	return mphf
 
 
@@ -98,36 +120,46 @@ def get_hash_mphf(mphf, kmer):
 	>>> 0 <= hash_mphf < n
 	True
 	"""
-	pass # TODO modifier
-
-def create_hash_table(set_kmer, n):
-    """
-    Crée une table de hachage à partir d'un ensemble de k-mers et d'une mphf
+	hache = abs(hash(kmer))
+	for h, rang in mphf :
+		if h == hache :
+			return rang
+	return -1
 
-    Parameters:
-    set_kmer (set): Ensemble de k-mers.
-    n (int): Taille de la table de hachage.
 
-    Returns:
-    list: Table de hachage créée à partir des k-mers
-    mphf: la mphf
+def create_hash_table(set_kmer, n):
+	"""
+	Crée une table de hachage à partir d'un ensemble de k-mers et d'une mphf
 
-    Examples:
-    >>> set_kmer = {'ATCG', 'TGCA', 'GCTA'}
-    >>> n = 10
-    >>> tableau = create_hash_table(set_kmer, n)
-    >>> len(tableau) == n
-    True
-    >>> all(kmer in tableau for kmer in set_kmer)
-    True
-    """
-    pass # TODO modifier
-    # créer la mphf pour les kmers
-    # initialiser un tableau de taille n (une liste)
-    # écrire les kmers aux adresses du tableau données par la mphf
-    # retourner le tableau et la mphf
+	Parameters:
+	set_kmer (set): Ensemble de k-mers.
+	n (int): Taille de la table de hachage.
 
+	Returns:
+	list: Table de hachage créée à partir des k-mers
+	mphf: la mphf
 
+	Examples:
+	>>> set_kmer = {'ATCG', 'TGCA', 'GCTA'}
+	>>> n = 10
+	>>> tableau = create_hash_table(set_kmer, n)
+	>>> len(tableau) == n
+	True
+	>>> all(kmer in tableau for kmer in set_kmer)
+	True
+	"""
+	mphf = construction_mphf(set_kmer, n)   # créer la mphf pour les kmers
+	# initialiser un tableau de taille n (une liste)
+	tableau = [None]*n
+	# écrire les kmers aux adresses du tableau données par la mphf
+	for kmer in set_kmer :
+		adresse = get_hash_mphf(mphf, kmer)
+		if adresse == -1:
+			print(f"Erreur : Impossible de trouver l'adresse pour {kmer} (MPHF renvoie -1)")
+			continue
+		if 0 <= adresse < n:
+			tableau[adresse]=kmer
+	return tableau, mphf # retourner le tableau et la mphf
 
 
 def generer_kmers(n, k):
@@ -149,10 +181,12 @@ def compare_taille(n_max, fichier_sortie):
 	
 	for n in range(100, n_max, 1000):
 		set_kmer = generer_kmers(n, k)
-		tableau, mphf = create_hash_table(set_kmer,n)
+		tableau, mphf = create_hash_table(set_kmer, n)
 
 		n_values.append(n)
-		table_size.append(sys.getsizeof(tableau)+sys.getsizeof(mphf)) # pourquoi ici on ne mesure pas juste la taille en mémoire du tableau ? 
+		table_size.append(sys.getsizeof(tableau)+sys.getsizeof(mphf)) # pourquoi ici on ne mesure pas juste la taille en mémoire du tableau ?
+		#Car sys.getsizeof(tableau) ne mesure que la liste elle-même, pas les objets stockés dedans.
+		# On veut mesurer la mémoire totale du système de hachage, pas seulement la liste.
 		dict_size.append(sys.getsizeof(set_kmer))
 
 	plt.plot(n_values, table_size, label='Table avec MPHF')
@@ -166,4 +200,10 @@ def compare_taille(n_max, fichier_sortie):
 	plt.close()
 
 # dé-commenter quand vous êtes prêts, expliquer les résultats
-#compare_taille(10000,"mphf.png")
+compare_taille(10000,"mphf.png")
+
+# Sur le graphe obtenu, on observe que la taille de la table de hachage du dictionnaire augmente par paliers,
+# alors que celle de la MPHF augmente de manière linéaire, et beaucoup plus progressivement.
+# Cela est cohérent, en effet le dictionnaire va allouer plus d'espace dès que le nombre d'éléments atteint un seuil.
+# Quant à la MPHF, elle minimise la mémoire en évitant les collisions.
+
-- 
GitLab