Skip to content

Commit ca19b86

Browse files
Skip first l-1 kmer-ambiguity iterations
1 parent 17a2f3d commit ca19b86

File tree

2 files changed

+10
-8
lines changed

2 files changed

+10
-8
lines changed

src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ impl<'s, 'o, const CANONICAL: bool, SEQ: Seq<'s>> Output<'o, CANONICAL, SEQ> {
426426
/// Iterator over positions and (canonical) u64 kmer-values associated with all minimizer positions.
427427
#[must_use]
428428
pub fn pos_and_values_u64(&self) -> impl ExactSizeIterator<Item = (u32, u64)> {
429-
self.min_pos.iter().map(move |&pos| {
429+
self.min_pos.iter().map(#[inline(always)] move |&pos| {
430430
let val = if CANONICAL {
431431
let a = self.seq.read_kmer(self.k, pos as usize);
432432
let b = self.seq.read_revcomp_kmer(self.k, pos as usize);
@@ -440,7 +440,7 @@ impl<'s, 'o, const CANONICAL: bool, SEQ: Seq<'s>> Output<'o, CANONICAL, SEQ> {
440440
/// Iterator over positions and (canonical) u128 kmer-values associated with all minimizer positions.
441441
#[must_use]
442442
pub fn pos_and_values_u128(&self) -> impl ExactSizeIterator<Item = (u32, u128)> {
443-
self.min_pos.iter().map(move |&pos| {
443+
self.min_pos.iter().map(#[inline(always)] move |&pos| {
444444
let val = if CANONICAL {
445445
let a = self.seq.read_kmer_u128(self.k, pos as usize);
446446
let b = self.seq.read_revcomp_kmer_u128(self.k, pos as usize);

src/minimizers.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -183,25 +183,27 @@ pub fn canonical_minimizers_skip_ambiguous_windows<'s>(
183183
let (c_delay, mut canonical_mapper) = canonical_mapper_simd(l);
184184

185185
let mut padded_it = seq
186-
.par_iter_bp_delayed_2_with_factor(l, hasher.delay(), c_delay, 2)
187-
.zip(bitseq.par_iter_kmer_ambiguity(l, l));
186+
.par_iter_bp_delayed_2_with_factor(l, hasher.delay(), c_delay, 2);
188187

189188
// Process first k-1 characters separately, to initialize hash values.
190-
padded_it.advance_with(k - 1, |((a, rh, rc), _ambi)| {
189+
padded_it.advance_with(k - 1, |(a, rh, rc)| {
191190
hash_mapper((a, rh));
192191
canonical_mapper((a, rc));
193192
});
194193
let mut sliding_min_mapper = sliding_lr_min_mapper_simd(w, padded_it.it.len(), cache);
195-
padded_it.advance_with(w - 1, |((a, rh, rc), _ambi)| {
194+
padded_it.advance_with(w - 1, |(a, rh, rc)| {
196195
let hash = hash_mapper((a, rh));
197196
canonical_mapper((a, rc));
198197
sliding_min_mapper(hash);
199198
});
200199

201-
padded_it.map(move |((a, rh, rc), ambi)| {
200+
// jump over the l-1 first ambiguity results
201+
padded_it
202+
.zip(bitseq.par_iter_kmer_ambiguity(l, l, l-1))
203+
.map(move |((a, rh, rc), ambi)| {
202204
let hash = hash_mapper((a, rh));
203205
let canonical = canonical_mapper((a, rc));
204206
let (lmin, rmin) = sliding_min_mapper(hash);
205-
ambi.blend(u32x8::splat(u32::MAX - 1), canonical.blend(lmin, rmin))
207+
ambi.blend(u32x8::splat(SKIPPED), canonical.blend(lmin, rmin))
206208
})
207209
}

0 commit comments

Comments
 (0)