feat: add kmer filtering and refactor layer iteration

Introduce a `passes_all` utility to validate kmer rows against multiple filters using short-circuit logic. Integrate a `filters` parameter into the iteration functions to conditionally emit kmers based on filter results. Extract repetitive layer traversal and filtering into an `iter_src_layers` helper, refactoring Pass 1 and Pass 2 to eliminate duplication. Additionally, add a debug conditional to the dump output to include partition and layer metadata alongside kmer sequences.
This commit is contained in:
Eric Coissac
2026-06-04 20:43:22 +02:00
parent 476c7a6394
commit a1499e6153
5 changed files with 86 additions and 57 deletions
+2 -2
View File
@@ -36,7 +36,7 @@ impl KmerIndex {
for i in 0..n {
if debug {
self.partition
.iter_partition_kmers_located(i, use_counts, n_genomes, |part, layer, kmer, row| {
.iter_partition_kmers_located(i, use_counts, n_genomes, &[], |part, layer, kmer, row| {
let seq = String::from_utf8(kmer.to_ascii())
.unwrap_or_else(|_| "?".repeat(kmer_size));
let _ = write!(out, "{part},{layer},{seq}");
@@ -48,7 +48,7 @@ impl KmerIndex {
.map_err(OKIError::Partition)?;
} else {
self.partition
.iter_partition_kmers(i, use_counts, n_genomes, |kmer, row| {
.iter_partition_kmers(i, use_counts, n_genomes, &[], |kmer, row| {
let seq = String::from_utf8(kmer.to_ascii())
.unwrap_or_else(|_| "?".repeat(kmer_size));
let _ = write!(out, "{seq}");