Skip to content

Releases: CDCgov/zoe

Zoe v0.0.28

29 Apr 15:31

Choose a tag to compare

Release Notes for v0.0.28 - 2026-04-29

Added

  • Similar to the OrFail trait for Result, a Fail trait has been introduced to handle errors directly
  • Added *_mapped versions for many string/byte search functions, which search a lazily-mapped haystack
  • Added as_map accessor to convert ByteIndexMap to ByteMap
  • Nucleotides and AminoAcids (and view types) can now be converted into Vec, slices, and Cow using From
  • NucleotidesView, AminoAcidsView, and QualityScoresView now have inherent slice methods offering a longer lifetime of the returned view

Changed

  • LocalProfiles and SharedProfiles now can hold either a borrowed or an owned sequence, enabling sequences and profiles to be stored in the same struct without becoming self-referential
  • CigletIterator now yields empty ciglets when a CIGAR string contains an explicit increment that is 0. A missing increment field ends the iterator early
  • find_mapped_match_simd better handles needles with a single repeating byte, but now only supports lane counts greater than 2

Fixed

  • Fixed incorrect ranges returned by Alignment::to_reverse and Alignment::make_reverse
  • Methods in StatesSequence and StatesSequenceMut now properly skip empty Ciglets (with an increment of 0)
  • Pre-alignment filter sneaky_snake now properly handles inputs with length differences greater than provided threshold.
  • Subsequent calls to next_back in CigletIterator now properly return None after invalid state is reached
  • Equality comparisons between Cigar and AlignmentStates now properly return false for an overflowing increment
  • Fixes the potential of overflow in hamming

Zoe v0.0.27

15 Apr 17:02

Choose a tag to compare

Release Notes for v0.0.27 - 2026-04-15

Added

  • Added ByteMap for defining and representing maps from u8 values to other u8 values (e.g., for sanitization/recoding), as well as many pre-defined maps
  • Added ByteValidator for defining alphabets or subsets of valid bytes
  • Added SanitizeBase extension trait for u8 to perform DNA validation, recoding, and refinement on a single byte
  • Added find_start_codon as well as a modified string search routine supporting lazy transformations of the haystack (find_mapped_match_simd)
  • Added to_aa_iter_exact and to_aa_iter_exact_with for amino acid translation that does not include a partial codon for codons with less than 3 bases at the end of a sequence
  • Added find_next_aa and find_next_aa_in_frame to RangeSearch
  • Added find_byte to ByteSubstring (for searching strings and for use with RangeSearch)
  • Added as_mut_vec to AlignmentStates, Nucleotides, and AminoAcids to enable custom editing
  • Added push, starts_with, and ends_with to Nucleotides and AminoAcids
  • Implemented Extend for Nucleotides and AminoAcids
  • Added AcgtNoGapsUc strategy for retaining/recoding DNA

Changed

  • Renamed from_filename to from_path for Zoe's readers, deprecating the old functions
  • Renamed with_file_context to with_path_context for errors, deprecating the old functions
  • Renamed is_valid_codon to is_resolvable_codon in CodonExtension
  • is_amino_acid now behaves the same as is_known_amino_acid, and is_known_amino_acid is removed
  • RangeSearch now contains a generic with the original type to allow search methods to restrict the types of data they are used on
  • StdGeneticCode now translates codons with mixed - and . bytes to .
  • OrFail is now only implemented on errors with a 'static lifetime
  • retain_by_recoding now uses ByteMap, and retain_by_validation now uses ByteValidator
  • Implemented Copy for several immutable views

Removed

  • Removes open_nonempty_file, which produces incorrect results for piped inputs
  • itoa is no longer a dependency of Zoe.

Fixes

  • Fixes a bug where pipes are interpreted as empty files with FastQReader::from_filename (and similarly for FastaReader and SAMReader)
  • Fixes a bug in p_distance_acgt where longer sequences could be normalized incorrectly.
  • Fixes a bug in physiochemical distance to ensure invalid sequences are not comparable

Zoe v0.0.26

06 Mar 21:06

Choose a tag to compare

Release Notes for v0.0.26 - 2026-03-06

Added

  • Adds the sneaky_snake pre-alignment filter for imposing an edit distance threshold
  • Added convenience methods for checking the variant of SeqSrc
  • Implemented to_reverse and make_reverse for MaybeAligned<Alignment<_>>
  • Implemented SequenceReadable for profile sets
  • Implemented PartialOrd for Alignment and MaybeAligned

Changed

  • Development features now only use internal documentation on GitHub
  • Generalized sampling methods to accept any random generator (behind rand feature gate)
  • Updated to use rand v0.10.0, which includes breaking changes (behind rand feature gate)

Fixed

  • Fixed the constructors for SharedProfiles to match those of LocalProfiles

Zoe v0.0.25

04 Feb 18:28

Choose a tag to compare

Release Notes for v0.0.25 - 2026-02-04

