zoe 0.0.31

A nightly library for viral genomics
Documentation
#![doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/README.md"))]
#![warn(clippy::all, clippy::pedantic)]
#![allow(
    clippy::module_name_repetitions,
    clippy::similar_names,
    clippy::wildcard_imports,
    clippy::enum_glob_use,
    clippy::comparison_chain,
    stable_features
)]
#![cfg_attr(test, feature(test))]
#![feature(portable_simd, try_trait_v2, cold_path, int_format_into, doc_cfg)]
// Stabilized (in at least one channel) but left here in case it helps backwards
// compatibility. Can be removed in the future.
#![feature(const_fn_floating_point_arithmetic, let_chains, lazy_cell, slice_as_chunks)]
#![forbid(incomplete_features)]
#![warn(rustdoc::broken_intra_doc_links)]

/// Mathematical utilities.
pub mod math;

pub mod alignment;
/// Composition and consensus functions.
pub mod composition;
pub mod data;
pub mod distance;
pub mod kmer;

pub mod search;

#[cfg(feature = "rand")]
/// Generate sequences and other data.
pub(crate) mod generate;
pub mod iter_utils;

/// Common structures and traits re-exported for convenience.
///
/// As a quick way to import the most commonly used *Zoe* structs and traits,
/// you may include `use zoe::prelude::*` in a Rust script.
pub mod prelude {
    pub use crate::{
        alignment::{AsSeqSrc, IntoSeqSrc, PairwiseSequence, ProfileSets, SeqSrc},
        composition::{AlignmentComposition, CreateConsensus, GcContent, NucleotideCounts, ToBaseCounts},
        data::{
            StdForSequences,
            err::OrFail,
            records::{
                fasta::FastaReader,
                fastq::{FastQ, FastQReader, FastQView, FastQViewMut},
            },
            types::{
                amino_acids::{AminoAcids, AminoAcidsView, AminoAcidsViewMut},
                nucleotides::{
                    CheckNucleotides, GetCodons, GetCodonsMut, IsValidDNA, Nucleotides, NucleotidesView, NucleotidesViewMut,
                    RecodeDNAStrat, RecodeNucleotides, RefineDNAStrat, RetainNucleotides, Translate,
                },
                phred::{QualityScores, QualityScoresView, QualityScoresViewMut, QualityStats},
            },
            views::{
                AsView, AsViewMut, DataView, DataViewMut, Len, Restrict, Slice, SliceCopy, SliceMut, ToOwnedData, ToView,
            },
        },
        kmer::{EncodedKmerCollection, FindKmers, FindKmersInSeq, KmerCounter, KmerEncoder, KmerSet},
        search::{ByteSubstring, ByteSubstringMut},
    };

    #[cfg(feature = "rand")]
    pub use crate::generate::rand_sequence;
}

pub(crate) use crate::data::extension::simd;

mod private {
    #[cfg(feature = "dev-phmm")]
    use crate::alignment::phmm::{
        DomainPhmm, GlobalPhmm, LocalPhmm, SemiLocalPhmm,
        views::{
            DomainPhmmView, DomainPhmmViewMut, GlobalPhmmView, GlobalPhmmViewMut, LocalPhmmView, LocalPhmmViewMut,
            SemiLocalPhmmView, SemiLocalPhmmViewMut,
        },
    };
    use crate::{
        data::{
            cigar::{Cigar, CigarView, CigarViewMut},
            sam::{SamData, SamDataView, SamDataViewMut},
        },
        prelude::*,
    };
    use std::{
        hash::BuildHasher,
        simd::{Simd, SimdElement},
    };

    #[cfg(feature = "dev-generic-fasta")]
    use crate::data::views::{AssocViewMutType, AssocViewType};

    macro_rules! sealed {
        ($($t:ty),* $(,)?) => { $( impl Sealed for $t {} )* };
    }

