Test de candidature pour un stage à l'Institut Pasteur. Implémentation d'un filtre de Bloom.
Cette implémentation crée un filtre de Bloom à partir d'un fichier de format FASTA qui ne contient qu'un seul identifiant, et exécute ensuite un nombre donné de requêtes, chacune vérifiant si un kmer aléatoire est présent dans le filtre de Bloom.
Le logiciel peut prendre deux ensembles d'arguments, vérifier Exécution pour plus d'informations.
Vous pouvez compiler à l'aide de g++ en tapant make. D'autres options sont disponibles:
make clang: Mêmes options queg++, mais pourclang++.
make lto_off: Désactive la "Link Time Optimization" deg++. Petit impact négatif sur la performance, exécutable légèrement plus petit.
make unoptimized: Désactive les "options d'optimisation" deg++,LTOinclus. Grand impact sur la performance, exécutable le plus grand.
make clang_lto_off: Même comportement pourclangImpact sur la performance négligeable, exécutable légèrement plus petit.
make clang_unoptimized: Même comportement pourclangGrand impact sur la performance, exécutable le plus grand.
Le programme prendra toujours en argument un fichier, un k, et un nombre de requêtes (r).
Par défaut, vous devez spécifier:
- La Taille du vecteur de bits en bits (max 2^34) (
size). - Un nombre de fonctions de hachage (max 64) (
nh).
Tels que:
# file k size nh r
./bloomfilter data/ecoli.fasta 31 456637 3 1000000L'option -p* prend:
- La probabilité voulue de faux-positifs en float (
fp). - Une estimation du nombre d'items à stocker dans le filtre de Bloom (
n).
# file k fp n r
./bloomfilter -p data/ecoli.fasta 31 0.0001 4967535 1000000Notes:
- Cette option ne respecte pas ce README!,
Spécifiquement la taille de ce filtre de Bloom peut être au-dessus de 2^34 et il peut y avoir plus de 64 fonctions de hachage pour respecter le taux de faux positifs.
- Comportement non-défini pour une taille de filtre supérieure à 2^63 - 1.
C'est la taille maximum d'un vecteur en C++ et aussi d'un uint64_t.
J'ai estimé que 10^13 éléments seraient necéssaires avec un taux de faux-positifs de 10^-17, pour dépasser cette limite. Pour cette raison je ne l'ai pas pris en compte.
* Le parsing des arguments n'est pas très robuste, n'importe quelle autre option aura le même comportement.
Vous pouvez générer la documentation avec doxygen, pour le faire, installez doxygen et tapez:
doxygen DoxyfileDes dossiers html et latex seront créés.
Ouvrez html/index.html sur votre navigateur. sur GNOME:
xdg-open html/index.htmlmake clean supprimera les deux dossiers.
Le README spécifiait que le xorshift hachera toujours 0 à 0.
Pour tout autre chiffe, il ne retourne pas 0.
Comme chaque uint64_t kmer est unique, changer sa valeur créerait une collision involontaire.
Dans cette implémentation, tout k-mer ne contenant que le nucléotide 'A' hachera toujours à zéro,
En effet dans le filtre de Bloom, le seul bit répresentant la présence de ce kmer sera le premier.
Je n'ai pas trouvé d'astuce pour l'éviter. Néanmoins, il n'y a pas de possibilité de collision.
- Une CLI plus robuste (le parsing n'existe presque pas).
- Parser un fichier FASTA avec plusieurs identifications, des options pour parser des identifications spécifiques avec leurs filtres de Bloom respectifs.
- Une façon de stocker des kmers avec un k > 31 avec le même code Huffman.
C'était plutôt amusant.