Add k-mer encoding and decoding functions with normalized k-mer support

This commit introduces new functions for encoding and decoding k-mers, including support for normalized k-mers. It also updates the frequency filter and k-mer set implementations to use the new encoding functions, providing zero-allocation encoding for better performance. The commit hash has been updated to reflect the latest changes.
This commit is contained in:
Eric Coissac
2026-02-05 15:51:44 +01:00
parent c5dd477675
commit 6c6c369ee2
4 changed files with 161 additions and 7 deletions

View File

@@ -39,11 +39,33 @@ func (ks *KmerSet) K() int {
return ks.k
}
// Add ajoute un k-mer à l'ensemble
func (ks *KmerSet) Add(kmer uint64) {
// AddKmerCode ajoute un k-mer encodé à l'ensemble
func (ks *KmerSet) AddKmerCode(kmer uint64) {
ks.bitmap.Add(kmer)
}
// AddNormalizedKmerCode ajoute un k-mer encodé normalisé à l'ensemble
func (ks *KmerSet) AddNormalizedKmerCode(kmer uint64) {
canonical := NormalizeKmer(kmer, ks.k)
ks.bitmap.Add(canonical)
}
// AddKmer ajoute un k-mer à l'ensemble en encodant la séquence
// La séquence doit avoir exactement k nucléotides
// Zero-allocation: encode directement sans créer de slice intermédiaire
func (ks *KmerSet) AddKmer(seq []byte) {
kmer := EncodeKmer(seq, ks.k)
ks.bitmap.Add(kmer)
}
// AddNormalizedKmer ajoute un k-mer normalisé à l'ensemble en encodant la séquence
// La séquence doit avoir exactement k nucléotides
// Zero-allocation: encode directement en forme canonique sans créer de slice intermédiaire
func (ks *KmerSet) AddNormalizedKmer(seq []byte) {
canonical := EncodeNormalizedKmer(seq, ks.k)
ks.bitmap.Add(canonical)
}
// AddSequence ajoute tous les k-mers d'une séquence à l'ensemble
// Utilise un itérateur pour éviter l'allocation d'un vecteur intermédiaire
func (ks *KmerSet) AddSequence(seq *obiseq.BioSequence) {