Skip to content
Snippets Groups Projects
Commit 848ffc1b authored by Tristan TOLENTINO's avatar Tristan TOLENTINO
Browse files

Question 1 et 2 + ajout doctest

parent 4fbb2359
No related branches found
No related tags found
No related merge requests found
......@@ -2,8 +2,21 @@ Vous commencez votre premier job de bioinformaticien.ne. La personne précédent
Vous allez améliorer la situation pour que l'équipe puisse se servir du code de manière pérenne.
1. Décrivez à quoi sert `class SimpleBloomFilter`. Ecrivez les doctests pour cette classe.
La classe SimpleBloomFilter implémente un filtre de Bloom est une structure de données utilisée pour tester si un élément appartient à un ensemble. Il peut donner un faux positif (dire qu'un élément est dans l'ensemble alors qu'il ne l'est pas), mais il ne donne jamais de faux négatif (si le filtre dit qu'un élément n'est pas dans l'ensemble, c'est sûr qu'il ne l'est pas).
- __init__(self, size=100, num_hashes=1) : Initialise le filtre de Bloom avec une taille de tableau de bits donnée (size) et un nombre de fonctions de hachage (num_hashes).
- _hashes(self, item) : Génère plusieurs valeurs de hachage pour un élément donné
- add(self, item) : Ajoute un élément au filtre de Bloom en mettant à jour les positions correspondantes dans le tableau de bits.
- contains(self, item) : Vérifie si un élément est dans le filtre de Bloom en vérifiant les positions correspondantes dans le tableau de bits.
- merge(self, other) : Fusionne deux filtres de Bloom de même taille en combinant leurs tableaux de bits via une opération OU.
2. Décrivez à quoi sert `class StructureNode`.
La classe StructureNode est une structure arborescente qui organise des jeux de données (datasets) en utilisant des filtres de Bloom pour permettre des requêtes efficaces de k-mers.
Chaque nœud de l'arbre contient :
- Un filtre de Bloom (bloom) qui stocke les k-mers présents dans les jeux de données associés.
- Deux noeuds enfants (left et right) pour les noeuds internes représentant les sous-ensembles de données à gauche et à droite.
- Une liste datasets qui contient les noms des jeux de données utilisée uniquement pour les feuilles
Donc chaque nœud représente un jeu de données unique avec son propre filtre de Bloom et aux niveaux supérieurs, chaque nœud fusionne les filtres de Bloom de ses enfants, permettant une recherche et d'organiser efficacement les recherches de k-mers dans les jeux de données.
__init__(self, bloom_filter=None): Si un bloom_filter est passé en argument lors de l'initialisation, il est utilisé. Sinon un nouveau filtre de Bloom est créé puis continue avec l'initialisation à None des enfants gauche et droite de l'arbre jusqu'à ce qu'ils soient définis. De plus, il y aura une liste vide datasets qui stockera les noms des jeux de données associé à ce noeud.
3. Décrivez à quoi sert `class Structure`. Ecrivez les doctests pour cette classe.
......
import hashlib
class SimpleBloomFilter:
def __init__(self, size=100, num_hashes=1):
self.size = size
self.num_hashes = num_hashes
self.bit_array = [0] * size
def _hashes(self, item):
hash_values = []
for i in range(self.num_hashes):
hash_func = hashlib.sha256((str(i) + item).encode()).hexdigest()
hash_values.append(int(hash_func, 16) % self.size)
return hash_values
def add(self, item):
for pos in self._hashes(item):
self.bit_array[pos] = 1
def contains(self, item):
return all(self.bit_array[pos] for pos in self._hashes(item))
def merge(self, other):
assert self.size == other.size, "Bloom filters must be of the same size!"
merged_filter = SimpleBloomFilter(self.size, self.num_hashes)
merged_filter.bit_array = [a | b for a, b in zip(self.bit_array, other.bit_array)]
return merged_filter
"""
Un filtre de Bloom simple étant une structure de donnée permettant de tester si un élément appartient à un ensemble.
Exemples :
>>> bf = SimpleBloomFilter(size=100, num_hashes=1) # Création d'un filtre de Bloom
>>> bf.add("ATCG") # Ajout d'un élément
>>> bf._hashes("ATCG") # Affiche les indices générés pour "ATCG"
[16]
>>> len(bf._hashes("ATCG")) == 1 # Vérifie qu'il y a 1 indice, comme spécifié par num_hashes
True
>>> bf.contains("ATCG") # Vérification d'un élément existant
True
>>> bf.contains("ACTG") # Vérification d'un élément non ajouté, le teste retournera généralement False mais un faux positif est possible
False
>>> bf2 = SimpleBloomFilter(size=100, num_hashes=1) # Création d'un deuxième filtre de Bloom
>>> bf2.add("GCAT") # Ajout d'un autre élément
>>> bf2._hashes("GCAT") # Affiche les indices générés pour "GCAT"
[89]
>>> len(bf._hashes("GCAT")) == 1 # Vérifie qu'il y a 1 indice, comme spécifié par num_hashes
True
>>> fusion_bf = bf.merge(bf2) # Fusion des deux filtres
>>> fusion_bf.contains("ATCG") # Vérification des éléments après fusion
True
>>> fusion_bf.contains("GCAT") # Vérification des éléments après fusion
True
>>> fusion_bf.contains("TGAC") # Vérification des éléments après fusion, le test retournera False car "TGAC" est différent de "ATCG" et "GCAT" mais il y a un risque de faux positif
False
"""
def __init__(self, size=100, num_hashes=1):
self.size = size
self.num_hashes = num_hashes
self.bit_array = [0] * size
def _hashes(self, item):
hash_values = []
for i in range(self.num_hashes):
hash_func = hashlib.sha256((str(i) + item).encode()).hexdigest()
hash_values.append(int(hash_func, 16) % self.size)
return hash_values
def add(self, item):
for pos in self._hashes(item):
self.bit_array[pos] = 1
def contains(self, item):
return all(self.bit_array[pos] for pos in self._hashes(item))
def merge(self, other):
assert self.size == other.size, "Bloom filters must be of the same size!"
merged_filter = SimpleBloomFilter(self.size, self.num_hashes)
merged_filter.bit_array = [a | b for a, b in zip(self.bit_array, other.bit_array)]
return merged_filter
class StructureNode:
......@@ -131,3 +161,9 @@ query_kmers = ["GCTA", "TCCA", "ACGT", "GGGG"]
for kmer in query_kmers:
result = structure.query(kmer)
print(f"K-mer '{kmer}' found in datasets: {result}")
if __name__ == "__main__":
import doctest
doctest.testmod()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment