Skip to content
Snippets Groups Projects
Commit 6bb763c4 authored by Pacome Riobe's avatar Pacome Riobe
Browse files

Update tp_2_miso_mphf.py

On a une fonction minimale parfaite
et get a l'air de fonctionner
parent 1cece38e
Branches
No related tags found
No related merge requests found
......@@ -8,31 +8,31 @@ import random
###### PARTIE 1 ######
def construction_mphf(set_kmer, n, gamma=2, nb_niveaux=3):
"""
Construit une fonction de hachage minimale parfaite (MPHF) pour un ensemble de k-mers.
Parameters:
set_kmer (set): Ensemble de k-mers.
n (int): Taille de l'ensemble de k-mers.
gamma (int): Facteur de réduction de la taille de la table de hachage. Default: 2.
nb_niveaux (int): Nombre de niveaux de réduction de la taille de la table de hachage. Default: 3.
Returns:
mphf (list): Table de hachage minimale parfaite.
Examples:
>>> set_kmer = {str(i) for i in range(10)}
>>> n = 10
>>> mphf = construction_mphf(set_kmer, n)
>>> len(mphf) == n
True
>>> all(0 <= mphf[i] < n for i in range(n))
True
>>> len(mphf) == n
True
"""
# Initialisation
"""
Construit une fonction de hachage minimale parfaite (MPHF) pour un ensemble de k-mers.
Parameters:
set_kmer (set): Ensemble de k-mers.
n (int): Taille de l'ensemble de k-mers.
gamma (int): Facteur de réduction de la taille de la table de hachage. Default: 2.
nb_niveaux (int): Nombre de niveaux de réduction de la taille de la table de hachage. Default: 3.
Returns:
mphf (list): Table de hachage minimale parfaite.
Examples:
>>> set_kmer = {str(i) for i in range(10)}
>>> n = 10
>>> mphf = construction_mphf(set_kmer, n)
>>> len(mphf) == n
True
>>> all(0 <= mphf[i] < n for i in range(n))
True
>>> len(mphf) == n
True
"""
# Initialisation
set_kmer_courant = set_kmer.copy()
tableaux = []
collision = set()
......@@ -41,25 +41,23 @@ def construction_mphf(set_kmer, n, gamma=2, nb_niveaux=3):
l = len(set_kmer_courant)
tableau_principal = [-1] * (gamma * l)
for kmer in set_kmer_courant:
hachage = abs(hash(kmer)) # positif
print(hachage)
hachage = abs(hash(kmer))# positif
adresse = hachage % len(tableau_principal)
if tableau_principal[adresse] != -1: # Collision
collision.add(kmer)
else:
tableau_principal[adresse] = hachage # Stocker le hachage
tableaux.append(tableau_principal) # on conserve les positions sans collision dans notre table finale
tableaux.append(tableau_principal) # expliquer
set_kmer_courant = collision.copy() # expliquer
collision = set() # expliquer
set_kmer_courant = collision.copy() # on prépare les positions en collision dans le set
# courant pour un nouveau hachage
collision = set() # on replace les positions non-hachées en tant que set pour le hachage
# Construction de la MPHF
mphf = []
grand_tableau = []
for tableau in tableaux:
grand_tableau.extend(tableau) # expliquer
grand_tableau.extend(tableau) # on ajoute tous les éléments de tous les tabeaux dans le tableau final, sans renvoyer de valeur
rangs = []
max_rang = 0
count = 0
......@@ -68,24 +66,21 @@ def construction_mphf(set_kmer, n, gamma=2, nb_niveaux=3):
h_tab = grand_tableau[pos]
if h_tab != -1:
count += 1
list_h_pos.append((h_tab, count))
#tester et approuver par les autorité competente, fait une liste sous forme :
# [(2052854839243325982, 1), (4957333478667127183, 2), (937960722055874324, 3), (5781457990790611126, 4), (639567318783299370, 5), (8946549155908438712, 6), (2965694465669227395, 7), (2528361345495398196, 8), (4425804304571150798, 9), (8833577342042152210, 10)]
list_h_pos.append((h_tab, count)) # fonction de hashage minimale parfaite !
col_h = []
mphf = list_h_pos
'''col_h = []
col_kmer = []
for k in kmer:
h = abs(hash(k))
ok = 0
for e in range(len(list_h_pos)):
if list_h_pos[e][0] == h:
ok +=1
if ok ==0:
col_h.append(h) #si besoin d'une liste de h qui sont pas dans tableau et qu'il faut rajouter apres
col_kmer.append(k) #pareil mais avec les kmer, jsp ce qu'on aura besoin ensuite
ok += 1
if ok == 0:
col_h.append(h) # si besoin d'une liste de h qui sont pas dans tableau et qu'il faut rajouter apres
col_kmer.append(k) # pareil mais avec les kmer, jsp ce qu'on aura besoin ensuite
# compléter
# hacher le kmer
# si le hash est dans le grand_tableau
......@@ -94,35 +89,42 @@ def construction_mphf(set_kmer, n, gamma=2, nb_niveaux=3):
# ajouter à la mphf [h, rang]
# mettre à jour max_rang
for kmer in set_kmer_courant: # gestion des collisions: expliquer les 3 lignes du dessous
for kmer in set_kmer_courant: # permet de récupérer la dernière collision si elle existe
max_rang += 1
h = abs(hash(kmer))
mphf.append([h, max_rang])
'''
return mphf
def get_hash_mphf(mphf, kmer):
"""
Calcule le hash d'un k-mer à l'aide d'une fonction de hachage minimale parfaite (MPHF).
Parameters:
mphf (list): Table de hachage minimale parfaite.
kmer (str): K-mer à hasher.
Returns:
int: Hash du k-mer.
Examples:
>>> set_kmer = {str(i) for i in range(10)}
>>> n = 10
>>> mphf = construction_mphf(set_kmer, n)
>>> kmer = "5"
>>> hash_mphf = get_hash_mphf(mphf, kmer)
>>> 0 <= hash_mphf < n
True
"""
pass # TODO modifier
"""
Calcule le hash d'un k-mer à l'aide d'une fonction de hachage minimale parfaite (MPHF).
Parameters:
mphf (list): Table de hachage minimale parfaite.
kmer (str): K-mer à hasher.
Returns:
int: Hash du k-mer.
Examples:
>>> set_kmer = {str(i) for i in range(10)}
>>> n = 10
>>> mphf = construction_mphf(set_kmer, n)
>>> kmer = "5"
>>> hash_mphf = get_hash_mphf(mphf, kmer)
>>> 0 <= hash_mphf < n
True
"""
hashkmer = abs(hash(kmer))
for hach in mphf:
if hach[0] == hashkmer:
return hach[0]
else:
return "ça existe pô"
def create_hash_table(set_kmer, n):
"""
......@@ -145,49 +147,57 @@ def create_hash_table(set_kmer, n):
>>> all(kmer in tableau for kmer in set_kmer)
True
"""
pass # TODO modifier
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
def generer_kmers(n, k):
'''
genere un set de n k-mers
'''
kmers = set()
while len(kmers) < n:
kmer = ''.join(random.choice('ATCG') for _ in range(k))
kmers.add(kmer)
return kmers
'''
genere un set de n k-mers
'''
kmers = set()
while len(kmers) < n:
kmer = ''.join(random.choice('ATCG') for _ in range(k))
kmers.add(kmer)
return kmers
def compare_taille(n_max, fichier_sortie):
n_values = []
table_size = []
dict_size = []
k = 21
for n in range(100, n_max, 1000):
set_kmer = generer_kmers(n, k)
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 ?
dict_size.append(sys.getsizeof(set_kmer))
plt.plot(n_values, table_size, label='Table avec MPHF')
plt.plot(n_values, dict_size, label='Dict')
plt.xlabel('n')
plt.xticks(n_values, [str(x) for x in n_values], rotation=45)
plt.ylabel('Taille (octets)')
plt.title('Évolution de la taille de la table de hachage avec MPHF et du dict')
plt.legend()
plt.savefig(fichier_sortie)
plt.close()
# dé-commenter quand vous êtes prêts, expliquer les résultats
#compare_taille(10000,"mphf.png")
n_values = []
table_size = []
dict_size = []
k = 21
for n in range(100, n_max, 1000):
set_kmer = generer_kmers(n, k)
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 ?
dict_size.append(sys.getsizeof(set_kmer))
plt.plot(n_values, table_size, label='Table avec MPHF')
plt.plot(n_values, dict_size, label='Dict')
plt.xlabel('n')
plt.xticks(n_values, [str(x) for x in n_values], rotation=45)
plt.ylabel('Taille (octets)')
plt.title('Évolution de la taille de la table de hachage avec MPHF et du dict')
plt.legend()
plt.savefig(fichier_sortie)
plt.close()
if __name__ == "__main__":
import doctest
doctest.testmod()
kmers = generer_kmers(10, 10)
set_kmer = set(kmers)
n = 10
mphf = construction_mphf(set_kmer, n)
print('mpfh')
print(mphf)
print('get')
print(get_hash_mphf(mphf, "prout"))
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment