1use 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
56pub type Kmer128 = VarLenKmer<u64, 4, K128>;
61pub type Kmer112 = VarLenKmer<u32, 7, K112>;
63pub type Kmer96 = VarLenKmer<u64, 3, K96>;
65pub type Kmer80 = VarLenKmer<u32, 5, K80>;
67pub type Kmer64 = IntKmer<u128>;
69pub type Kmer63 = VarIntKmer<u128, K63>;
71pub type Kmer62 = VarIntKmer<u128, K62>;
73pub type Kmer61 = VarIntKmer<u128, K61>;
75pub type Kmer60 = VarIntKmer<u128, K60>;
77pub type Kmer59 = VarIntKmer<u128, K59>;
79pub type Kmer58 = VarIntKmer<u128, K58>;
81pub type Kmer57 = VarIntKmer<u128, K57>;
83pub type Kmer56 = VarIntKmer<u128, K56>;
85pub type Kmer55 = VarIntKmer<u128, K55>;
87pub type Kmer54 = VarIntKmer<u128, K54>;
89pub type Kmer53 = VarIntKmer<u128, K53>;
91pub type Kmer52 = VarIntKmer<u128, K52>;
93pub type Kmer51 = VarIntKmer<u128, K51>;
95pub type Kmer50 = VarIntKmer<u128, K50>;
97pub type Kmer49 = VarIntKmer<u128, K49>;
99pub type Kmer48 = VarIntKmer<u128, K48>;
101pub type Kmer47 = VarIntKmer<u128, K47>;
103pub type Kmer46 = VarIntKmer<u128, K46>;
105pub type Kmer45 = VarIntKmer<u128, K45>;
107pub type Kmer44 = VarIntKmer<u128, K44>;
109pub type Kmer43 = VarIntKmer<u128, K43>;
111pub type Kmer42 = VarIntKmer<u128, K42>;
113pub type Kmer41 = VarIntKmer<u128, K41>;
115pub type Kmer40 = VarIntKmer<u128, K40>;
117pub type Kmer39 = VarIntKmer<u128, K39>;
119pub type Kmer38 = VarIntKmer<u128, K38>;
121pub type Kmer37 = VarIntKmer<u128, K37>;
123pub type Kmer36 = VarIntKmer<u128, K36>;
125pub type Kmer35 = VarIntKmer<u128, K35>;
127pub type Kmer34 = VarIntKmer<u128, K34>;
129pub type Kmer33 = VarIntKmer<u128, K33>;
131pub type Kmer32 = IntKmer<u64>;
133pub type Kmer31 = VarIntKmer<u64, K31>;
135pub type Kmer30 = VarIntKmer<u64, K30>;
137pub type Kmer29 = VarIntKmer<u64, K29>;
139pub type Kmer28 = VarIntKmer<u64, K28>;
141pub type Kmer27 = VarIntKmer<u64, K27>;
143pub type Kmer26 = VarIntKmer<u64, K26>;
145pub type Kmer25 = VarIntKmer<u64, K25>;
147pub type Kmer24 = VarIntKmer<u64, K24>;
149pub type Kmer23 = VarIntKmer<u64, K23>;
151pub type Kmer22 = VarIntKmer<u64, K22>;
153pub type Kmer21 = VarIntKmer<u64, K21>;
155pub type Kmer20 = VarIntKmer<u64, K20>;
157pub type Kmer19 = VarIntKmer<u64, K19>;
159pub type Kmer18 = VarIntKmer<u64, K18>;
161pub type Kmer17 = VarIntKmer<u64, K17>;
163pub type Kmer16 = IntKmer<u32>;
165pub type Kmer15 = VarIntKmer<u32, K15>;
167pub type Kmer14 = VarIntKmer<u32, K14>;
169pub type Kmer13 = VarIntKmer<u32, K13>;
171pub type Kmer12 = VarIntKmer<u32, K12>;
173pub type Kmer11 = VarIntKmer<u32, K11>;
175pub type Kmer10 = VarIntKmer<u32, K10>;
177pub type Kmer9 = VarIntKmer<u32, K9>;
179pub type Kmer8 = IntKmer<u16>;
181pub type Kmer7 = VarIntKmer<u16, K7>;
183pub type Kmer6 = VarIntKmer<u16, K6>;
185pub type Kmer5 = VarIntKmer<u16, K5>;
187pub type Kmer4 = IntKmer<u8>;
189pub type Kmer3 = VarIntKmer<u8, K3>;
191pub type Kmer2 = VarIntKmer<u8, K2>;
193
194
195
196pub trait IntHelp: PrimInt + FromPrimitive + Hash + Serialize + Display + Debug + Binary {
198 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 let mut r = ((self & 0x33333333333333333333333333333333u128) << 2)
209 | ((self >> 2) & 0x33333333333333333333333333333333u128);
210
211 r = ((r & 0x0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0Fu128) << 4)
213 | ((r >> 4) & 0x0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0Fu128);
214
215 r = ((r & 0x00FF00FF00FF00FF00FF00FF00FF00FFu128) << 8)
217 | ((r >> 8) & 0x00FF00FF00FF00FF00FF00FF00FF00FFu128);
218
219 r = ((r & 0x0000FFFF0000FFFF0000FFFF0000FFFFu128) << 16)
221 | ((r >> 16) & 0x0000FFFF0000FFFF0000FFFF0000FFFFu128);
222
223 r = ((r & 0x00000000FFFFFFFF00000000FFFFFFFFu128) << 32)
225 | ((r >> 32) & 0x00000000FFFFFFFF00000000FFFFFFFFu128);
226
227 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 let mut r = ((self & 0x3333333333333333u64) << 2) | ((self >> 2) & 0x3333333333333333u64);
245
246 r = ((r & 0x0F0F0F0F0F0F0F0Fu64) << 4) | ((r >> 4) & 0x0F0F0F0F0F0F0F0Fu64);
248
249 r = ((r & 0x00FF00FF00FF00FFu64) << 8) | ((r >> 8) & 0x00FF00FF00FF00FFu64);
251
252 r = ((r & 0x0000FFFF0000FFFFu64) << 16) | ((r >> 16) & 0x0000FFFF0000FFFFu64);
254
255 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 let mut r = ((self & 0x33333333u32) << 2) | ((self >> 2) & 0x33333333u32);
272
273 r = ((r & 0x0F0F0F0Fu32) << 4) | ((r >> 4) & 0x0F0F0F0Fu32);
275
276 r = ((r & 0x00FF00FFu32) << 8) | ((r >> 8) & 0x00FF00FFu32);
278
279 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 let mut r = ((self & 0x3333u16) << 2) | ((self >> 2) & 0x3333u16);
296
297 r = ((r & 0x0F0Fu16) << 4) | ((r >> 4) & 0x0F0Fu16);
299
300 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 let mut r = ((self & 0x33u8) << 2) | ((self >> 2) & 0x33u8);
317
318 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#[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 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 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 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 #[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 #[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 fn rc(&self) -> Self {
451 let new = !self.storage.reverse_by_twos();
453
454 IntKmer { storage: new }
456 }
457
458 fn at_count(&self) -> u32 {
459 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 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 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 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
528pub trait KmerSize: Ord + Hash + Copy + fmt::Debug {
530 #[allow(non_snake_case)]
531 fn K() -> usize;
532}
533
534#[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 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 #[inline(always)]
627 fn _k() -> usize {
628 KS::K()
629 }
630
631 #[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 #[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 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 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 #[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 let v_shift = if Self::_total_bits() < 64 {
700 value >> (64 - Self::_total_bits())
701 } else {
702 value
703 };
704
705 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 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 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 fn rc(&self) -> Self {
726 let mut new = !self.storage.reverse_by_twos();
728
729 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 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 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#[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!() }
802
803 fn from_u64(_v: u64) -> Self {
804 unimplemented!() }
806
807 fn extend_left(&self, v: u8) -> Self {
809 let mut new_kmer = VarLenKmer::empty();
810 let new_back_block = self.storage[LEN-1] >> 2;
812 new_kmer.storage[LEN-1] = new_back_block;
813
814 for step in (0..(LEN-1)).rev() {
817 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 let new_block = self.storage[step] >> 2;
823 new_kmer.storage[step] = new_block;
824 }
825
826 new_kmer.set_mut(0, v);
828 new_kmer
829 }
830
831 fn extend_right(&self, v: u8) -> Self {
833 let mut new_kmer = VarLenKmer::empty();
834 let new_front_block = self.storage[0] << 2 & !Self::unused_bits_mask(0);
836 new_kmer.storage[0] = new_front_block;
837
838 for step in 1..(LEN) {
841 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 let new_block = self.storage[step] << 2;
847 new_kmer.storage[step] = new_block;
848 }
849
850 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 #[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 let value = Self::t_from_byte(value & mask) << bit;
902 let block_mask = Self::t_from_byte(3) << bit;
904 let new_block = self.storage[block] & !block_mask;
905 self.storage[block] = new_block | value;
907 }
908
909 #[inline(always)]
911 fn _k() -> usize {
912 KS::K()
913 }
914
915 #[inline(always)]
917 fn _bits() -> usize {
918 Self::_k() * 2
919 }
920
921 #[inline(always)]
923 fn _total_bits() -> usize {
924 std::mem::size_of::<T>() * 8 * LEN
925 }
926
927 #[inline(always)]
929 fn t_bits() -> usize {
930 std::mem::size_of::<T>() * 8
931 }
932
933 #[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 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 #[inline(always)]
979 fn set_slice_mut(&mut self, pos: usize, n_bases: usize, value: u64) {
980 let slice = IntKmer::<u64>::from_u64(value);
1029
1030 for i in 0..n_bases {
1032 let val = slice.get(i);
1033 self.set_mut(i + pos, val);
1034 }
1035 }
1036
1037 fn rc(&self) -> Self {
1039 let mut new_kmer = VarLenKmer::empty();
1040
1041 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 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 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#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1096pub struct K128;
1097
1098#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1100pub struct K112;
1101
1102#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1104pub struct K96;
1105
1106#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1108pub struct K80;
1109
1110#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1112pub struct K79;
1113#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1115pub struct K63;
1116
1117#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1119pub struct K62;
1120
1121#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1123pub struct K61;
1124
1125#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1127pub struct K60;
1128
1129#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1131pub struct K59;
1132
1133#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1135pub struct K58;
1136
1137#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1139pub struct K57;
1140
1141#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1143pub struct K56;
1144
1145#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1147pub struct K55;
1148
1149#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1151pub struct K54;
1152
1153#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1155pub struct K53;
1156
1157#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1159pub struct K52;
1160
1161#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1163pub struct K51;
1164
1165#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1167pub struct K50;
1168
1169#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1171pub struct K49;
1172
1173#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1175pub struct K48;
1176
1177#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1179pub struct K47;
1180
1181#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1183pub struct K46;
1184
1185#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1187pub struct K45;
1188
1189#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1191pub struct K44;
1192
1193#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1195pub struct K43;
1196
1197#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1199pub struct K42;
1200
1201#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1203pub struct K41;
1204
1205#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1207pub struct K40;
1208
1209#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1211pub struct K39;
1212
1213#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1215pub struct K38;
1216
1217#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1219pub struct K37;
1220
1221#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1223pub struct K36;
1224
1225#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1227pub struct K35;
1228
1229#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1231pub struct K34;
1232
1233#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1235pub struct K33;
1236
1237#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1239pub struct K32;
1240#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1242pub struct K31;
1243
1244#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1246pub struct K30;
1247
1248#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1250pub struct K29;
1251
1252#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1254pub struct K28;
1255
1256#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1258pub struct K27;
1259
1260#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1262pub struct K26;
1263
1264#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1266pub struct K25;
1267
1268#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1270pub struct K24;
1271
1272#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1274pub struct K23;
1275
1276#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1278pub struct K22;
1279
1280#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1282pub struct K21;
1283
1284#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1286pub struct K20;
1287
1288#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1290pub struct K19;
1291
1292#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1294pub struct K18;
1295
1296#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1298pub struct K17;
1299
1300#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1302pub struct K15;
1303
1304#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1306pub struct K14;
1307
1308#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1310pub struct K13;
1311
1312#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1314pub struct K12;
1315
1316#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1318pub struct K11;
1319
1320#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1322pub struct K10;
1323
1324#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1326pub struct K9;
1327
1328#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1330pub struct K7;
1331
1332#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1334pub struct K6;
1335
1336#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1338pub struct K5;
1339#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1341pub struct K4;
1342#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1344pub struct K3;
1345#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1347pub struct K2;
1348
1349#[derive(Debug, Hash, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, KmerSize)]
1351struct K0;
1352
1353#[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 fn check_kmer<T: Kmer + Debug>() {
1383 #[allow(non_snake_case)]
1384 let K = T::k();
1385
1386 let km = random_kmer::<T>();
1388
1389 let km2 = random_kmer::<T>();
1391 check_hd(km, km2);
1392
1393 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 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 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 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 let lt = km.extend_left(0);
1427 assert!(lt <= km);
1428
1429 let gt = km.extend_left(3);
1431 assert!(gt >= km);
1432
1433 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 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 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 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()); 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}