    pub trait Sealed {}
    sealed!(String, &String, &str, str);
    impl<T> Sealed for Vec<T> {}
    impl Sealed for Box<[u8]> {}
    impl<T> Sealed for [T] {}
    impl<T> Sealed for &[T] {}
    impl<T> Sealed for &mut [T] {}
    impl<T, const N: usize> Sealed for &[T; N] {}
    impl<T, const N: usize> Sealed for [T; N] {}
    impl<Q: ?Sized> Sealed for crate::search::RangeSearch<'_, Q> {}
    impl<T: SimdElement, const N: usize> Sealed for Simd<T, N> {}
    impl<const MAX_LEN: usize, E: KmerEncoder<MAX_LEN>, S: BuildHasher> Sealed for KmerCounter<MAX_LEN, E, S> {}
    impl<const MAX_LEN: usize, E: KmerEncoder<MAX_LEN>, S: BuildHasher> Sealed for KmerSet<MAX_LEN, E, S> {}

    #[cfg(feature = "dev-generic-fasta")]
    sealed!(
        crate::data::fasta::generic::Taxon,
        crate::data::fasta::generic::TaxonView<'_>,
        crate::data::fasta::generic::TaxonViewMut<'_>,
    );

    #[cfg(feature = "dev-generic-fasta")]
    impl<S> Sealed for crate::data::fasta::generic::Fasta<S> {}

    #[cfg(feature = "dev-generic-fasta")]
    impl<S: AssocViewType> Sealed for crate::data::fasta::generic::FastaView<'_, S> {}

    #[cfg(feature = "dev-generic-fasta")]
    impl<S: AssocViewMutType> Sealed for crate::data::fasta::generic::FastaViewMut<'_, S> {}

    #[cfg(feature = "dev-generic-fasta")]
    impl<M, S> Sealed for crate::data::fasta::generic::FastaAnnot<M, S> {}

    #[cfg(feature = "dev-generic-fasta")]
    impl<M: AssocViewType, S: AssocViewType> Sealed for crate::data::fasta::generic::FastaAnnotView<'_, M, S> {}

    #[cfg(feature = "dev-generic-fasta")]
    impl<M: AssocViewMutType, S: AssocViewMutType> Sealed for crate::data::fasta::generic::FastaAnnotViewMut<'_, M, S> {}

    #[cfg(feature = "dev-phmm")]
    impl<T, const S: usize> Sealed for GlobalPhmm<T, S> {}
    #[cfg(feature = "dev-phmm")]
    impl<T, const S: usize> Sealed for GlobalPhmmView<'_, T, S> {}
    #[cfg(feature = "dev-phmm")]
    impl<T, const S: usize> Sealed for GlobalPhmmViewMut<'_, T, S> {}
    #[cfg(feature = "dev-phmm")]
    impl<T, const S: usize> Sealed for LocalPhmm<T, S> {}
    #[cfg(feature = "dev-phmm")]
    impl<T, const S: usize> Sealed for LocalPhmmView<'_, T, S> {}
    #[cfg(feature = "dev-phmm")]
    impl<T, const S: usize> Sealed for LocalPhmmViewMut<'_, T, S> {}
    #[cfg(feature = "dev-phmm")]
    impl<T, const S: usize> Sealed for SemiLocalPhmm<T, S> {}
    #[cfg(feature = "dev-phmm")]
    impl<T, const S: usize> Sealed for SemiLocalPhmmView<'_, T, S> {}
    #[cfg(feature = "dev-phmm")]
    impl<T, const S: usize> Sealed for SemiLocalPhmmViewMut<'_, T, S> {}
    #[cfg(feature = "dev-phmm")]
    impl<T, const S: usize> Sealed for DomainPhmm<T, S> {}
    #[cfg(feature = "dev-phmm")]
    impl<T, const S: usize> Sealed for DomainPhmmView<'_, T, S> {}
    #[cfg(feature = "dev-phmm")]
    impl<T, const S: usize> Sealed for DomainPhmmViewMut<'_, T, S> {}

    sealed!(
        AminoAcids,
        AminoAcidsView<'_>,
        AminoAcidsViewMut<'_>,
        Nucleotides,
        NucleotidesView<'_>,
        NucleotidesViewMut<'_>,
        FastQ,
        FastQView<'_>,
        FastQViewMut<'_>,
        QualityScores,
        QualityScoresView<'_>,
        QualityScoresViewMut<'_>,
        Cigar,
        CigarView<'_>,
        CigarViewMut<'_>,
        SamData,
        SamDataView<'_>,
        SamDataViewMut<'_>,
    );
    sealed!(f32, f64, u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize);
}

/// The default SIMD lanes for *Zoe*.
const DEFAULT_SIMD_LANES: usize = 32;