Skip to content
Snippets Groups Projects
Commit 77d319bf authored by Antaaa28's avatar Antaaa28
Browse files

5 ; 6 ; 7

parent 4893cfdc
No related branches found
No related tags found
No related merge requests found
...@@ -20,26 +20,46 @@ Vous allez améliorer la situation pour que l'équipe puisse se servir du code d ...@@ -20,26 +20,46 @@ Vous allez améliorer la situation pour que l'équipe puisse se servir du code d
__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. __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. 3. Décrivez à quoi sert `class Structure`. Ecrivez les doctests pour cette classe.
Cette classe construit un arbre binaire dont chaque feuille correspond à un jeu de données.
Chaque feuille contient un filtre de Bloom créé à partir des k-mers propres à ce jeu de données.
Les nœuds internes fusionnent les filtres de Bloom de leurs enfants (par opération OU bit à bit)
et regroupent l'ensemble des noms des jeux de données correspondant.
La méthode 'query' permet de rechercher un k-mer dans l'arbre et retourne la liste des jeux de données
susceptibles de le contenir.
4. Cette structure mélange donc deux structures de données que nous avons vues. Quelles sont elles ? 4. Cette structure mélange donc deux structures de données que nous avons vues. Quelles sont elles ?
La structure combine essentiellement :
----- 1-Les Tables de hachage via le filtre de bloom
### La stucture Structure mélange deux structures de données principales:
*** 1-Filtre de Bloom:
Utilisé pour représenter les k-mers de chaque jeu de données. Le filtre de Bloom permet de tester Utilisé pour représenter les k-mers de chaque jeu de données. Le filtre de Bloom permet de tester
rapidement si un k-mer est potentiellement présent dans un jeu de donnnées, avec un certain taux de rapidement si un k-mer est potentiellement présent dans un jeu de donnnées, avec un certain taux de
faux positifs. faux positifs.
2- Les arbre :
*** 2-Arbre binaire:
La structure est organisée sous forme d'arbre binaire, où chaque noeud interne présente l'union La structure est organisée sous forme d'arbre binaire, où chaque noeud interne présente l'union
des filtres de Bloom de ses enfants. Les feuilles de l'arbre correspondent aux jeux de données des filtres de Bloom de ses enfants. Les feuilles de l'arbre correspondent aux jeux de données
individuels. individuels.
-----
5.D'après vous, que peut-on dire sur la complexité de la requête de cette structure ? 5.D'après vous, que peut-on dire sur la complexité de la requête de cette structure ?
La complexité de la requête dépend de l'efficacité du filtre de Bloom. Si le filtre ne produit pas de faux positifs,
la recherche suit un chemin unique dans un arbre équilibré, soit O(log N).
En cas de faux positifs, plusieurs branches inutiles peuvent être explorées, ce qui peut dégrader la complexité jusqu'à O(N).
6.Quelles sont les différences avec la table basée sur une MPHF que nous avons vu ? 6.Quelles sont les différences avec la table basée sur une MPHF que nous avons vu ?
La principale différence réside dans la nature des structures :
En terme d'exactitude :
La table basée sur une MPHF fournit un accès exact aux k-mers sans faux positifs,
tandis que la structure avec filtres de Bloom et arbre est probabiliste et peut donner des faux positifs.
Complexité de la requête :
La MPHF permet un accès en temps constant (O(1)) une fois la table construite,
alors que la recherche dans la structure hybride est, dans le meilleur des cas, logarithmique (O(log N)) et peut se dégrader en linéaire (O(N)) en cas de nombreux faux positifs.
Mémoire et construction :
La MPHF est adaptée à des ensembles statiques et optimise l'espace en évitant les collisions par construction itérative.
La structure Bloom/arbre, quant à elle, offre une organisation hiérarchique facilitant la fusion d'indices
mais au prix d'une imprécision probabiliste et d'une complexité potentiellement plus élevée en cas d'erreurs.
7.Bonus : Pouvez-vous retracer de quel papier de bioinformatique vient cette idée ? 7.Bonus : Pouvez-vous retracer de quel papier de bioinformatique vient cette idée ?
Cette approche – combiner des filtres de Bloom avec une structure arborescente pour indexer des k-mers – a été popularisée par les travaux sur les Sequence Bloom Trees (SBT).
Dans ce papier, Solomon et Kingsford ont proposé d’organiser des Bloom filters dans un arbre afin de faciliter la recherche rapide dans de vastes bases de données de séquençage.
\ No newline at end of file
...@@ -104,7 +104,7 @@ class Structure: ...@@ -104,7 +104,7 @@ class Structure:
def _build_tree(self, datasets, kmers_dict, bloom_size, num_hashes): def _build_tree(self, datasets, kmers_dict, bloom_size, num_hashes):
nodes = [] nodes = []
# Step 1 # Step 1 : # Création des feuilles pour chaque jeu de données
for dataset in datasets: for dataset in datasets:
bf = SimpleBloomFilter(bloom_size, num_hashes) bf = SimpleBloomFilter(bloom_size, num_hashes)
for kmer in kmers_dict[dataset]: for kmer in kmers_dict[dataset]:
...@@ -114,7 +114,7 @@ class Structure: ...@@ -114,7 +114,7 @@ class Structure:
self.leaves[dataset] = node self.leaves[dataset] = node
nodes.append(node) nodes.append(node)
# Step 2 # Step 2 : Fusion itérative des nœuds pour construire l'arbre
while len(nodes) > 1: while len(nodes) > 1:
new_nodes = [] new_nodes = []
for i in range(0, len(nodes), 2): for i in range(0, len(nodes), 2):
...@@ -132,6 +132,30 @@ class Structure: ...@@ -132,6 +132,30 @@ class Structure:
return nodes[0] if nodes else None return nodes[0] if nodes else None
def query(self, kmer): def query(self, kmer):
"""
Recherche un k-mer dans l'arbre et retourne la liste des jeux de données
susceptibles de le contenir.
Exemple d'utilisation:
>>> datasets = ["DS1", "DS2", "DS3"]
>>> kmers_dict = {
... "DS1": ["AAA", "CCC"],
... "DS2": ["GGG", "TTT"],
... "DS3": ["CCC", "GGG"]
... }
>>> s = Structure(datasets, kmers_dict, bloom_size=10, num_hashes=1)
>>> sorted(s.query("CCC"))
['DS1', 'DS3']
>>> sorted(s.query("GGG"))
['DS2', 'DS3']
>>> s.query("AAA")
['DS1']
>>> s.query("TTT")
['DS2']
>>> s.query("XYZ")
[]
"""
results = [] results = []
self._query_recursive(self.root, kmer, results) self._query_recursive(self.root, kmer, results)
return results return results
...@@ -139,7 +163,7 @@ class Structure: ...@@ -139,7 +163,7 @@ class Structure:
def _query_recursive(self, node, kmer, results): def _query_recursive(self, node, kmer, results):
if node is None: if node is None:
return return
if node.bloom.contains(kmer): if node.bloom.contains(kmer): # Si le nœud est une feuille, ajouter directement les jeux de données
if node.left is None and node.right is None: if node.left is None and node.right is None:
results.extend(node.datasets) results.extend(node.datasets)
else: else:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment