@@ -3,14 +3,36 @@ Vous allez améliorer la situation pour que l'équipe puisse se servir du code d
...
@@ -3,14 +3,36 @@ Vous allez améliorer la situation pour que l'équipe puisse se servir du code d
1. Décrivez à quoi sert `class SimpleBloomFilter`. Ecrivez les doctests pour cette classe.
1. Décrivez à quoi sert `class SimpleBloomFilter`. Ecrivez les doctests pour cette classe.
La classe `SimpleBloomFilter` modélise un filtre de Bloom de taille `size` (par défaut 100) initialement vide.
La méthode `add` permet d'ajouter un objet au filtre de Bloom, en attribuant `1` à chaque position du filtre obtenue en hachant l'objet grâce à `_hashes`, chaque objet étant haché `nb_hashes` fois (par défaut 1).
La méthode `contains` permet de vérifier la présence d'un objet dans le filtre de Bloom, en le hachant `nb_hashes` fois grâce à `_hashes` puis en vérifiant que toutes les positions correspondantes ont la valeur `1`.
Enfin, la méthode `merge` permet de fusionner deux filtres de Bloom de taille identique, en attribuant `1` à chaque position où au moins l'un des deux filtre a la valeur `1`.
2. Décrivez à quoi sert `class StructureNode`.
2. Décrivez à quoi sert `class StructureNode`.
La classe `StructureNode` modélise un nœud d'arbre binaire.
L'attribut `bloom` contient un filtre de Bloom modélisé par `SimpleBloomFilter` vide par défaut.
Les attributs `left` et `right`, initialement vides, sont utilisés pour contenir les nœuds racines des deux sous-arbres gauche et droit.
L'attribut `dataset` contient la liste des noms de jeux de données correspondants aux feuilles de l'arbre.
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.
La classe `Structure` modélise un arbre binaire de recherche à partir d'une liste de jeux de données renseignés dans les paramètres `datasets` et `kmers_dict`, chaque nœud étant paramétré par un objet `StructureNode` contenant un filtre de Bloom de paramètres `bloom_size` et `num_hashes`.
L'arbre est construit par la fonction `_build_tree`, chaque feuille représentant un jeu de données et contenant les informations dudit jeu de données dans un filtre de Bloom correspondant aux kmers du jeu de données. Chaque nœud parent contient une fusion des filtres de Bloom de ses enfants, ainsi que la liste des noms de jeux de données correspondants à ses feuilles.
La recherche d'un kmer dans cet arbre (méthode `query`) se fait en profondeur, en appliquant à chaque nœud la méthode `contains` du filtre de Bloom associé, ce qui permet de ne pas avoir besoin de descendre jusqu'aux feuilles si `contains` renvoie `False` avant de les avoir atteintes. Cette méthode renvoie une liste des noms de jeux de données où le kmer a été trouvé.
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 ?
Cette structure est un mélange de filtres de Bloom et d'arbre binaire de recherche.
4. D'après vous, que peut-on dire sur la complexité de la requête de cette structure ?
4. D'après vous, que peut-on dire sur la complexité de la requête de cette structure ?
Dans le cas où un kmer n'est présent dans aucun jeu de données, la complexité de la requête est constante.
Dans le cas où un kmer est présent dans un seul jeu de données, la complexité est logarithmique.
Cependant, dans le cas étrange où un kmer est présent dans tous les jeux de données, la complexité est linéaire.
5. Quelles sont les différences avec la table basée sur une MPHF que nous avons vu ?
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 ?
6. Bonus : Pouvez-vous retracer de quel papier de bioinformatique vient cette idée ?