diff --git a/tp_2_miso_mphf.py b/tp_2_miso_mphf.py index 7dce6468447a6103da80866466bfb79c9b5f4d97..22b98064203fe46128b821d6dc4853e1f33a668e 100644 --- a/tp_2_miso_mphf.py +++ b/tp_2_miso_mphf.py @@ -49,44 +49,64 @@ def construction_mphf(set_kmer, n, gamma=2, nb_niveaux=3): tableau_principal = [-1] * (gamma * l) # on parcourt la liste de k_mers 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) h = abs(hash(kmer)) - # récupérer l'adresse - adresse = None + # récupérer l'adresse / % = modulo -> ça garantit que la valeur est forcément ajoutée à un endroit du tableau + adresse = h%len(tableau_principal) # si le tableau principal est déjà rempli à l'adresse: - if adresse : + if tableau_principal[adresse] != -1: # mettre le kmer dans collision() collision.add(h) #sinon, écrire le hash à l'adresse dans le tableau principal else : tableau_principal[adresse] = h - - tableaux.append(tableau_principal) # expliquer - set_kmer_courant = collision.copy() # expliquer - collision = set() # expliquer + + # Ici, tableaux correspond à la structure qui contient les tableaux des différents niveaux + tableaux.append(tableau_principal) + # On incorpore à set_kmer_courant, l'ensemble des kmers n'ayant pas été ajouté au tableau principal à cause d'une collision + set_kmer_courant = collision.copy() + # On réinitialise collision pour le niveau suivant + collision = set() # Construction de la MPHF + # On initialise une liste vide qui contiendra la table de hashage finale mphf = [] + # On initialise un tableau vide grand_tableau = [] + # On parcours tous les tableaux dans tableaux (tableaux étant une liste de listes) for tableau in tableaux: - grand_tableau.extend(tableau) # expliquer + # On fusionne tous les tableaux un même tableau + grand_tableau.extend(tableau) + # on initialise une variable rang qui contiendra les rangs des kmers rangs = [] + # On initialise le rang maximal par 0 max_rang = 0 + # i = 0 + # On parcours tous les kmers dans set_kmer for kmer in set_kmer: - pass # compléter: # hacher le kmer + h2 = abs(hash(kmer)) # si le hash est dans le grand_tableau + if h in grand_tableau: # récupérer son index + index = grand_tableau[h] # récupérer son rang (utiliser la fonction count()) + c = grand_tableau[0:index].count(-1) + rang = index - c # ajouter à la mphf [h, rang] + mphf.append((h, rang)) # mettre à jour max_rang + max_rang += 1 - for kmer in set_kmer_courant: #gestion des collisions: expliquer les 3 lignes du dessous + # On parcourt la liste des kmers restant suite aux collisions + for kmer in set_kmer_courant: + # On aggrandit max_rang pour chaque valeur ajoutée max_rang += 1 + # On attribue une valeur de hashage au kmer h = abs(hash(kmer)) + # On l'ajoute à la fin du tableau final mphf.append([h, max_rang]) return mphf @@ -115,12 +135,8 @@ def get_hash_mphf(mphf, kmer): 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 - - Parameters: - set_kmer (set): Ensemble de k-mers. - n (int): Taille de la table de hachage. + """ for _ in range(len(index)): + c = grand_tableau.count(-1)chage. Returns: list: Table de hachage créée à partir des k-mers @@ -181,3 +197,6 @@ def compare_taille(n_max, fichier_sortie): # dé-commenter quand vous êtes prêts, expliquer les résultats #compare_taille(10000,"mphf.png") + +import doctest +doctest.testmod() \ No newline at end of file