Added

  • Adds methods to pad and extend Nucleotides and AminoAcids

Changed

  • Zoe's MSRV is now 1.95 (nightly).

Fixes

  • Fixes Zoe to use the latest sync'd portable SIMD in Rust nightly 1.95. For earlier versions, try Rust nightly 1.94.

Zoe v0.0.24

26 Jan 18:32

Choose a tag to compare

Release Notes for v0.0.24 - 2026-01-26

Added

  • Stabilized the dev-3pass feature for performing a memory-efficient three-pass local alignment routine, as well as other helper algorithms
  • Added WithErrorContext and ResultWithErrorContext traits using the new ErrorWithContext struct for updated error-handling
  • Added prepend_state, prepend_ciglet, and prepend_inc_op to AlignmentStates
  • Added get_first_codon, get_last_codon, and get_tail_codon to GetCodons trait, with mutable equivalents in GetCodonsMut
  • Added CodonExtension trait for [u8; 3] with convenience codon characterization methods
  • Added StatesSequenceMut trait and AlignmentStates::as_mut_slice to provide mutable access to ciglets while iterating/processing
  • Added ToCigletIterator trait, implemented on structs which can be converted to an iterator of ciglets
  • Added LenInAlignment trait, replacing the previous match_len and offering a more flexible API
  • Added methods and implementations to iterate over CIGAR views
  • Added to_alignment to convert SamData to Alignment
  • Added ability to push tags to SamTags
  • Added InspectCigar for checking for indels in CIGAR strings or AlignmentStates
  • Added VARIANTS constants and index comparison methods for pHMMs (behind dev-phmm feature gate)
  • Added row and column accessors to TransitionParams (behind dev-phmm and alignment-diagnostics feature gates)

Changed

  • Modified alignment methods on profiles to take a SeqSrc enum as an argument, allowing the returned alignment to properly reflect which sequence is the query and which is the reference
  • Renamed alignment methods/functions to use the terminology sw instead of smith_waterman and align instead of alignment
  • Alignment methods returning indices or ranges now return specialized structs
  • The arbitrary module now uses specification structs to allow various restrictions to be enforced when generating Zoe data types. See the module level documentation for more details
  • Updated error handling logic and style for OrFail trait
  • Standalone function zoe::data::err::open_nonempty_file is now public
  • SharedProfiles no longer holds the sequence as Box<u8>, instead using &'a [u8]
  • Condensed the PhmmParamKind variants in the visit_params API (behind dev-phmm feature gate)

Fixes

  • Fixed spelling of filter_to_dna_uanligned to filter_to_dna_unaligned in trait ToDNA
  • Fixed bug for parsing -128 in a weight matrix using MatParser

Removed

  • Removed the match_len method from CIGAR strings in favor of LenInAlignment
  • Removed CheckedCigar in favor of LenInAlignment (checked methods are behind the fuzzing feature gate)

Zoe v0.0.23

24 Nov 15:49

Choose a tag to compare

Release Notes for v0.0.23 - 2025-11-24

Added

  • Added nw_scalar_score and nw_scalar_alignment for performing global sequence alignment
  • Added random downsampling for iterators of known and unknown lengths in iter_utils::sampling
  • Added the method process_results to more robustly work with iterators of results
  • Added get_aligned_query, similar to get_aligned_seqs but returning only the query sequence
  • Added additional getters and convenience methods on SamTags and SamTagValue
  • Added to_eq_x to Alignment and AlignmentStates, which converts M to either = or X in the alignment
  • Added SequenceReadable getter trait to record types and sequence types
  • Added from_ciglets_unchecked and from_cigar_unchecked to AlignmentStates
  • Added decode_iter to KmerEncoder
  • Added nw_score_from_path for rescoring a global alignment (behind alignment-diagnostics feature gate)
  • Introduced the AlignmentAndSeqs and AminoAcidsIupacX arbitrary wrappers (behind fuzzing feature gate)
  • Added visit_params methods to pHMMs as a diagnostic tool for inspecting the parameters that are visited along a given path (behind dev-phmm and alignment-diagnostics feature gates)
  • Added the ability to remove layers from a pHMM (behind dev-phmm and alignment-diagnostics feature gates)

