This changelog contains a top-level entry for each release with sections on new features, API changes and notable bug-fixes (not all bug-fixes will be listed).
Get to know SeqAn3 with our tutorials.
Please see the release announcement: https://www.seqan.de/announcing-seqan3/
See the porting guide for some help on porting: https://docs.seqan.de/seqan/3-master-user/howto_porting.html
See the documentation on API stability to learn about when API changes are allowed.
Note that 3.1.0 will be the first API stable release and interfaces in this release might still change.
seqan3::align_pairwise accepts a std::pair of sequences as input (#1913).seqan3::aligned_sequence concept by removing everything that needs write access to the object. We then added a new seqan3::writable_aligned_sequence concept which extends seqan3::aligned_sequence by the requirements that need write access (e.g. insert_gap).align_cfg::max_error to align_cfg::min_score and thus prepare it for non-edit scoring schemes in the future as well (#2021).seqan3::argument_parser::option_spec::ADVANCED to control what is displayed on the (advanced) help page:seqan3::argument_parser::add_sectionseqan3::argument_parser::add_subsectionseqan3::argument_parser::add_lineseqan3::argument_parser::add_list_item Note that other seqan3::argument_parser::option_specs like REQUIRED are ignored.seqan3::format_fasta accepts the file extenstion .fas as a valid extension for the FASTA format (#1599).CMakeLists.txt (#1475).seqan3::interleaved_bloom_filter, a data structure that efficiently answers set-membership queries for multiple bins (#920).seqan3::search_cfg::hit, which allows dynamic configuration of the hit strategy. (#1853).seqan3::search_cfg::on_result, which allows providing a custom callback for the search algorithm (#2019).seqan3::align_cfg::band is now renamed to seqan3::align_cfg::band_fixed_size and directly initialised with a seqan3::align_cfg::lower_diagonal and seqan3::align_cfg::upper_diagonal instead of seqan3::static_band. It also directly exposes the lower_diagonal and upper_diagonal as public members (#1873).seqan3::align_cfg::vectorise configuration has been renamed to seqan3::align_cfg::vectorised (#2026).seqan3::align_cfg::scoring configuration has been renamed to seqan3::align_cfg::scoring_scheme (#2027).seqan3::align_cfg::result configuration has been replaced by seqan3::align_cfg::output_* options. The default behaviour when not specifying any output configuration has changed from computing only the score to computing everything. Please read the linked documentation above carefully to understand all implied changes (#2024) & (#2035).seqan3::align_cfg::gap configuration has been replaced by seqan3::align_cfg::gap_cost_affine (#2037).default_constructible to default_initializablereadable to indirectly_readablewritable to indirectly_writable (#1860).seqan3::begin(), seqan3::end(), seqan3::cbegin(), seqan3::cend(), seqan3::size(), seqan3::empty() functions have been deprecated: Use std::ranges::{begin|end|cbegin|cend|size|empty}() instead (#1663).seqan3::forward_range. Use std::ranges::borrowed_range instead (#2038).seqan3::views::minimiser, a view that computes the minimum in a window shifted over a range of comparable values. (#1654).seqan3::views::minimiser_hash, a view that computes the minimisers of a range of type seqan3::semialphabet. (#1721).seqan3::views:trim has been renamed to seqan3::views:trim_quality.seqan3::search from search/algorithm/ to search/ (#1696).seqan3::search_result_range returns now a seqan3::search_result which unifies the interface for all search instances, e.g. using an index over a single text or a text collection (#1706).seqan3::search_cfg::max_error and seqan3::search_cfg::max_error_rate which could be seqan3::search_cfg::total, seqan3::search_cfg::substitution, seqan3::search_cfg::insertion or seqan3::search_cfg::deletion to seqan3::search_cfg::max_error_total, seqan3::search_cfg::max_error_substitution, seqan3::search_cfg::max_error_insertion or seqan3::search_cfg::max_error_deletionwhich can be seqan3::search_cfg::error_count or seqan3::search_cfg::error_rate.seqan3::search_cfg::all to seqan3::search_cfg::hit_all seqan3::search_cfg::best to seqan3::search_cfg::hit_single_best seqan3::search_cfg::all_best to seqan3::search_cfg::hit_all_best seqan3::search_cfg::strata{5} to seqan3::search_cfg::hit_strata{5}seqan3::search_cfg::mode does not exist anymore. You can replace it by directly using one of the above mentioned "hit strategy" configuration elements (#1639).seqan3::search_cfg::output does not exist anymore. It has been replaced by the individual configuration elements
seqan3::bi_fm_index_cursor::to_rev_cursor() and seqan3::bi_fm_index::rev_cursor() (#1892).seqan3::align_cfg::parallel configuration element, std::thread::hardware_concurrency() many threads were always spawned. This is now fixed and only the specified number of threads will be spawned (#1854).score_type is prevented with a static assert, since gaps and mismatches have negative scores and thus need a signed score type (#1891).Long option identifiers and their value must be separated by a space or equal sign =. Handling this restriction resolves the ambiguity if one long option identifier is the prefix of another (#1792).
Valid short id value pairs: -iValue, -i=Value, -i Value Valid long id value pairs: --id=Value, --id Value (prohibited now: --idValue)
seqan3::field::cigar was added to the default fields for reading and writing alignment files (#1642). This has the following impact:seqan3::alignment_file_output{"foo.sam"} = seqan3::alignment_file_input{"bar.sam"};seqan3::alignment_file_output now accepts seqan3::field::cigar and seqan3::field::alignment although they store redundant information. For the SAM/BAM format this ambiguity is handled by favoring the CIGAR information at all times if present. Note that this breaks your code if you have not selected custom fields and used structural bindings!seqan3::fm_index_cursor::extend_right(), seqan3::bi_fm_index_cursor::extend_right() and seqan3::bi_fm_index_cursor::extend_left() functions handle c-style strings without including the null character (#1588).seqan3::fm_index and seqan3::bi_fm_index construct the index correctly if a collection with a single text is passed as input (#1892).seqan3::views::kmer_hash (#1722).operator[](difference_type const n) of the iterator of the seqan3::views::kmer_hash is declared const and returns value n steps after the current position without jumping to that position (#1756).Note that 3.1.0 will be the first API stable release and interfaces in this release might still change.
seqan3::semialphabet_any, a semi-alphabet that type erases all other semi-alphabets of the same size (#981).seqan3::dna3bs, an alphabet that mimics a bisulfite-treated dna4 sequence (#1191).seqan3::align_cfg::result configuration (#1340).seqan3::align_pairwise can be parallelised using theseqan3::align_cfg::parallel configuration (#1379, #1444).seqan3::input_file_validator and seqan3::output_file_validator (#863).seqan3::value_list_validator is now constructible from a range or a parameter pack (#1298).seqan3::argument_parser::add_option (and add_positional_option) calls allow enum types when using the seqan3::enumeration_names customisation point (#1196).find_package(SeqAn3) is now case-insensitive and always populates SEQAN3_* variables in all upper-case (#1427).seqan3::lzcnt, seqan3::tzcnt, and seqan3::popcount for bit manipulation (#1141).seqan3::type_list and type packs (#1204, #1214, #1273).seqan3::upcast and seqan3::upcast_signed (#1190).seqan3::field::cigar into a vector over seqan3::cigar is supported via seqan3::alignment_file_input (#1192).seqan3::field::cigar into a vector over seqan3::cigar is supported via seqan3::alignment_file_output (#1192).seqan3::view::async_input_buffer (#1205).seqan3::views::kmer_hash, a view that computes hash values of an alphabet sequence given a seqan3::shape (#946).seqan3::views::to, a view that returns a container created from a range by copying all elements (#1033).seqan3::dynamic_bitset, a container that stores single bits and has a dynamic size (#1153).seqan3::views::translate_join, analogue to seqan3::views::translate but returns a flattened range (#1171).seqan3::views::to_simd, a view that transforms a range of ranges into chunks of seqan3::simd vectors (#1190).seqan3::views::as_const, a view that provides only const & to elements of the underlying range (#1410).seqan3::views::move, a view that turns lvalue-references into rvalue-references (#1410).seqan3::views::all to seqan3::views::type_reduce (#1410).std::to_chars overload for floating point data types in our seqan3/std/from_chars header (#1160).seqan3::custom::. Please see About Customisation (#1225).snake_case style (e.g. seqan3::WritableAlphabet -> seqan3::writable_alphabet)! This change was motivated by the decision of the ISO C++ committee to also use snake case everywhere (#1235).seqan3::cigar alphabet is not an seqan3::alphabet anymore but only a seqan3::semialphabet (#1285).seqan3::value_list_validator is not constructible from a std::initialiser_list any more (e.g. seqan3::value_list_validator{{1,2,3}} does not work, use seqan3::value_list_validator{1,2,3} instead) (#1298).input_file_validator to input_file_validator<>) (#863).validator can validate has been renamed from value_type to option_value_type (#1394).find_package(SEQAN3 3.0.1) requires at least SeqAn3 with a version of >= 3.0.1 and < 4.0.0) (#1425).SEQAN3_VERSION_STRING defined by find_package(SEQAN3) was renamed to SEQAN3_VERSION (#1425).type_list header has moved: If you included <seqan3/core/type_list.hpp> you need to change the path to <seqan3/core/type_list/type_list.hpp> (#1204).seqan3::views:zip(), for input we will implement unzip() in the future (#1398 #1412).seqan3::field::flag of SAM/BAM input and output is now an enum instead of an integer, see seqan3::sam_flag (#1390).seqan3::field names are deprecated. Use the lower case field names instead. You can easily find and replace all occurrences by the following regex: find field::([A-Z_]+) replace field::\L$1 (#1421).seqan3::sequence_file_input<traits_t, fields_t, formats_t, char> to seqan3::sequence_file_input<traits_t, fields_t, formats_t>. Before this change, setting the char type gave the impression that also streams over wide characters are supported which is not the case yet (#1400).seqan3::concatenated_sequences::data() function has been deprecated: Use seqan3::concatenated_sequences::raw_data() instead (#1208).seqan3::to_char must always return a built-in character type (#1285).seqan3/range/view has be renamed to seqan3/range/views (#1251).seqan3::view has been renamed to seqan3::views (#1251).seqan3::fm_index or seqan3::bi_fm_index you will need to add the alphabet type as first parameter and pass a seqan3::text_layout instead of a bool to indicate the text layout (single, collection). For example, fm_index<false> index{text} where text is of type dna4_vector needs to be changed to fm_index<dna4, text_layout::single> index{text} (#1222).construct() method of the (bi_)fm_index is now private: Use the constructor seqan3::fm_index::fm_index(text_t && text) or seqan3::bi_fm_index::bi_fm_index(text_t && text) instead (#1222).seqan3::fm_index::char_type member was renamed to seqan3::fm_index::alphabet_type The same applies for the seqan3::bi_fm_index (#1433).seqan3::fm_index_cursor::index_char_type member was renamed to seqan3::fm_index_cursor::index_alphabet_type The same applies for the seqan3::bi_fm_index_cursor (#1433).seqan3::gap_decorator does not cause assert anymore (#1109).seqan3::argument_parser is restricted to alpha-numeric characters and _ and - (#1133).seqan3::fm_index and seqan3::bi_fm_index now work properly (#1144).seqan3::fm_index and seqan3::bi_fm_index constructed from a text collection containing a single text now returns the correct result (#1316).seqan3::views::take is sized if the underlying range is sized (#1146).This is the initial release of SeqAn3. It is an entirely new library so there is no changelog that covers the differences to SeqAn2.
Note that 3.1.0 will be the first API stable release and interfaces in this release might still change.