This commit addresses a bug in the super k-mer implementation where the minimizer bijection property was not properly enforced. The fix ensures that: 1. All k-mers within a super k-mer share the same minimizer 2. Identical super k-mer sequences have the same minimizer The changes include: - Fixing the super k-mer iteration logic to properly validate the minimizer bijection property - Adding a comprehensive test suite (TestSuperKmerMinimizerBijection) that validates the intrinsic property of super k-mers - Updating the .gitignore file to properly track relevant files This resolves issues where the same sequence could be associated with different minimizers, violating the super k-mer definition.
2.8 KiB
Définition du super k-mer
Définition
Un super k-mer est une sous-séquence MAXIMALE d'une séquence dans laquelle tous les k-mers consécutifs partagent le même minimiseur.
Termes
- k-mer : sous-séquence de longueur k
- minimiseur : le plus petit m-mer canonique parmi tous les m-mers d'un k-mer
- k-mers consécutifs : k-mers aux positions i et i+1 (chevauchement de k-1 nucléotides)
- MAXIMALE : ne peut être étendue ni à gauche ni à droite
RÈGLES ABSOLUES
RÈGLE 1 : Longueur minimum = k
Un super k-mer contient au minimum k nucléotides.
longueur(super-kmer) >= k
RÈGLE 2 : Chevauchement obligatoire = k-1
Deux super-kmers consécutifs se chevauchent d'EXACTEMENT k-1 nucléotides.
SK1.End - SK2.Start = k - 1
RÈGLE 3 : Bijection séquence ↔ minimiseur
Une séquence de super k-mer a UN et UN SEUL minimiseur.
Même séquence → Même minimiseur (TOUJOURS)
Si vous observez la même séquence avec deux minimiseurs différents, c'est un BUG.
RÈGLE 4 : Tous les k-mers partagent le minimiseur
TOUS les k-mers contenus dans un super k-mer ont le même minimiseur.
∀ k-mer K dans SK : minimiseur(K) = SK.minimizer
RÈGLE 5 : Maximalité
Un super k-mer ne peut pas être étendu.
- Si on ajoute un nucléotide à gauche : le nouveau k-mer a un minimiseur différent
- Si on ajoute un nucléotide à droite : le nouveau k-mer a un minimiseur différent
VIOLATIONS INTERDITES
❌ Super k-mer de longueur < k ❌ Chevauchement ≠ k-1 entre consécutifs ❌ Même séquence avec minimiseurs différents ❌ K-mer dans le super k-mer avec minimiseur différent ❌ Super k-mer extensible (non-maximal)
CONSÉQUENCES PRATIQUES
Pour l'extraction
L'algorithme doit :
- Calculer le minimiseur de chaque k-mer
- Découper quand le minimiseur change
- Assigner au super k-mer le minimiseur commun à tous ses k-mers
- Garantir que chaque super k-mer contient au moins k nucléotides
- Garantir le chevauchement de k-1 entre consécutifs
Pour la validation
Si après déduplication (obiuniq) on observe :
Séquence: ACGT...
Minimiseurs: {M1, M2} // plusieurs minimiseurs
C'est la PREUVE d'un bug : l'algorithme a produit cette séquence avec des minimiseurs différents, ce qui viole la RÈGLE 3.
DIAGNOSTIC DU BUG
Bug observé : Même séquence avec minimiseurs différents après obiuniq
Cause possible : L'algorithme assigne le mauvais minimiseur OU découpe mal les super-kmers
Ce que le bug NE PEUT PAS être :
- Un problème d'obiuniq (révèle le bug, ne le crée pas)
- Un problème de chevauchement légitime (k-1 est correct)
Ce que le bug DOIT être :
- Minimiseur mal calculé ou mal assigné
- Découpage incorrect (mauvais endPos)
- Copie incorrecte des données