Changed

  • TryFrom for AlignmentStates now merges adjacent ciglets with the same operation
  • An iterator of ciglets now collects into a Result<AlignmentStates, CigarError> instead of AlignmentStates, and performs merging as above
  • The view traits have been refactored so that all associated types are defined in the ViewAssocTypes trait
  • reborrow_view has been added to allow invariant lifetimes to be shortened in views
  • Vec<u8>, &[u8], and &mut [u8] now implement the various view traits
  • Pairs of methods accepting encoded and decoded k-mers have been merged
  • KmerCounter has had its methods renamed from insert to tally
  • Iterators over encoded k-mers from KmerSet now return owned values
  • KmerCollectionContains is renamed to FindKmersInSeq
  • The kmer module has been restructured to simplify the docs
  • Implemented std::fmt::Binary for ThreeBitEncodedKmer, and added it as a trait bound to AnyInt
  • sw_score_from_path and sw_scalar_alignment_override are now behind the alignment-diagnostics feature gate
  • Modified the behavior of AlignmentArbitrary and AlignmentStatesArbitrary (behind fuzzing feature gate)
  • Refactored the organization/visibility of pHMM code; modified SamHmmParser constructors; applied compact bit representation for Viterbi traceback; switched to eager evaluation for next_index and prev_index (behind dev-phmm feature gate)
  • The inner fields of SAMReader and FastQReader are now properly private, and SliceRange is properly public

Fixed

  • The fuzzing feature now successfully compiles even when dev-phmm is not enabled
  • Fixed another NaN error that would occur when certain transitions in a pHMM were zero probability (behind dev-phmm feature gate)

Removed

  • Removed checked methods from KmerEncoder (they only provided partial checking and proved not useful)

Zoe v0.0.22

25 Sep 19:44

Choose a tag to compare

Release Notes for v0.0.22 - 2025-09-25

Added

  • Added banded Smith Waterman implementation as a more memory-efficient alternative for long sequence alignment
  • Added HeaderReadable getter trait for record types
  • Added slice_to_ref_range method for Alignment, in order to slice/clip an alignment to a desired portion of the reference
  • Added CheckedCigar trait for summing the lengths for operations consuming the query/reference (behind fuzzing feature fate)
  • Implemented Arbitrary for AlignmentStates and Alignment along with additional wrapper types (behind fuzzing feature gate)
  • Added Viterbi algorithm for DomainPhmm (behind dev-phmm feature gate)
  • Implemented Arbitrary for SemiLocalPhmm and DomainPhmm (behind fuzzing and dev-phmm feature gates)
  • Added sw_scalar_alignment_override for more flexible testing of dynamic programming alignment algorithms (behind fuzzing feature gate)

Changed

  • The wrapper types for generating arbitrary CIGAR strings have been modified (behind fuzzing feature gate)
  • pHMM types and algorithms now rely on the more general PhmmNumber trait instead of Float (behind dev-phmm feature gate)

Fixes

  • ProfileSets is re-exported in the prelude
  • Fixed the initialization of the first match score for the semilocal Viterbi algorithm (behind dev-phmm feature gate)
  • Fixed the calculation of the end score for semilocal Viterbi algorithm to allow passing through the END state (behind dev-phmm feature gate)
  • Avoid error with NaN that may appear when using the score_from_path function on local or domain pHMMs (behind dev-phmm feature gate)

Zoe v0.0.21

05 Sep 20:30

Choose a tag to compare

Release Notes for v0.0.21 - 2025-09-05

Added

  • Added sw_simd_score_ends for getting the score and end coordinates of the alignment
  • Added byte index map for amino acids, BLOSUM scoring matrices, and PAM scoring matrices
  • Added display implementation for WeightMatrix
  • Added get_subset to WeightMatrix for subsetting a weight matrix with a different alphabet
  • Added parse_matrix for parsing a WeightMatrix from a file at compile time
  • Added accessor byte_keys() for ByteIndexMap
  • Added unchecked constructors for ScalarProfile and StripedProfile
  • Added SamDataView and SamDataViewMut
  • Added map attribute syntax to define_whichever and impl_traits, so that a map can be applied when implementing iterator
  • Added dev-3pass feature gate for additional alignment functions that return coordinates, as well as a three-pass alignment function with reduced memory usage
  • Added score_from_path and viterbi for LocalPhmm (behind dev-phmm feature gate)
  • Added DomainPhmm, along with score_from_path for it (behind dev-phmm feature gate)
  • Added SemiLocalPhmm, along with score_from_path and viterbi for it (behind dev-phmm feature gate)

Changed

  • MaybeAligned now can hold other types besides Alignment, and score-only functions now return MaybeAligned<u32>
  • into_biased_matrix has been renamed to to_biased_matrix and takes &self
  • WeightMatrix is now imported under data::matrices in addition to data
  • WeightMatrix now has an additional lifetime generic for the ByteIndexMap
  • WeightMatrix no longer implements Copy
  • The @ symbol is no longer included at the beginning of a header in a FastQ record (the reader strips it, and the display implementation re-adds it)
  • Added tags field to SamData, as well as the ability to opt out of storing the tags in SamReader
  • Changed Debug impl of CigarViewMut and derived more traits
  • Various Smith-Waterman profile set methods have been moved to trait methods
    for ProfileSets.
  • Updated traceback in viterbi to not use nested vecs (behind dev-phmm feature gate)
  • Removed as_u32 from Alignment, since the integer type for scores has been standardized

Fixes

  • Fixes a bug in AlignmentStates::add_ciglet() for inc > 1