diff --git a/Readme.md b/Readme.md index c75d3f207101a1fd72703812a9f4fd2260ea46c8..b867f70188301ecb5b285e07e4a6e698edf1bdac 100644 --- a/Readme.md +++ b/Readme.md @@ -1,16 +1,31 @@ -Vous commencez votre premier job de bioinformaticien.ne. La personne précédente vous a laissé un code quasi sans commentaire et sans test, et votre chef est biologiste et n'y comprend rien. Il sait seulement que ce code était très pratique pour rechercher des k-mer dans des jeux de données. -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. - -2. Décrivez à quoi sert `class StructureNode`. - -3. Décrivez à quoi sert `class Structure`. Ecrivez les doctests pour cette classe. - -4. Cette structure mélange donc deux structures de données que nous avons vues. Quelles sont elles ? - -4. D'après vous, que peut-on dire sur la complexité de la requête de cette structure ? - -5. Quelles sont les différences avec la table basée sur une MPHF que nous avons vu ? - -6. Bonus : Pouvez-vous retracer de quel papier de bioinformatique vient cette idée ? +Vous commencez votre premier job de bioinformaticien.ne. La personne précédente vous a laissé un code quasi sans commentaire et sans test, et votre chef est biologiste et n'y comprend rien. Il sait seulement que ce code était très pratique pour rechercher des k-mer dans des jeux de données. +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. + +2. Décrivez à quoi sert `class StructureNode`. + +3. Décrivez à quoi sert `class Structure`. Ecrivez les doctests pour cette classe. + +4. Cette structure mélange donc deux structures de données que nous avons vues. Quelles sont elles ? + +----- +### 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 +rapidement si un k-mer est potentiellement présent dans un jeu de donnnées, avec un certain taux de +faux positifs. + + +*** 2-Arbre binaire: +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 +individuels. +----- + +5.D'après vous, que peut-on dire sur la complexité de la requête de cette structure ? + +6.Quelles sont les différences avec la table basée sur une MPHF que nous avons vu ? + +7.Bonus : Pouvez-vous retracer de quel papier de bioinformatique vient cette idée ? diff --git a/querykmers_tpmiso.py b/querykmers_tpmiso.py index c989f6c1857cc8400fd16f44c534f99dbe67208e..ddd066aefc7ab2a43076cee2601864682c7579a5 100644 --- a/querykmers_tpmiso.py +++ b/querykmers_tpmiso.py @@ -35,6 +35,38 @@ class StructureNode: self.datasets = [] # list of dataset names at leaf nodes class Structure: + """ + Une structure arborescente qui organise des jeux de données (datasets) en + utilisant des filtres de Bloom pour permettre des requetes efficaces de k-mers. + + Exemples d'utilisation: + >>> datasets = ["Dataset1", "Dataset2", "Dataset3", "Dataset4"] + >>> kmers_dict = { + ... "Dataset1": ["ACGT", "TGCA", "GCTA"], # k-mers du Dataset1 + ... "Dataset2": ["CGTA", "GCTA", "TACC"], # k-mers du Dataset2 + ... "Dataset3": ["AAGT", "TCCA", "CGGT"], # k-mers du Dataset3 + ... "Dataset4": ["TGGC", "GGCA", "CCAA"] # k-mers du Dataset4 + ... } + >>> structure= Structure(datasets, kmers_dict, bloom_size=100, num_hashes=1) + + >>> structure.query("TCCA") #Recherche du k-mer "GCTA" + ['Dataset1', 'Dataset2'] #"GCTA" est présent dans Dataset1 et Dataset2 + + >>> structure.query("TCCA") # Recherche du k-mer "TCCA" + ['Dataset3'] # "TCCA" est présent dans Dataset3 + + >>> structure.query("ACGT") # Recherche du k-mer "ACGT" + ['Dataset1'] # "ACGT" est présent dans Dataset1 + + >>> structure.query("GGGG") # Recherche du k-mer "GGGG" + [] # "GGGG" n'est présent dans aucun dataset + + >>> structure.query("TGGC") # Recherche du k-mer "TGGC" + ['Dataset4'] # "TGGC" est présent dans Dataset4 + + >>> structure.query("CGGT") # Recherche du k-mer "CGGT" + ['Dataset3'] # "CGGT" est présent dans Dataset3 + """ def __init__(self, datasets, kmers_dict, bloom_size=10000, num_hashes=3): self.leaves = {} # maps dataset names to their Bloom filter nodes self.root = self._build_tree(datasets, kmers_dict, bloom_size, num_hashes)