Skip to main content

debruijn/
kmer.rs

1// Copyright 2017 10x Genomics
2
3//! Represent kmers with statically know length in compact integer types
4//!
5//! A kmer is a DNA sequence with statically-known length K. The sequence is stored the smallest possible integer type
6//! Efficient methods for reverse complement and shifting new bases into the left or right of a sequence are provided.
7//! Kmers implement `Eq` to test if two kmers represent the same string.
8//! Kmers implement `Ord`, which corresponds to the natural lexicographic ordering.
9//!
10//! ```
11//! use debruijn::*;
12//! use debruijn::kmer::*;
13//!
14//! let k1 = Kmer16::from_ascii(b"ACGTACGTACGTACGT");
15//!
16//! // Reverse complement
17//! let rc_k1 = k1.rc();
18//!
19//! // Double reverse complement
20//! let k1_copy = rc_k1.rc();
21//! assert_eq!(k1, k1_copy);
22//!
23//! // Push one base onto the left
24//! assert_eq!(k1.extend_left(base_to_bits(b'T')), Kmer16::from_ascii(b"TACGTACGTACGTACG"));
25//!
26//! // Generate a set of kmers from a string, then sort
27//! let mut all_kmers = Kmer16::kmers_from_ascii(b"TACGTACGTACGTACGTT");
28//! all_kmers.sort();
29//! assert_eq!(all_kmers,
30//!     vec![
31//!         Kmer16::from_ascii(b"ACGTACGTACGTACGT"),
32//!         Kmer16::from_ascii(b"CGTACGTACGTACGTT"),
33//!         Kmer16::from_ascii(b"TACGTACGTACGTACG")
34//!     ]);
35
36use kmersize_derive::KmerSize;
37use num_traits::FromPrimitive;
38use num_traits::PrimInt;
39use serde::Deserialize;
40use serde::Serialize;
41use serde::de::DeserializeOwned;
42use std;
43use std::fmt;
44use std::fmt::Binary;
45use std::fmt::Debug;
46use std::fmt::Display;
47use std::hash::Hash;
48use std::marker::PhantomData;
49
50use crate::bits_to_base;
51use crate::Kmer;
52use crate::Mer;
53
54use serde_big_array::BigArray;
55
56// Pre-defined kmer types
57
58
59/// 128-base kmer, backed by four u64s
60pub type Kmer128 = VarLenKmer<u64, 4, K128>;
61/// 112-base kmer, backed by seven u32s
62pub type Kmer112 = VarLenKmer<u32, 7, K112>;
63/// 96-base kmer, backed by three u64s
64pub type Kmer96 = VarLenKmer<u64, 3, K96>;
65/// 80-base kmer, backed by five u32s
66pub type Kmer80 = VarLenKmer<u32, 5, K80>;
67/// 64-base kmer, backed by a single u128
68pub type Kmer64 = IntKmer<u128>;
69/// 63-base kmer, backed by a single u128
70pub type Kmer63 = VarIntKmer<u128, K63>;
71/// 62-base kmer, backed by a single u128
72pub type Kmer62 = VarIntKmer<u128, K62>;
73/// 61-base kmer, backed by a single u128
74pub type Kmer61 = VarIntKmer<u128, K61>;
75/// 60-base kmer, backed by a single u128
76pub type Kmer60 = VarIntKmer<u128, K60>;
77/// 59-base kmer, backed by a single u128
78pub type Kmer59 = VarIntKmer<u128, K59>;
79/// 58-base kmer, backed by a single u128
80pub type Kmer58 = VarIntKmer<u128, K58>;
81/// 57-base kmer, backed by a single u128
82pub type Kmer57 = VarIntKmer<u128, K57>;
83/// 56-base kmer, backed by a single u128
84pub type Kmer56 = VarIntKmer<u128, K56>;
85/// 55-base kmer, backed by a single u128
86pub type Kmer55 = VarIntKmer<u128, K55>;
87/// 54-base kmer, backed by a single u128
88pub type Kmer54 = VarIntKmer<u128, K54>;
89/// 53-base kmer, backed by a single u128
90pub type Kmer53 = VarIntKmer<u128, K53>;
91/// 52-base kmer, backed by a single u128
92pub type Kmer52 = VarIntKmer<u128, K52>;
93/// 51-base kmer, backed by a single u128
94pub type Kmer51 = VarIntKmer<u128, K51>;
95/// 50-base kmer, backed by a single u128
96pub type Kmer50 = VarIntKmer<u128, K50>;
97/// 49-base kmer, backed by a single u128
98pub type Kmer49 = VarIntKmer<u128, K49>;
99/// 48-base kmer, backed by a single u128
100pub type Kmer48 = VarIntKmer<u128, K48>;
101/// 47-base kmer, backed by a single u128
102pub type Kmer47 = VarIntKmer<u128, K47>;
103/// 46-base kmer, backed by a single u128
104pub type Kmer46 = VarIntKmer<u128, K46>;
105/// 45-base kmer, backed by a single u128
106pub type Kmer45 = VarIntKmer<u128, K45>;
107/// 44-base kmer, backed by a single u128
108pub type Kmer44 = VarIntKmer<u128, K44>;
109/// 43-base kmer, backed by a single u128
110pub type Kmer43 = VarIntKmer<u128, K43>;
111/// 42-base kmer, backed by a single u128
112pub type Kmer42 = VarIntKmer<u128, K42>;
113/// 41-base kmer, backed by a single u128
114pub type Kmer41 = VarIntKmer<u128, K41>;
115/// 40-base kmer, backed by a single u128
116pub type Kmer40 = VarIntKmer<u128, K40>;
117/// 39-base kmer, backed by a single u128
118pub type Kmer39 = VarIntKmer<u128, K39>;
119/// 38-base kmer, backed by a single u128
120pub type Kmer38 = VarIntKmer<u128, K38>;
121/// 37-base kmer, backed by a single u128
122pub type Kmer37 = VarIntKmer<u128, K37>;
123/// 36-base kmer, backed by a single u128
124pub type Kmer36 = VarIntKmer<u128, K36>;
125/// 35-base kmer, backed by a single u128
126pub type Kmer35 = VarIntKmer<u128, K35>;
127/// 34-base kmer, backed by a single u128
128pub type Kmer34 = VarIntKmer<u128, K34>;
129/// 33-base kmer, backed by a single u128
130pub type Kmer33 = VarIntKmer<u128, K33>;
131/// 32-base kmer, backed by a single u64
132pub type Kmer32 = IntKmer<u64>;
133/// 31-base kmer, backed by a single u64
134pub type Kmer31 = VarIntKmer<u64, K31>;
135/// 30-base kmer, backed by a single u64
136pub type Kmer30 = VarIntKmer<u64, K30>;
137/// 29-base kmer, backed by a single u64
138pub type Kmer29 = VarIntKmer<u64, K29>;
139/// 28-base kmer, backed by a single u64
140pub type Kmer28 = VarIntKmer<u64, K28>;
141/// 27-base kmer, backed by a single u64
142pub type Kmer27 = VarIntKmer<u64, K27>;
143/// 25-base kmer, backed by a single u64
144pub type Kmer26 = VarIntKmer<u64, K26>;
145/// 25-base kmer, backed by a single u64
146pub type Kmer25 = VarIntKmer<u64, K25>;
147/// 24-base kmer, backed by a single u64
148pub type Kmer24 = VarIntKmer<u64, K24>;
149/// 23-base kmer, backed by a single u64
150pub type Kmer23 = VarIntKmer<u64, K23>;
151/// 22-base kmer, backed by a single u64
152pub type Kmer22 = VarIntKmer<u64, K22>;
153/// 21-base kmer, backed by a single u64
154pub type Kmer21 = VarIntKmer<u64, K21>;
155/// 20-base kmer, backed by a single u64
156pub type Kmer20 = VarIntKmer<u64, K20>;
157/// 19-base kmer, backed by a single u64
158pub type Kmer19 = VarIntKmer<u64, K19>;
159/// 18-base kmer, backed by a single u64
160pub type Kmer18 = VarIntKmer<u64, K18>;
161/// 17-base kmer, backed by a single u64
162pub type Kmer17 = VarIntKmer<u64, K17>;
163/// 16-base kmer, backed by a single u32
164pub type Kmer16 = IntKmer<u32>;
165/// 15-base kmer, backed by a single u32
166pub type Kmer15 = VarIntKmer<u32, K15>;
167/// 14-base kmer, backed by a single u32
168pub type Kmer14 = VarIntKmer<u32, K14>;
169/// 13-base kmer, backed by a single u32
170pub type Kmer13 = VarIntKmer<u32, K13>;
171/// 12-base kmer, backed by a single u32
172pub type Kmer12 = VarIntKmer<u32, K12>;
173/// 11-base kmer, backed by a single u32
174pub type Kmer11 = VarIntKmer<u32, K11>;
175/// 10-base kmer, backed by a single u32
176pub type Kmer10 = VarIntKmer<u32, K10>;
177/// 9-base kmer, backed by a single u32
178pub type Kmer9 = VarIntKmer<u32, K9>;
179/// 8-base kmer, backed by a single u16
180pub type Kmer8 = IntKmer<u16>;
181/// 7-base kmer, backed by a single u16
182pub type Kmer7 = VarIntKmer<u16, K7>;
183/// 6-base kmer, backed by a single u16
184pub type Kmer6 = VarIntKmer<u16, K6>;
185/// 5-base kmer, backed by a single u16
186pub type Kmer5 = VarIntKmer<u16, K5>;
187/// 4-base kmer, backed by a single u8
188pub type Kmer4 = IntKmer<u8>;
189/// 3-base kmer, backed by a single u8
190pub type Kmer3 = VarIntKmer<u8, K3>;
191/// 2-base kmer, backed by a single u8
192pub type Kmer2 = VarIntKmer<u8, K2>;
193
194
195
196/// Trait for specialized integer operations used in DeBruijn Graph
197pub trait IntHelp: PrimInt + FromPrimitive + Hash + Serialize + Display + Debug + Binary {
198    /// Reverse the order of 2-bit units of the integer
199    fn reverse_by_twos(&self) -> Self;
200
201    fn lower_of_two() -> Self;
202}
203
204impl IntHelp for u128 {
205    #[inline]
206    fn reverse_by_twos(&self) -> u128 {
207        // swap adjacent pairs
208        let mut r = ((self & 0x33333333333333333333333333333333u128) << 2)
209            | ((self >> 2) & 0x33333333333333333333333333333333u128);
210
211        // swap nibbles
212        r = ((r & 0x0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0Fu128) << 4)
213            | ((r >> 4) & 0x0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0Fu128);
214
215        // swap bytes
216        r = ((r & 0x00FF00FF00FF00FF00FF00FF00FF00FFu128) << 8)
217            | ((r >> 8) & 0x00FF00FF00FF00FF00FF00FF00FF00FFu128);
218
219        // swap 2 bytes
220        r = ((r & 0x0000FFFF0000FFFF0000FFFF0000FFFFu128) << 16)
221            | ((r >> 16) & 0x0000FFFF0000FFFF0000FFFF0000FFFFu128);
222
223        // swap 4 bytes
224        r = ((r & 0x00000000FFFFFFFF00000000FFFFFFFFu128) << 32)
225            | ((r >> 32) & 0x00000000FFFFFFFF00000000FFFFFFFFu128);
226
227        // swap 8 bytes
228        r = ((r & 0x0000000000000000FFFFFFFFFFFFFFFFu128) << 64)
229            | ((r >> 64) & 0x0000000000000000FFFFFFFFFFFFFFFFu128);
230
231        r
232    }
233
234    #[inline]
235    fn lower_of_two() -> u128 {
236        0x55555555555555555555555555555555u128
237    }
238}
239
240impl IntHelp for u64 {
241    #[inline]
242    fn reverse_by_twos(&self) -> u64 {
243        // swap adjacent pairs
244        let mut r = ((self & 0x3333333333333333u64) << 2) | ((self >> 2) & 0x3333333333333333u64);
245
246        // swap nibbles
247        r = ((r & 0x0F0F0F0F0F0F0F0Fu64) << 4) | ((r >> 4) & 0x0F0F0F0F0F0F0F0Fu64);
248
249        // swap bytes
250        r = ((r & 0x00FF00FF00FF00FFu64) << 8) | ((r >> 8) & 0x00FF00FF00FF00FFu64);
251
252        // swap 2 bytes
253        r = ((r & 0x0000FFFF0000FFFFu64) << 16) | ((r >> 16) & 0x0000FFFF0000FFFFu64);
254
255        // swap 4 bytes
256        r = ((r & 0x00000000FFFFFFFFu64) << 32) | ((r >> 32) & 0x00000000FFFFFFFFu64);
257
258        r
259    }
260
261    #[inline]
262    fn lower_of_two() -> u64 {
263        0x5555555555555555u64
264    }
265}
266
267impl IntHelp for u32 {
268    #[inline]
269    fn reverse_by_twos(&self) -> u32 {
270        // swap adjacent pairs
271        let mut r = ((self & 0x33333333u32) << 2) | ((self >> 2) & 0x33333333u32);
272
273        // swap nibbles
274        r = ((r & 0x0F0F0F0Fu32) << 4) | ((r >> 4) & 0x0F0F0F0Fu32);
275
276        // swap bytes
277        r = ((r & 0x00FF00FFu32) << 8) | ((r >> 8) & 0x00FF00FFu32);
278
279        // swap 2 bytes
280        r = ((r & 0x0000FFFFu32) << 16) | ((r >> 16) & 0x0000FFFFu32);
281
282        r
283    }
284
285    #[inline]
286    fn lower_of_two() -> u32 {
287        0x55555555u32
288    }
289}
290
291impl IntHelp for u16 {
292    #[inline]
293    fn reverse_by_twos(&self) -> u16 {
294        // swap adjacent pairs
295        let mut r = ((self & 0x3333u16) << 2) | ((self >> 2) & 0x3333u16);
296
297        // swap nibbles
298        r = ((r & 0x0F0Fu16) << 4) | ((r >> 4) & 0x0F0Fu16);
299
300        // swap bytes
301        r = ((r & 0x00FFu16) << 8) | ((r >> 8) & 0x00FFu16);
302
303        r
304    }
305
306    #[inline]
307    fn lower_of_two() -> u16 {
308        0x5555u16
309    }
310}
311
312impl IntHelp for u8 {
313    #[inline]
314    fn reverse_by_twos(&self) -> u8 {
315        // swap adjacent pairs
316        let mut r = ((self & 0x33u8) << 2) | ((self >> 2) & 0x33u8);
317
318        // swap nibbles
319        r = ((r & 0x0Fu8) << 4) | ((r >> 4) & 0x0Fu8);
320
321        r
322    }
323
324    #[inline]
325    fn lower_of_two() -> u8 {
326        0x55u8
327    }
328}
329
330/// A Kmer sequence with a statically know K. K will fill the underlying integer type.
331#[derive(Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash, Serialize, Deserialize)]
332pub struct IntKmer<T: IntHelp> {
333    pub storage: T,
334}
335
336impl<T: PrimInt + FromPrimitive + Hash + IntHelp + Sized> IntKmer<T> {
337    fn msk() -> T {
338        T::one() << 1 | T::one()
339    }
340
341    #[inline(always)]
342    fn to_byte(v: T) -> u8 {
343        T::to_u8(&v).unwrap()
344    }
345
346    #[inline(always)]
347    fn t_from_byte(v: u8) -> T {
348        T::from_u8(v).unwrap()
349    }
350
351    #[inline(always)]
352    fn t_from_u64(v: u64) -> T {
353        T::from_u64(v).unwrap()
354    }
355
356    #[inline]
357    fn addr(&self, pos: usize) -> usize {
358        let top_base = Self::k() - 1;
359        (top_base - pos) * 2
360    }
361
362    #[inline(always)]
363    fn _k() -> usize {
364        // 4 bases per byte
365        std::mem::size_of::<T>() * 4
366    }
367
368    #[inline(always)]
369    fn _bits() -> usize {
370        std::mem::size_of::<T>() * 8
371    }
372
373    #[inline(always)]
374    pub fn top_mask(n_bases: usize) -> T {
375        if n_bases > 0 {
376            // first pos bases
377            let one = T::one();
378            ((one << (n_bases * 2)) - one) << (Self::_bits() - n_bases * 2)
379        } else {
380            T::zero()
381        }
382    }
383
384    #[inline(always)]
385    pub fn bottom_mask(n_bases: usize) -> T {
386        if n_bases > 0 {
387            // first pos bases
388            let one = T::one();
389            (one << (n_bases * 2)) - one
390        } else {
391            T::zero()
392        }
393    }
394}
395
396impl<T: PrimInt + FromPrimitive + Hash + IntHelp> Mer for IntKmer<T> {
397    #[inline(always)]
398    fn len(&self) -> usize {
399        Self::_k()
400    }
401
402    #[inline(always)]
403    fn is_empty(&self) -> bool {
404        false
405    }
406
407    /// Get the letter at the given position.
408    #[inline(always)]
409    fn get(&self, pos: usize) -> u8 {
410        let bit = self.addr(pos);
411        Self::to_byte(self.storage >> bit & Self::msk())
412    }
413
414    fn set_mut(&mut self, pos: usize, v: u8) {
415        let bit = self.addr(pos);
416        let mask = !(Self::msk() << bit);
417
418        self.storage = (self.storage & mask) | (Self::t_from_byte(v) << bit);
419    }
420
421    /// Set a slice of bases in the kmer, using the packed representation in value.
422    /// Sets n_bases, starting at pos. Bases must always be packed into the upper-most
423    /// bits of the value.
424    #[inline(always)]
425    fn set_slice_mut(&mut self, pos: usize, n_bases: usize, value: u64) {
426        debug_assert!(pos + n_bases <= Self::k());
427
428        let v_shift = if Self::_bits() < 64 {
429            value >> (64 - Self::_bits())
430        } else {
431            value
432        };
433
434        let v = if Self::_bits() > 64 {
435            Self::t_from_u64(v_shift) << (Self::_bits() - 64)
436        } else {
437            Self::t_from_u64(v_shift)
438        };
439
440        let top_mask = Self::top_mask(pos);
441        let bottom_mask = Self::bottom_mask(Self::k() - (pos + n_bases));
442        let mask = top_mask | bottom_mask;
443
444        let value_slide = v >> (2 * pos);
445
446        self.storage = (self.storage & mask) | (value_slide & !mask);
447    }
448
449    /// Return the reverse complement of this kmer
450    fn rc(&self) -> Self {
451        // not bits to get complement, then reverse order
452        let new = !self.storage.reverse_by_twos();
453
454        // NOTE: IntKmer always fills the bits, so we don't need to shift here.
455        IntKmer { storage: new }
456    }
457
458    fn at_count(&self) -> u32 {
459        // A's and T's have upper_bit ^ lower_bit == 0
460        // count how many of these are present
461        let mix_base_bits = !((self.storage >> 1) ^ self.storage);
462        let mask_lower = mix_base_bits & IntHelp::lower_of_two();
463        mask_lower.count_ones()
464    }
465
466    fn gc_count(&self) -> u32 {
467        // A's and T's have upper_bit ^ lower_bit == 1
468        // count how many of these are present
469        let mix_base_bits = (self.storage >> 1) ^ self.storage;
470        let mask_lower = mix_base_bits & IntHelp::lower_of_two();
471        mask_lower.count_ones()
472    }
473}
474
475impl<T: PrimInt + FromPrimitive + Hash + IntHelp> Kmer for IntKmer<T> {
476    fn empty() -> Self {
477        IntKmer { storage: T::zero() }
478    }
479
480    #[inline(always)]
481    fn k() -> usize {
482        Self::_k()
483    }
484
485    #[inline(always)]
486    fn from_u64(v: u64) -> IntKmer<T> {
487        IntKmer {
488            storage: Self::t_from_u64(v),
489        }
490    }
491
492    fn to_u64(&self) -> u64 {
493        T::to_u64(&self.storage).unwrap()
494    }
495
496    /// Shift the base v into the left end of the kmer
497    fn extend_left(&self, v: u8) -> Self {
498        let new = self.storage >> 2 | (Self::t_from_byte(v) << ((Self::k() - 1) * 2));
499        IntKmer { storage: new }
500    }
501
502    fn extend_right(&self, v: u8) -> Self {
503        let new = self.storage << 2;
504        let mut kmer = IntKmer { storage: new };
505        kmer.set_mut(Self::k() - 1, v);
506        kmer
507    }
508
509    /// Hamming distance between this kmer and another kmer
510    fn hamming_dist(&self, other: Self) -> u32 {
511        let bit_diffs = self.storage ^ other.storage;
512        let two_bit_diffs = (bit_diffs | bit_diffs >> 1) & IntHelp::lower_of_two();
513        two_bit_diffs.count_ones()
514    }
515}
516
517impl<T: PrimInt + FromPrimitive + Hash + IntHelp> fmt::Debug for IntKmer<T> {
518    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
519        let mut s = String::new();
520        for pos in 0..Self::k() {
521            s.push(bits_to_base(self.get(pos)))
522        }
523
524        write!(f, "{}", s)
525    }
526}
527
528/// Helper trait for declaring the K value of a Kmer. Will be removed when const generics are available
529pub trait KmerSize: Ord + Hash + Copy + fmt::Debug {
530    #[allow(non_snake_case)]
531    fn K() -> usize;
532}
533
534/// A fixed-length Kmer sequence that may not fill the bits of T
535///
536/// side:             L           R
537/// bases: 0   0   0  A  C  G  T  T
538/// bits:             H  ........ L
539/// bit :  14  12  10 8  6  4  2  0
540///
541/// sorting the integer will give a lexicographic sorting of the corresponding string.
542///  kmers that don't fill `storage` are always aligned to the least significant bits
543#[derive(Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash, Serialize, Deserialize)]
544pub struct VarIntKmer<T: IntHelp, KS: KmerSize> {
545    pub storage: T,
546    pub phantom: PhantomData<KS>,
547}
548
549impl<T: PrimInt + FromPrimitive + Hash + IntHelp, KS: KmerSize> Kmer for VarIntKmer<T, KS> {
550    fn empty() -> Self {
551        VarIntKmer {
552            storage: T::zero(),
553            phantom: PhantomData,
554        }
555    }
556
557    #[inline]
558    fn k() -> usize {
559        Self::_k()
560    }
561
562    fn to_u64(&self) -> u64 {
563        T::to_u64(&self.storage).unwrap()
564    }
565
566    fn from_u64(v: u64) -> Self {
567        VarIntKmer {
568            storage: Self::t_from_u64(v),
569            phantom: PhantomData,
570        }
571    }
572
573    /// Shift the base v into the left end of the kmer
574    fn extend_left(&self, v: u8) -> Self {
575        let new = self.storage >> 2;
576        let mut kmer = VarIntKmer {
577            storage: new,
578            phantom: PhantomData,
579        };
580        kmer.set_mut(0, v);
581        kmer
582    }
583
584    fn extend_right(&self, v: u8) -> Self {
585        let new = self.storage << 2 & !Self::top_mask(0);
586        let mut kmer = VarIntKmer {
587            storage: new,
588            phantom: PhantomData,
589        };
590        kmer.set_mut(Self::k() - 1, v);
591        kmer
592    }
593
594    fn hamming_dist(&self, other: Self) -> u32 {
595        let bit_diffs = self.storage ^ other.storage;
596        let two_bit_diffs = (bit_diffs | bit_diffs >> 1) & IntHelp::lower_of_two();
597        two_bit_diffs.count_ones()
598    }
599}
600
601impl<T: PrimInt + FromPrimitive + Hash + IntHelp, KS: KmerSize> VarIntKmer<T, KS> {
602    #[inline(always)]
603    fn msk() -> T {
604        T::one() << 1 | T::one()
605    }
606
607    fn to_byte(v: T) -> u8 {
608        T::to_u8(&v).unwrap()
609    }
610
611    fn t_from_byte(v: u8) -> T {
612        T::from_u8(v).unwrap()
613    }
614
615    fn t_from_u64(v: u64) -> T {
616        T::from_u64(v).unwrap()
617    }
618
619    #[inline(always)]
620    fn addr(&self, pos: usize) -> usize {
621        let top_base = Self::k() - 1;
622        (top_base - pos) * 2
623    }
624
625    // K of this kmer
626    #[inline(always)]
627    fn _k() -> usize {
628        KS::K()
629    }
630
631    // Bits used by this kmer
632    #[inline(always)]
633    fn _bits() -> usize {
634        Self::_k() * 2
635    }
636
637    #[inline(always)]
638    fn _total_bits() -> usize {
639        std::mem::size_of::<T>() * 8
640    }
641
642    // mask the unused bits at the top, plus the requested number of bases
643    #[inline(always)]
644    pub fn top_mask(n_bases: usize) -> T {
645        let unused_bits = Self::_total_bits() - Self::_bits();
646        let mask_bits = n_bases * 2 + unused_bits;
647
648        if mask_bits > 0 {
649            let one = T::one();
650            ((one << mask_bits) - one) << (Self::_total_bits() - mask_bits)
651        } else {
652            T::zero()
653        }
654    }
655
656    #[inline(always)]
657    pub fn bottom_mask(n_bases: usize) -> T {
658        if n_bases > 0 {
659            // first pos bases
660            let one = T::one();
661            (one << (n_bases * 2)) - one
662        } else {
663            T::zero()
664        }
665    }
666}
667
668impl<T: PrimInt + FromPrimitive + Hash + IntHelp, KS: KmerSize> Mer for VarIntKmer<T, KS> {
669    #[inline(always)]
670    fn len(&self) -> usize {
671        Self::_k()
672    }
673
674    fn is_empty(&self) -> bool {
675        Self::_k() == 0
676    }
677
678    /// Get the letter at the given position.
679    fn get(&self, pos: usize) -> u8 {
680        let bit = self.addr(pos);
681        Self::to_byte(self.storage >> bit & Self::msk())
682    }
683
684    fn set_mut(&mut self, pos: usize, v: u8) {
685        let bit = self.addr(pos);
686        let mask = !(Self::msk() << bit);
687
688        self.storage = (self.storage & mask) | (Self::t_from_byte(v) << bit);
689    }
690
691    /// Set a slice of bases in the kmer, using the packed representation in value.
692    /// Sets n_bases, starting at pos. Incoming bases must always be packed into the upper-most
693    /// bits of the value.
694    #[inline(always)]
695    fn set_slice_mut(&mut self, pos: usize, n_bases: usize, value: u64) {
696        debug_assert!(pos + n_bases <= Self::k());
697
698        // Move bases to the top of the smaller type
699        let v_shift = if Self::_total_bits() < 64 {
700            value >> (64 - Self::_total_bits())
701        } else {
702            value
703        };
704
705        // Move bases up to the top of this type
706        let v = if Self::_total_bits() > 64 {
707            Self::t_from_u64(v_shift) << (Self::_total_bits() - 64)
708        } else {
709            Self::t_from_u64(v_shift)
710        };
711
712        // Mask for where the bases will sit in the kmer
713        let top_mask = Self::top_mask(pos);
714        let bottom_mask = Self::bottom_mask(Self::k() - (pos + n_bases));
715        let mask = top_mask | bottom_mask;
716
717        // Move the base down to their home: position + unused high-order bits
718        let shift = (2 * pos) + (Self::_total_bits() - Self::_bits());
719        let value_slide = v >> shift;
720
721        self.storage = (self.storage & mask) | (value_slide & !mask);
722    }
723
724    /// Return the reverse complement of this kmer
725    fn rc(&self) -> Self {
726        // not bits to get complement, then reverse order
727        let mut new = !self.storage.reverse_by_twos();
728
729        // deal with case when the kmer doesn't fill the bits
730        if Self::k() < std::mem::size_of::<T>() * 4 {
731            let up_shift = 2 * (std::mem::size_of::<T>() * 4 - Self::k());
732            new = new >> up_shift;
733        }
734
735        VarIntKmer {
736            storage: new,
737            phantom: PhantomData,
738        }
739    }
740
741    fn at_count(&self) -> u32 {
742        // A's and T's have upper_bit ^ lower_bit == 0
743        // count how many of these are present
744        let mix_base_bits = !((self.storage >> 1) ^ self.storage);
745        let mask_lower = mix_base_bits & !Self::top_mask(0) & IntHelp::lower_of_two();
746        mask_lower.count_ones()
747    }
748
749    fn gc_count(&self) -> u32 {
750        // A's and T's have upper_bit ^ lower_bit == 1
751        // count how many of these are present
752        let mix_base_bits = (self.storage >> 1) ^ self.storage;
753        let mask_lower = mix_base_bits & !Self::top_mask(0) & IntHelp::lower_of_two();
754        mask_lower.count_ones()
755    }
756}
757
758impl<T: PrimInt + FromPrimitive + Hash + IntHelp, KS: KmerSize> fmt::Debug for VarIntKmer<T, KS> {
759    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
760        let mut s = String::new();
761        for pos in 0..Self::k() {
762            s.push(bits_to_base(self.get(pos)))
763        }
764
765        write!(f, "{}", s)
766    }
767}
768
769/// A fixed-length Kmer sequence that may not fill the bits of T
770///
771/// side:             L           R
772/// bases: 0   0   0  A  C  G  T  T
773/// bits:             H  ........ L
774/// bit :  14  12  10 8  6  4  2  0
775///
776/// sorting the integer will give a lexicographic sorting of the corresponding string.
777///  kmers that don't fill `storage` are always aligned to the least significant bits
778#[derive(Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash, Serialize, Deserialize)]
779pub struct VarLenKmer<T: IntHelp + DeserializeOwned, const LEN: usize, KS: KmerSize> 
780{
781    #[serde(with="BigArray")]
782    pub storage: [T; LEN],
783    pub phantom: PhantomData<KS>,
784}
785
786impl<T: IntHelp + DeserializeOwned, const LEN: usize, KS: KmerSize> Kmer for VarLenKmer<T, LEN, KS> {
787    fn empty() -> Self {
788        VarLenKmer {
789            storage: [T::zero(); LEN],
790            phantom: PhantomData,
791        }
792    }
793
794    #[inline]
795    fn k() -> usize {
796        Self::_k()
797    }
798
799    fn to_u64(&self) -> u64 {
800        unimplemented!() // cant really turn the array into an u64
801    }
802
803    fn from_u64(_v: u64) -> Self {
804        unimplemented!() // cant really turn the u64 into an array
805    }
806
807    /// Shift the base v into the left end of the kmer
808    fn extend_left(&self, v: u8) -> Self {
809        let mut new_kmer = VarLenKmer::empty();
810        // for the back storage block, shift right by two
811        let new_back_block = self.storage[LEN-1] >> 2;
812        new_kmer.storage[LEN-1] = new_back_block;
813
814        // go over the rest of the blocks
815        // should we only have one block, this is skipped
816        for step in (0..(LEN-1)).rev() {
817            // always get the back base of block and attach it to the front of the previous one
818            let moved_v = self.get_by_addr(step, 0);
819            new_kmer.set_by_addr(step+1, Self::t_bits()-2, moved_v);
820
821            // then, shift the block by 2 and add it to the new_kmer
822            let new_block = self.storage[step] >> 2;
823            new_kmer.storage[step] = new_block;
824        }
825
826        // finally, add the new base where the k-mer ends in the front block
827        new_kmer.set_mut(0, v);
828        new_kmer
829    }
830
831    /// shift the base v into the right end of the k-mer
832    fn extend_right(&self, v: u8) -> Self {
833        let mut new_kmer = VarLenKmer::empty();
834        // for the front storage block, shift left by two with the mask
835        let new_front_block = self.storage[0] << 2 & !Self::unused_bits_mask(0);
836        new_kmer.storage[0] = new_front_block;
837
838        // go over the rest of the blocks
839        // should we only have one block, this is skipped
840        for step in 1..(LEN) {
841            // always get the front base of block and attach it to the back of the previous one
842            let moved_v = self.get_by_addr(step, Self::t_bits()-2);
843            new_kmer.set_by_addr(step-1, 0, moved_v);
844
845            // then, shift the block by 2 and add it to the new_kmer
846            let new_block = self.storage[step] << 2;
847            new_kmer.storage[step] = new_block;
848        }
849
850        // finally, add the new base to the back block
851        new_kmer.set_mut(Self::k()-1, v);
852        new_kmer
853    }
854
855    fn hamming_dist(&self, other: Self) -> u32 {
856        let mut dist = 0;
857        for block in 0..LEN {
858            let bit_diffs = self.storage[block] ^ other.storage[block];
859            let two_bit_diffs = (bit_diffs | bit_diffs >> 1) & IntHelp::lower_of_two();
860            dist += two_bit_diffs.count_ones();
861        }
862
863        dist
864    }
865}
866
867impl<T: IntHelp + DeserializeOwned, const LEN: usize, KS: KmerSize> VarLenKmer<T, LEN, KS> {
868    fn to_byte(v: T) -> u8 {
869        T::to_u8(&v).unwrap()
870    }
871
872    fn t_from_byte(v: u8) -> T {
873        T::from_u8(v).unwrap()
874    }
875
876    fn t_from_u64(v: u64) -> T {
877        T::from_u64(v).unwrap()
878    }
879
880    /// get the (block, bit) for the position in the k-mer
881    /// 
882    /// bits start counting from the back
883    #[inline(always)]
884    fn addr(&self, pos: usize) -> (usize, usize) {
885        let overall_i = (Self::_k() - 1 - pos) * 2;
886        let block = LEN - 1 - (overall_i / Self::t_bits());
887        let bit = overall_i % Self::t_bits();
888        (block, bit)
889    }
890
891    #[inline(always)]
892    fn get_by_addr(&self, block: usize, bit: usize) -> u8 {
893        let mask = Self::t_from_byte(3);
894        Self::to_byte((self.storage[block] >> bit) & mask)
895    }
896
897    #[inline(always)]
898    fn set_by_addr(&mut self, block: usize, bit: usize, value: u8) {
899        let mask = 3;
900        // check that value has only one base, cast to T, and mov to correct position
901        let value = Self::t_from_byte(value & mask) << bit;
902        // remove the old bits from the block
903        let block_mask = Self::t_from_byte(3) << bit;
904        let new_block = self.storage[block] & !block_mask;
905        // add new block with new base into storage
906        self.storage[block] = new_block | value;
907    }
908
909    /// K of this kmer
910    #[inline(always)]
911    fn _k() -> usize {
912        KS::K()
913    }
914
915    /// Bits used by this kmer
916    #[inline(always)]
917    fn _bits() -> usize {
918        Self::_k() * 2
919    }
920
921    /// bits in the data type
922    #[inline(always)]
923    fn _total_bits() -> usize {
924        std::mem::size_of::<T>() * 8 * LEN
925    }
926
927    /// number of bits in the type T
928    #[inline(always)]
929    fn t_bits() -> usize {
930        std::mem::size_of::<T>() * 8
931    }
932
933    // TODO check
934    /// mask the unused bits at the top, plus the requested number of bases
935    #[inline(always)]
936    pub fn unused_bits_mask(n_bases: usize) -> T {
937        let unused_bits = Self::_total_bits() - Self::_bits();
938
939        assert!(unused_bits < Self::t_bits(), "please use a smaller k-mer impl for this k");
940
941        let mask_bits = n_bases * 2 + unused_bits;
942
943        if mask_bits > 0 {
944            let one = T::one();
945            ((one << mask_bits) - one) << (Self::t_bits() - mask_bits)
946        } else {
947            T::zero()
948        }
949    }
950}
951
952impl<T: IntHelp + DeserializeOwned, const LEN: usize, KS: KmerSize> Mer for VarLenKmer<T, LEN, KS> {
953    #[inline(always)]
954    fn len(&self) -> usize {
955        Self::_k()
956    }
957
958    fn is_empty(&self) -> bool {
959        Self::_k() == 0
960    }
961
962    #[inline(always)]
963    /// Get the letter at the given position.
964    fn get(&self, pos: usize) -> u8 {
965        let (block, bit) = self.addr(pos);
966        self.get_by_addr(block, bit)
967    }
968
969    #[inline(always)]
970    fn set_mut(&mut self, pos: usize, v: u8) {
971        let (block, bit) = self.addr(pos);
972        self.set_by_addr(block, bit, v);
973    }
974
975    /// Set a slice of bases in the kmer, using the packed representation in value.
976    /// Sets n_bases, starting at pos. Incoming bases must always be packed into the front
977    /// bits of the value.
978    #[inline(always)]
979    fn set_slice_mut(&mut self, pos: usize, n_bases: usize, value: u64) {
980        /* let one = T::one();
981        let value_bits = n_bases * 2;
982        // get starting address
983        let (start_block, start_bit) = self.addr(pos);
984        let start_bits = start_bit + 2;
985        let rest_bits = value_bits.saturating_sub(start_bits);
986        let middle_blocks = rest_bits / Self::t_bits();
987        let back_bits = rest_bits.checked_rem(middle_blocks).unwrap_or(rest_bits);
988
989        // if the slice fits into the first block, with some room in the back -> mask the back
990        let gap = start_bits.saturating_sub(value_bits);
991        let gap_mask = if value_bits < start_bit { (one << gap) - one } else { T::zero() };
992        // move first subslice to back, cast to T, then move back up by the gap
993        let first_subslice = Self::t_from_u64(value >> (64 - (start_bits - gap))) << gap;
994
995        // create mask to clear old bits in block, ignore potential back bits
996        let first_mask = if start_bits == Self::t_bits() {
997            !gap_mask
998        } else {
999            ((one << start_bits) - one) & !gap_mask
1000        };
1001        // clear old bits from block, and add starting slice
1002        self.storage[start_block] = (self.storage[start_block] & !first_mask) | first_subslice;
1003
1004        if middle_blocks == 0 && back_bits == 0 { return; } // we are done
1005
1006        // for each full block, extract subslice into T and replace block (in case of T u128 there are no middle blocks)
1007        let end_middle_block = start_block + middle_blocks;
1008        let t_mask = u64::MAX.checked_shl(Self::t_bits() as u32).unwrap_or(0);
1009
1010        for (i, full_block) in ((start_block+1)..(end_middle_block+1)).enumerate() {
1011            // move relevant bits to back of value  and apply mask
1012            let subslice = (value >> (64 - start_bits - Self::t_bits() * i)) & !t_mask;
1013            // cast into T and replace block
1014            self.storage[full_block] = Self::t_from_u64(subslice);
1015        }
1016
1017        // insert back bits
1018        if back_bits > 0 {
1019            let back_gap_mask = (one << (Self::t_bits() - back_bits)) - one;
1020            // shift last bits to end of value, and then back to the start of T
1021            let subslice = Self::t_from_u64(value >> (64 - value_bits) & !t_mask);
1022            let subslice = subslice << (Self::t_bits() - back_bits);
1023            let end_block = end_middle_block + 1;
1024
1025            self.storage[end_block] = (self.storage[end_block] & back_gap_mask) | subslice;
1026        } */
1027        // turn the value slice into a 32 b k-mer
1028        let slice = IntKmer::<u64>::from_u64(value);
1029
1030        // iterate over bases which should be transferred
1031        for i in  0..n_bases {
1032            let val = slice.get(i);
1033            self.set_mut(i + pos, val);
1034        }
1035    }
1036
1037    /// Return the reverse complement of this kmer
1038    fn rc(&self) -> Self {
1039        let mut new_kmer = VarLenKmer::empty();
1040
1041        // get the rc of each base from back to front and add into a new k-mer
1042        for rc_base in (0..Self::k()).rev().map(|pos| 3 - self.get(pos)) {
1043            new_kmer = new_kmer.extend_right(rc_base);
1044        }
1045        new_kmer
1046    }
1047
1048    fn at_count(&self) -> u32 {
1049        // A's and T's have upper_bit ^ lower_bit == 0
1050        // count how many of these are present
1051        
1052        // first block with mask on unused bits
1053        let mix_base_bits = !((self.storage[0] >> 1) ^ self.storage[0]);
1054        let mask_lower = mix_base_bits & !Self::unused_bits_mask(0) & IntHelp::lower_of_two();
1055        let mut count = mask_lower.count_ones();
1056
1057        for block in 1..LEN {
1058            let mix_base_bits = !((self.storage[block] >> 1) ^ self.storage[block]);
1059            let mask_lower = mix_base_bits & IntHelp::lower_of_two();
1060            count += mask_lower.count_ones();
1061        }
1062
1063        count
1064    }
1065
1066    fn gc_count(&self) -> u32 {
1067        // A's and T's have upper_bit ^ lower_bit == 1
1068        // count how many of these are present
1069        let mix_base_bits = (self.storage[0] >> 1) ^ self.storage[0];
1070        let mask_lower = mix_base_bits & !Self::unused_bits_mask(0) & IntHelp::lower_of_two();
1071        let mut count = mask_lower.count_ones();
1072    
1073        for block in 1..LEN {
1074            let mix_base_bits = (self.storage[block] >> 1) ^ self.storage[block];
1075            let mask_lower = mix_base_bits & IntHelp::lower_of_two();
1076            count += mask_lower.count_ones();
1077        }
1078
1079        count
1080    }
1081}
1082
1083impl<T: IntHelp + DeserializeOwned, const LEN: usize, KS: KmerSize> fmt::Debug for VarLenKmer<T, LEN, KS> {
1084    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1085        let mut s = String::new();
1086        for pos in 0..Self::k() {
1087            s.push(bits_to_base(self.get(pos)))
1088        }
1089
1090        write!(f, "{}", s)
1091    }
1092}
1093
1094/// Marker struct for generating K=128 Kmers
1095#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1096pub struct K128;
1097
1098/// Marker struct for generating K=112 Kmers
1099#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1100pub struct K112;
1101
1102/// Marker struct for generating K=96 Kmers
1103#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1104pub struct K96;
1105
1106/// Marker struct for generating K=80 Kmers
1107#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1108pub struct K80;
1109
1110/// Marker struct for generating K=79 Kmers
1111#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1112pub struct K79;
1113/// Marker struct for generating K=63 Kmers
1114#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1115pub struct K63;
1116
1117/// Marker struct for generating K=62 Kmers
1118#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1119pub struct K62;
1120
1121/// Marker struct for generating K=61 Kmers
1122#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1123pub struct K61;
1124
1125/// Marker struct for generating K=60 Kmers
1126#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1127pub struct K60;
1128
1129/// Marker struct for generating K=59 Kmers
1130#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1131pub struct K59;
1132
1133/// Marker struct for generating K=58 Kmers
1134#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1135pub struct K58;
1136
1137/// Marker struct for generating K=57 Kmers
1138#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1139pub struct K57;
1140
1141/// Marker struct for generating K=56 Kmers
1142#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1143pub struct K56;
1144
1145/// Marker struct for generating K=55 Kmers
1146#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1147pub struct K55;
1148
1149/// Marker struct for generating K=54 Kmers
1150#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1151pub struct K54;
1152
1153/// Marker struct for generating K=53 Kmers
1154#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1155pub struct K53;
1156
1157/// Marker struct for generating K=52 Kmers
1158#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1159pub struct K52;
1160
1161/// Marker struct for generating K=51 Kmers
1162#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1163pub struct K51;
1164
1165/// Marker struct for generating K=50 Kmers
1166#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1167pub struct K50;
1168
1169/// Marker struct for generating K=49 Kmers
1170#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1171pub struct K49;
1172
1173/// Marker struct for generating K=48 Kmers
1174#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1175pub struct K48;
1176
1177/// Marker trait for generating K=47 Kmers
1178#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1179pub struct K47;
1180
1181/// Marker trait for generating K=46 Kmers
1182#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1183pub struct K46;
1184
1185/// Marker trait for generating K=45 Kmers
1186#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1187pub struct K45;
1188
1189/// Marker trait for generating K=44 Kmers
1190#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1191pub struct K44;
1192
1193/// Marker trait for generating K=43 Kmers
1194#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1195pub struct K43;
1196
1197/// Marker trait for generating K=42 Kmers
1198#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1199pub struct K42;
1200
1201/// Marker trait for generating K=41 Kmers
1202#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1203pub struct K41;
1204
1205/// Marker trait for generating K=40 Kmers
1206#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1207pub struct K40;
1208
1209/// Marker trait for generating K=39 Kmers
1210#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1211pub struct K39;
1212
1213/// Marker trait for generating K=38 Kmers
1214#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1215pub struct K38;
1216
1217/// Marker trait for generating K=37 Kmers
1218#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1219pub struct K37;
1220
1221/// Marker trait for generating K=36 Kmers
1222#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1223pub struct K36;
1224
1225/// Marker trait for generating K=35 Kmers
1226#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1227pub struct K35;
1228
1229/// Marker trait for generating K=34 Kmers
1230#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1231pub struct K34;
1232
1233/// Marker trait for generating K=33 Kmers
1234#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1235pub struct K33;
1236
1237/// Marker trait for generating K=32 Kmers
1238#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1239pub struct K32;
1240/// Marker trait for generating K=31 Kmers
1241#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1242pub struct K31;
1243
1244/// Marker trait for generating K=30 Kmers
1245#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1246pub struct K30;
1247
1248/// Marker trait for generating K=29 Kmers
1249#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1250pub struct K29;
1251
1252/// Marker trait for generating K=28 Kmers
1253#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1254pub struct K28;
1255
1256/// Marker trait for generating K=27 Kmers
1257#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1258pub struct K27;
1259
1260/// Marker trait for generating K=26 Kmers
1261#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1262pub struct K26;
1263
1264/// Marker trait for generating K=25 Kmers
1265#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1266pub struct K25;
1267
1268/// Marker trait for generating K=24 Kmers
1269#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1270pub struct K24;
1271
1272/// Marker trait for generating K=23 Kmers
1273#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1274pub struct K23;
1275
1276/// Marker trait for generating K=22 Kmers
1277#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1278pub struct K22;
1279
1280/// Marker trait for generating K=21 Kmers
1281#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1282pub struct K21;
1283
1284/// Marker trait for generating K=20 Kmers
1285#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1286pub struct K20;
1287
1288/// Marker trait for generating K=19 Kmers
1289#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1290pub struct K19;
1291
1292/// Marker trait for generating K=18 Kmers
1293#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1294pub struct K18;
1295
1296/// Marker trait for generating K=17 Kmers
1297#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1298pub struct K17;
1299
1300/// Marker trait for generating K=15 Kmers
1301#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1302pub struct K15;
1303
1304/// Marker trait for generating K=14 Kmers
1305#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1306pub struct K14;
1307
1308/// Marker trait for generating K=13 Kmers
1309#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1310pub struct K13;
1311
1312/// Marker trait for generating K=12 Kmers
1313#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1314pub struct K12;
1315
1316/// Marker trait for generating K=11 Kmers
1317#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1318pub struct K11;
1319
1320/// Marker trait for generating K=10 Kmers
1321#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1322pub struct K10;
1323
1324/// Marker trait for generating K=9 Kmers
1325#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1326pub struct K9;
1327
1328/// Marker trait for generating K=7 Kmers
1329#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1330pub struct K7;
1331
1332/// Marker trait for generating K=6 Kmers
1333#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1334pub struct K6;
1335
1336/// Marker trait for generating K=5 Kmers
1337#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1338pub struct K5;
1339/// Marker trait for generating K=4 Kmers
1340#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1341pub struct K4;
1342/// Marker trait for generating K=3 Kmers
1343#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1344pub struct K3;
1345/// Marker trait for generating K=2 Kmers
1346#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1347pub struct K2;
1348
1349/// Marker trait for generating K=0 Kmers (for testing)
1350#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1351struct K0;
1352
1353/// Marker trait for generating K=300 Kmers (for testing)
1354#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1355struct K300;
1356
1357#[cfg(test)]
1358mod tests {
1359use std::fmt::Debug;
1360use std::time;
1361
1362use super::*;
1363    use crate::vmer::Lmer;
1364    use rand::{self, Rng, RngCore};
1365
1366    use crate::MerImmut;
1367    use crate::Vmer;
1368
1369    fn check_hd<T: Kmer + Debug>(k1: T, k2: T) {
1370        let mut n = 0;
1371        for i in 0..T::k() {
1372            if k1.get(i) != k2.get(i) {
1373                n += 1;
1374            }
1375        }
1376
1377        assert_eq!(k1.hamming_dist(k2), n);
1378        assert_eq!(k2.hamming_dist(k1), n);
1379    }
1380
1381    // Generate random kmers & test the methods for manipulating them
1382    fn check_kmer<T: Kmer + Debug>() {
1383        #[allow(non_snake_case)]
1384        let K = T::k();
1385
1386        // Random kmer
1387        let km = random_kmer::<T>();
1388
1389        // check HD calc
1390        let km2 = random_kmer::<T>();
1391        check_hd(km, km2);
1392
1393        // Reverse complementing
1394        let rc = km.rc();
1395        let double_rc = rc.rc();
1396        assert!(km == double_rc);
1397
1398        for i in 0..K {
1399            assert!(km.get(i) == (3 - rc.get(K - 1 - i)))
1400        }
1401
1402        // Get and set bases
1403        for i in 0..K {
1404            let km2 = km.set(i, 0);
1405            assert!(km2.get(i) == 0);
1406        }
1407        let mut copy_kmer = T::empty();
1408        for i in 0..K {
1409            copy_kmer = copy_kmer.set(i, km.get(i));
1410        }
1411        assert!(km == copy_kmer);
1412
1413        // Extend right
1414        let nb = random_base();
1415        let ext_r = km.extend_right(nb);
1416        assert!(ext_r.get(K - 1) == nb);
1417        assert!(km.get(1) == ext_r.get(0));
1418
1419        // Extend Left
1420        let nb = random_base();
1421        let ext_l = km.extend_left(nb);
1422        assert!(ext_l.get(0) == nb);
1423        assert!(ext_l.get(1) == km.get(0));
1424
1425        // Extend left with an A -- should sort lower
1426        let lt = km.extend_left(0);
1427        assert!(lt <= km);
1428
1429        // Extend left with T -- should sort higher
1430        let gt = km.extend_left(3);
1431        assert!(gt >= km);
1432
1433        // Shift twice
1434        let l_base = random_base();
1435        let r_base = random_base();
1436        let ts = km.set(0, l_base).set(K - 1, r_base);
1437
1438        let double_shift = ts.extend_left(0).extend_right(r_base);
1439        assert!(ts == double_shift);
1440
1441        if T::k() <= 32 {
1442            // Convert to and from u64.
1443            let u64_1 = km.to_u64();
1444            let km2 = T::from_u64(u64_1);
1445            let u64_2 = km2.to_u64();
1446            assert_eq!(km, km2);
1447            assert_eq!(u64_1, u64_2);
1448        }
1449
1450        // check AT / GC counter
1451        let mut at_count = 0;
1452        let mut gc_count = 0;
1453        for i in 0..km.len() {
1454            let base = km.get(i);
1455            if base == 0 || base == 3 {
1456                at_count += 1;
1457            } else {
1458                gc_count += 1;
1459            }
1460        }
1461
1462        assert_eq!(km.at_count(), at_count);
1463        assert_eq!(km.gc_count(), gc_count);
1464    }
1465
1466    fn check_vmer<V: Vmer + MerImmut, T: Kmer>() {
1467        let vm = random_vmer::<V, T>();
1468        let l = vm.len();
1469
1470        let rc = vm.rc();
1471
1472        for i in 0..l {
1473            if vm.get(i) != (3 - rc.get(l - 1 - i)) {
1474                println!("km: {:?}, rc: {:?}", vm, rc);
1475            }
1476
1477            assert!(vm.get(i) == (3 - rc.get(l - 1 - i)))
1478        }
1479
1480        let double_rc = rc.rc();
1481        assert!(vm == double_rc);
1482
1483        for i in 0..l {
1484            // Get and set
1485            let vm2 = vm.set(i, 0);
1486            assert!(vm2.get(i) == 0);
1487        }
1488
1489        let mut copy_vmer = V::new(l);
1490        for i in 0..l {
1491            copy_vmer = copy_vmer.set(i, vm.get(i));
1492        }
1493        assert!(vm == copy_vmer);
1494
1495        let kmers: Vec<T> = vm.iter_kmers().collect();
1496        assert_eq!(kmers.len(), vm.len() - T::k() + 1);
1497
1498        for (pos, kmer) in kmers.iter().enumerate() {
1499            for i in 0..T::k() {
1500                assert_eq!(kmer.get(i), vm.get(i + pos))
1501            }
1502
1503            if vm.get_kmer::<T>(pos) != *kmer {
1504                println!(
1505                    "didn't get same kmer: i:{}, vm: {:?} kmer_iter: {:?}, kmer_get: {:?}",
1506                    pos,
1507                    vm,
1508                    kmer,
1509                    vm.get_kmer::<T>(pos)
1510                )
1511            }
1512            assert_eq!(*kmer, vm.get_kmer(pos));
1513        }
1514
1515        assert!(kmers[0] == vm.first_kmer());
1516        assert!(kmers[kmers.len() - 1] == vm.last_kmer());
1517    }
1518
1519    pub fn random_vmer<V: Vmer + MerImmut, T: Kmer>() -> V {
1520        let mut r = rand::thread_rng();
1521        let len = r.gen_range(T::k(), V::max_len());
1522
1523        let mut vmer = V::new(len);
1524        for pos in 0..len {
1525            let b = (r.next_u64() % 4) as u8;
1526            vmer = vmer.set(pos, b);
1527        }
1528        vmer
1529    }
1530
1531    pub fn random_kmer<T: Kmer>() -> T {
1532        let mut r = rand::thread_rng();
1533        let mut kmer = T::empty();
1534        for pos in 0..T::k() {
1535            let b = (r.next_u64() % 4) as u8;
1536            kmer = kmer.set(pos, b);
1537        }
1538        kmer
1539    }
1540
1541    pub fn random_base() -> u8 {
1542        let mut r = rand::thread_rng();
1543        (r.next_u64() % 4) as u8
1544    }
1545
1546    #[test]
1547    fn test_lmer_3_kmer_64() {
1548        for _ in 0..10000 {
1549            check_vmer::<Lmer<[u64; 3]>, IntKmer<u128>>();
1550        }
1551    }
1552
1553    #[test]
1554    fn test_lmer_3_kmer_48() {
1555        for _ in 0..10000 {
1556            check_vmer::<Lmer<[u64; 3]>, VarIntKmer<u128, K48>>();
1557        }
1558    }
1559
1560    #[test]
1561    fn test_lmer_3_kmer_32() {
1562        for _ in 0..10000 {
1563            check_vmer::<Lmer<[u64; 3]>, IntKmer<u64>>();
1564        }
1565    }
1566
1567    #[test]
1568    fn test_lmer_2_kmer_32() {
1569        for _ in 0..10000 {
1570            check_vmer::<Lmer<[u64; 3]>, IntKmer<u64>>();
1571        }
1572    }
1573
1574    #[test]
1575    fn test_lmer_1_kmer_24() {
1576        for _ in 0..10000 {
1577            check_vmer::<Lmer<[u64; 1]>, VarIntKmer<u64, K24>>();
1578        }
1579    }
1580
1581    #[test]
1582    fn test_lmer_1_kmer_20() {
1583        for _ in 0..10000 {
1584            check_vmer::<Lmer<[u64; 1]>, VarIntKmer<u64, K20>>();
1585        }
1586    }
1587
1588    #[test]
1589    fn test_lmer_1_kmer_16() {
1590        for _ in 0..10000 {
1591            check_vmer::<Lmer<[u64; 1]>, IntKmer<u32>>();
1592        }
1593    }
1594
1595    #[test]
1596    fn test_kmer_128() {
1597        for _ in 0..10000 {
1598            check_kmer::<VarLenKmer<u64, 4, K128>>();
1599        }
1600    }
1601
1602    #[test]
1603    fn test_kmer_112() {
1604        for _ in 0..10000 {
1605            check_kmer::<VarLenKmer<u32, 7, K112>>();
1606        }
1607    }
1608
1609    #[test]
1610    fn test_kmer_96() {
1611        for _ in 0..10000 {
1612            check_kmer::<VarLenKmer<u64, 3, K96>>();
1613        }
1614    }
1615
1616    #[test]
1617    fn test_kmer_80() {
1618        for _ in 0..10000 {
1619            check_kmer::<VarLenKmer<u32, 5, K80>>();
1620        }
1621    }
1622
1623    #[test]
1624    fn test_kmer_79() {
1625        for _ in 0..10000 {
1626            check_kmer::<VarLenKmer<u32, 5, K79>>();
1627        }
1628    }
1629
1630    #[test]
1631    fn test_kmer_64() {
1632        for _ in 0..10000 {
1633            check_kmer::<IntKmer<u128>>();
1634        }
1635    }
1636
1637    #[test]
1638    fn test_kmer_63() {
1639        for _ in 0..10000 {
1640            check_kmer::<VarIntKmer<u128, K63>>();
1641        }
1642    }
1643
1644    #[test]
1645    fn test_kmer_62() {
1646        for _ in 0..10000 {
1647            check_kmer::<VarIntKmer<u128, K62>>();
1648        }
1649    }
1650
1651    #[test]
1652    fn test_kmer_61() {
1653        for _ in 0..10000 {
1654            check_kmer::<VarIntKmer<u128, K61>>();
1655        }
1656    }
1657
1658    #[test]
1659    fn test_kmer_60() {
1660        for _ in 0..10000 {
1661            check_kmer::<VarIntKmer<u128, K60>>();
1662        }
1663    }
1664
1665    #[test]
1666    fn test_kmer_59() {
1667        for _ in 0..10000 {
1668            check_kmer::<VarIntKmer<u128, K59>>();
1669        }
1670    }
1671
1672    #[test]
1673    fn test_kmer_58() {
1674        for _ in 0..10000 {
1675            check_kmer::<VarIntKmer<u128, K58>>();
1676        }
1677    }
1678
1679
1680    #[test]
1681    fn test_kmer_57() {
1682        for _ in 0..10000 {
1683            check_kmer::<VarIntKmer<u128, K57>>();
1684        }
1685    }
1686
1687    #[test]
1688    fn test_kmer_56() {
1689        for _ in 0..10000 {
1690            check_kmer::<VarIntKmer<u128, K56>>();
1691        }
1692    }
1693
1694
1695    #[test]
1696    fn test_kmer_55() {
1697        for _ in 0..10000 {
1698            check_kmer::<VarIntKmer<u128, K55>>();
1699        }
1700    }
1701
1702    #[test]
1703    fn test_kmer_54() {
1704        for _ in 0..10000 {
1705            check_kmer::<VarIntKmer<u128, K54>>();
1706        }
1707    }
1708
1709    #[test]
1710    fn test_kmer_53() {
1711        for _ in 0..10000 {
1712            check_kmer::<VarIntKmer<u128, K53>>();
1713        }
1714    }
1715
1716    #[test]
1717    fn test_kmer_52() {
1718        for _ in 0..10000 {
1719            check_kmer::<VarIntKmer<u128, K52>>();
1720        }
1721    }
1722
1723    #[test]
1724    fn test_kmer_51() {
1725        for _ in 0..10000 {
1726            check_kmer::<VarIntKmer<u128, K51>>();
1727        }
1728    }
1729
1730    #[test]
1731    fn test_kmer_50() {
1732        for _ in 0..10000 {
1733            check_kmer::<VarIntKmer<u128, K50>>();
1734        }
1735    }
1736
1737    #[test]
1738    fn test_kmer_49() {
1739        for _ in 0..10000 {
1740            check_kmer::<VarIntKmer<u128, K49>>();
1741        }
1742    }
1743
1744
1745    #[test]
1746    fn test_kmer_48() {
1747        for _ in 0..10000 {
1748            check_kmer::<VarIntKmer<u128, K48>>();
1749        }
1750    }
1751
1752    #[test]
1753    fn test_kmer_47() {
1754        for _ in 0..10000 {
1755            check_kmer::<VarIntKmer<u128, K47>>();
1756        }
1757    }
1758
1759    #[test]
1760    fn test_kmer_46() {
1761        for _ in 0..10000 {
1762            check_kmer::<VarIntKmer<u128, K46>>();
1763        }
1764    }
1765
1766    #[test]
1767    fn test_kmer_45() {
1768        for _ in 0..10000 {
1769            check_kmer::<VarIntKmer<u128, K45>>();
1770        }
1771    }
1772
1773    #[test]
1774    fn test_kmer_44() {
1775        for _ in 0..10000 {
1776            check_kmer::<VarIntKmer<u128, K44>>();
1777        }
1778    }
1779
1780    #[test]
1781    fn test_kmer_43() {
1782        for _ in 0..10000 {
1783            check_kmer::<VarIntKmer<u128, K43>>();
1784        }
1785    }
1786
1787    #[test]
1788    fn test_kmer_42() {
1789        for _ in 0..10000 {
1790            check_kmer::<VarIntKmer<u128, K42>>();
1791        }
1792    }
1793
1794    #[test]
1795    fn test_kmer_41() {
1796        for _ in 0..10000 {
1797            check_kmer::<VarIntKmer<u128, K41>>();
1798        }
1799    }
1800
1801    #[test]
1802    fn test_kmer_40() {
1803        for _ in 0..10000 {
1804            check_kmer::<VarIntKmer<u128, K40>>();
1805        }
1806    }
1807
1808    #[test]
1809    fn test_kmer_39() {
1810        for _ in 0..10000 {
1811            check_kmer::<VarIntKmer<u128, K39>>();
1812        }
1813    }
1814
1815    #[test]
1816    fn test_kmer_38() {
1817        for _ in 0..10000 {
1818            check_kmer::<VarIntKmer<u128, K38>>();
1819        }
1820    }
1821
1822    #[test]
1823    fn test_kmer_37() {
1824        for _ in 0..10000 {
1825            check_kmer::<VarIntKmer<u128, K37>>();
1826        }
1827    }
1828
1829    #[test]
1830    fn test_kmer_36() {
1831        for _ in 0..10000 {
1832            check_kmer::<VarIntKmer<u128, K36>>();
1833        }
1834    }
1835
1836    #[test]
1837    fn test_kmer_35() {
1838        for _ in 0..10000 {
1839            check_kmer::<VarIntKmer<u128, K35>>();
1840        }
1841    }
1842
1843    #[test]
1844    fn test_kmer_34() {
1845        for _ in 0..10000 {
1846            check_kmer::<VarIntKmer<u128, K34>>();
1847        }
1848    }
1849
1850    #[test]
1851    fn test_kmer_33() {
1852        for _ in 0..10000 {
1853            check_kmer::<VarIntKmer<u128, K33>>();
1854        }
1855    }
1856
1857    #[test]
1858    fn test_kmer_32() {
1859        for _ in 0..10000 {
1860            check_kmer::<IntKmer<u64>>();
1861        }
1862    }
1863
1864    #[test]
1865    fn test_kmer_31() {
1866        for _ in 0..10000 {
1867            check_kmer::<VarIntKmer<u64, K31>>();
1868        }
1869    }
1870
1871    #[test]
1872    fn test_kmer_30() {
1873        for _ in 0..10000 {
1874            check_kmer::<VarIntKmer<u64, K30>>();
1875        }
1876    }
1877
1878    #[test]
1879    fn test_kmer_29() {
1880        for _ in 0..10000 {
1881            check_kmer::<VarIntKmer<u64, K29>>();
1882        }
1883    }
1884
1885    #[test]
1886    fn test_kmer_28() {
1887        for _ in 0..10000 {
1888            check_kmer::<VarIntKmer<u64, K28>>();
1889        }
1890    }
1891
1892    #[test]
1893    fn test_kmer_27() {
1894        for _ in 0..10000 {
1895            check_kmer::<VarIntKmer<u64, K27>>();
1896        }
1897    }
1898
1899    #[test]
1900    fn test_kmer_26() {
1901        for _ in 0..10000 {
1902            check_kmer::<VarIntKmer<u64, K26>>();
1903        }
1904    }
1905
1906    #[test]
1907    fn test_kmer_25() {
1908        for _ in 0..10000 {
1909            check_kmer::<VarIntKmer<u64, K25>>();
1910        }
1911    }
1912
1913    #[test]
1914    fn test_kmer_24() {
1915        for _ in 0..10000 {
1916            check_kmer::<VarIntKmer<u64, K24>>();
1917        }
1918    }
1919
1920    #[test]
1921    fn test_kmer_23() {
1922        for _ in 0..10000 {
1923            check_kmer::<VarIntKmer<u64, K23>>();
1924        }
1925    }
1926
1927    #[test]
1928    fn test_kmer_22() {
1929        for _ in 0..10000 {
1930            check_kmer::<VarIntKmer<u64, K22>>();
1931        }
1932    }
1933
1934    #[test]
1935    fn test_kmer_21() {
1936        for _ in 0..10000 {
1937            check_kmer::<VarIntKmer<u64, K21>>();
1938        }
1939    }
1940
1941    #[test]
1942    fn test_kmer_20() {
1943        for _ in 0..10000 {
1944            check_kmer::<VarIntKmer<u64, K20>>();
1945        }
1946    }
1947
1948    #[test]
1949    fn test_kmer_19() {
1950        for _ in 0..10000 {
1951            check_kmer::<VarIntKmer<u64, K19>>();
1952        }
1953    }
1954
1955    #[test]
1956    fn test_kmer_18() {
1957        for _ in 0..10000 {
1958            check_kmer::<VarIntKmer<u64, K18>>();
1959        }
1960    }
1961
1962    #[test]
1963    fn test_kmer_17() {
1964        for _ in 0..10000 {
1965            check_kmer::<VarIntKmer<u64, K17>>();
1966        }
1967    }
1968
1969    #[test]
1970    fn test_kmer_16() {
1971        for _ in 0..10000 {
1972            check_kmer::<IntKmer<u32>>();
1973        }
1974    }
1975
1976    #[test]
1977    fn test_kmer_15() {
1978        for _ in 0..10000 {
1979            check_kmer::<VarIntKmer<u32, K15>>();
1980        }
1981    }
1982
1983    #[test]
1984    fn test_kmer_14() {
1985        for _ in 0..10000 {
1986            check_kmer::<VarIntKmer<u32, K14>>();
1987        }
1988    }
1989
1990    #[test]
1991    fn test_kmer_13() {
1992        for _ in 0..10000 {
1993            check_kmer::<VarIntKmer<u32, K13>>();
1994        }
1995    }
1996
1997    #[test]
1998    fn test_kmer_12() {
1999        for _ in 0..10000 {
2000            check_kmer::<VarIntKmer<u32, K12>>();
2001        }
2002    }
2003
2004    #[test]
2005    fn test_kmer_11() {
2006        for _ in 0..10000 {
2007            check_kmer::<VarIntKmer<u32, K11>>();
2008        }
2009    }
2010
2011    #[test]
2012    fn test_kmer_10() {
2013        for _ in 0..10000 {
2014            check_kmer::<VarIntKmer<u32, K10>>();
2015        }
2016    }
2017
2018    #[test]
2019    fn test_kmer_9() {
2020        for _ in 0..10000 {
2021            check_kmer::<VarIntKmer<u32, K9>>();
2022        }
2023    }
2024
2025    #[test]
2026    fn test_kmer_8() {
2027        for _ in 0..10000 {
2028            check_kmer::<IntKmer<u16>>();
2029        }
2030    }
2031
2032    #[test]
2033    fn test_kmer_7() {
2034        for _ in 0..10000 {
2035            check_kmer::<Kmer7>();
2036        }
2037    }
2038
2039    #[test]
2040    fn test_kmer_6() {
2041        for _ in 0..10000 {
2042            check_kmer::<Kmer6>();
2043        }
2044    }
2045
2046    #[test]
2047    fn test_kmer_5() {
2048        for _ in 0..10000 {
2049            check_kmer::<Kmer5>();
2050        }
2051    }
2052
2053    #[test]
2054    fn test_kmer_4() {
2055        for _ in 0..10000 {
2056            check_kmer::<Kmer4>();
2057        }
2058    }
2059
2060    #[test]
2061    fn test_kmer_3() {
2062        for _ in 0..10000 {
2063            check_kmer::<Kmer3>();
2064        }
2065    }
2066
2067    #[test]
2068    fn test_kmer_2() {
2069        for _ in 0..10000 {
2070            check_kmer::<Kmer2>();
2071        }
2072    }
2073
2074    #[test]
2075    fn test_is_empty() {
2076        let kmer = IntKmer::<u8>::empty();
2077        assert!(!kmer.is_empty()); // cant be empty
2078        let kmer = VarIntKmer::<u8, K0>::empty();
2079        assert!(kmer.is_empty());
2080        let kmer = VarLenKmer::<u8, 0, K0>::empty();
2081        assert!(kmer.is_empty());
2082    }
2083
2084    #[test]
2085    fn test_extend_left() {
2086        let mut kmer = VarLenKmer::<u32, 5, K80>::empty();
2087
2088        for base in [1, 1, 1, 3, 0, 1, 2, 0, 3, 0, 1].iter() {
2089            kmer = kmer.extend_left(*base);
2090        }
2091
2092        println!("kmer: {:?}", kmer);
2093
2094        let mut kmer = VarLenKmer::<u32, 5, K80>::empty();
2095
2096        for base in [1, 1, 1, 3, 0, 1, 2, 0, 3, 0, 1].iter().rev() {
2097            kmer = kmer.extend_right(*base);
2098        }
2099
2100        println!("kmer: {:?}", kmer);
2101    }
2102
2103    #[test]
2104    fn test_set_mut_slice() {
2105        let mut kmer = VarLenKmer::<u32, 5, K80>::empty();
2106        kmer.set_slice_mut(3, 28, 0b01110111010101011111111101010101111111110000000010101010 << 8);
2107        println!("{:?}", kmer);
2108    }
2109
2110
2111    #[test]
2112    fn test_varlenkmer_speed() {
2113        let bef = time::Instant::now();
2114        for _i in 0..100 {
2115            let mut kmer = VarLenKmer::<u32, 2, K31>::empty();
2116            kmer.set_slice_mut(6, 15, 0b010101010101010101010101010101);
2117        }
2118        let af = bef.elapsed().as_nanos();
2119        println!("set slice mut, var len 31: {af}");
2120
2121        let bef = time::Instant::now();
2122        for _i in 0..100 {
2123            let mut kmer = Kmer31::empty();
2124            kmer.set_slice_mut(6, 15, 0b010101010101010101010101010101);
2125        }
2126        let af = bef.elapsed().as_nanos();
2127        println!("set slice mut, con len 31: {af}");
2128
2129        let bef = time::Instant::now();
2130        for _i in 0..100 {
2131            let mut kmer = VarLenKmer::<u32, 2, K31>::empty();
2132            kmer.set_mut(5, 1);
2133        }
2134        let af = bef.elapsed().as_nanos();
2135        println!("set mut, var len 31: {af}");
2136
2137        let bef = time::Instant::now();
2138        for _i in 0..100 {
2139            let mut kmer = Kmer31::empty();
2140            kmer.set_mut(5, 1);
2141        }
2142        let af = bef.elapsed().as_nanos();
2143        println!("set mut, con len 31: {af}");
2144
2145        let bef = time::Instant::now();
2146        for _i in 0..100 {
2147            let kmer = Kmer64::from_u64(17);
2148            for i in 6..21 {
2149                kmer.get(i);
2150            }
2151        }
2152        let af = bef.elapsed().as_nanos();
2153        println!("from u64, get f u64: {af}"); 
2154    }
2155}