SeqAn3 3.4.0-rc.1
The Modern C++ library for sequence analysis.
Loading...
Searching...
No Matches
alignment_algorithm.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2006-2024 Knut Reinert & Freie Universität Berlin
2// SPDX-FileCopyrightText: 2016-2024 Knut Reinert & MPI für molekulare Genetik
3// SPDX-License-Identifier: BSD-3-Clause
4
10#pragma once
11
12#include <iterator>
13#include <memory>
14#include <optional>
15#include <ranges>
16#include <type_traits>
17
35
36namespace seqan3::detail
37{
38
72template <typename config_t, typename... algorithm_policies_t>
74 public invoke_deferred_crtp_base<algorithm_policies_t, alignment_algorithm<config_t, algorithm_policies_t...>>...
75{
76private:
79
90 template <typename alignment_algorithm_t = alignment_algorithm>
91 static auto _alignment_column_t() -> decltype(std::declval<alignment_algorithm_t>().current_alignment_column());
92
96 using alignment_column_iterator_t = std::ranges::iterator_t<alignment_column_t>;
99
100 static_assert(!std::same_as<alignment_result_t, empty_type>, "Alignment result type was not configured.");
101
108 empty_type>;
115 empty_type>;
116
117public:
121 constexpr alignment_algorithm() = default;
122 constexpr alignment_algorithm(alignment_algorithm const &) = default;
123 constexpr alignment_algorithm(alignment_algorithm &&) = default;
124 constexpr alignment_algorithm & operator=(alignment_algorithm const &) = default;
127
136 explicit constexpr alignment_algorithm(config_t const & cfg) :
137 invoke_deferred_crtp_base<algorithm_policies_t, alignment_algorithm<config_t, algorithm_policies_t...>>{cfg}...,
138 cfg_ptr{std::make_shared<config_t>(cfg)}
139 {
140 this->scoring_scheme = seqan3::get<align_cfg::scoring_scheme>(*cfg_ptr).scheme;
141 this->initialise_alignment_state(*cfg_ptr);
142 }
144
190 template <indexed_sequence_pair_range indexed_sequence_pairs_t, typename callback_t>
191 requires (!traits_t::is_vectorised) && std::invocable<callback_t, alignment_result_t>
192 void operator()(indexed_sequence_pairs_t && indexed_sequence_pairs, callback_t && callback)
193 {
194 using std::get;
195
196 for (auto && [sequence_pair, idx] : indexed_sequence_pairs)
197 compute_single_pair(idx, get<0>(sequence_pair), get<1>(sequence_pair), callback);
198 }
199
201 template <indexed_sequence_pair_range indexed_sequence_pairs_t, typename callback_t>
202 requires traits_t::is_vectorised && std::invocable<callback_t, alignment_result_t>
203 void operator()(indexed_sequence_pairs_t && indexed_sequence_pairs, callback_t && callback)
204 {
205 assert(cfg_ptr != nullptr);
206
207 static_assert(simd_concept<typename traits_t::score_type>, "Expected simd score type.");
208 static_assert(simd_concept<typename traits_t::trace_type>, "Expected simd trace type.");
209
210 // Extract the batch of sequences for the first and the second sequence.
211 auto sequence1_range = indexed_sequence_pairs | views::elements<0> | views::elements<0>;
212 auto sequence2_range = indexed_sequence_pairs | views::elements<0> | views::elements<1>;
213
214 // Initialise the find_optimum policy in the simd case.
215 this->initialise_find_optimum_policy(sequence1_range,
216 sequence2_range,
217 this->scoring_scheme.padding_match_score());
218
219 // Convert batch of sequences to sequence of simd vectors.
220 auto simd_sequences1 = convert_batch_of_sequences_to_simd_vector(sequence1_range);
221 auto simd_sequences2 = convert_batch_of_sequences_to_simd_vector(sequence2_range);
222
223 max_size_in_collection = std::pair{simd_sequences1.size(), simd_sequences2.size()};
224 // Reset the alignment state's optimum between executions of the alignment algorithm.
225 this->alignment_state.reset_optimum();
226
227 compute_matrix(simd_sequences1, simd_sequences2);
228
229 make_alignment_result(indexed_sequence_pairs, callback);
230 }
232
233private:
247 template <typename sequence_range_t>
248 constexpr auto convert_batch_of_sequences_to_simd_vector(sequence_range_t & sequences)
249 {
250 assert(static_cast<size_t>(std::ranges::distance(sequences)) <= traits_t::alignments_per_vector);
251
252 using simd_score_t = typename traits_t::score_type;
253
254 std::vector<simd_score_t, aligned_allocator<simd_score_t, alignof(simd_score_t)>> simd_sequence{};
255
256 for (auto && simd_vector_chunk : sequences | views::to_simd<simd_score_t>(this->scoring_scheme.padding_symbol))
257 for (auto && simd_vector : simd_vector_chunk)
258 simd_sequence.push_back(std::move(simd_vector));
259
260 return simd_sequence;
261 }
262
280 template <std::ranges::forward_range sequence1_t, std::ranges::forward_range sequence2_t, typename callback_t>
281 constexpr void
282 compute_single_pair(size_t const idx, sequence1_t && sequence1, sequence2_t && sequence2, callback_t & callback)
283 {
284 assert(cfg_ptr != nullptr);
285
286 if constexpr (traits_t::is_debug)
287 initialise_debug_matrices(sequence1, sequence2);
288
289 // Reset the alignment state's optimum between executions of the alignment algorithm.
290 this->alignment_state.reset_optimum();
291
292 if constexpr (traits_t::is_banded)
293 {
294 using seqan3::get;
295 // Get the band and check if band configuration is valid.
296 auto const & band = get<align_cfg::band_fixed_size>(*cfg_ptr);
297 check_valid_band_parameter(sequence1, sequence2, band);
298 auto && [subsequence1, subsequence2] = this->slice_sequences(sequence1, sequence2, band);
299 // It would be great to use this interface here instead
300 compute_matrix(subsequence1, subsequence2, band);
301 make_alignment_result(idx, subsequence1, subsequence2, callback);
302 }
303 else
304 {
305 compute_matrix(sequence1, sequence2);
306 make_alignment_result(idx, sequence1, sequence2, callback);
307 }
308 }
309
326 template <typename sequence1_t, typename sequence2_t>
327 constexpr void check_valid_band_parameter(sequence1_t && sequence1,
328 sequence2_t && sequence2,
330 {
331 static_assert(config_t::template exists<align_cfg::band_fixed_size>(),
332 "The band configuration is required for the banded alignment algorithm.");
333
335 static_assert(std::is_signed_v<diff_type>, "Only signed types can be used to test the band parameters.");
336
337 if (static_cast<diff_type>(band.lower_diagonal) > std::ranges::distance(sequence1))
338 {
340 "Invalid band error: The lower diagonal excludes the whole alignment matrix."};
341 }
342
343 if (static_cast<diff_type>(band.upper_diagonal) < -std::ranges::distance(sequence2))
344 {
346 "Invalid band error: The upper diagonal excludes the whole alignment matrix."};
347 }
348 }
349
362 template <typename sequence1_t, typename sequence2_t>
363 constexpr void initialise_debug_matrices(sequence1_t & sequence1, sequence2_t & sequence2)
364 {
365 size_t rows = std::ranges::distance(sequence2) + 1;
366 size_t cols = std::ranges::distance(sequence1) + 1;
367
370 }
371
379 template <typename sequence1_t, typename sequence2_t>
380 void compute_matrix(sequence1_t & sequence1, sequence2_t & sequence2)
381 requires (!traits_t::is_banded)
382 {
383 // ----------------------------------------------------------------------------
384 // Initialisation phase: allocate memory and initialise first column.
385 // ----------------------------------------------------------------------------
386
387 this->allocate_matrix(sequence1, sequence2);
389
390 // ----------------------------------------------------------------------------
391 // Recursion phase: compute column-wise the alignment matrix.
392 // ----------------------------------------------------------------------------
393
394 for (auto const & alphabet1 : sequence1)
395 {
396 compute_alignment_column<true>(this->scoring_scheme_profile_column(alphabet1), sequence2);
398 }
399
400 // ----------------------------------------------------------------------------
401 // Wrap up phase: track score in last column and prepare the alignment result.
402 // ----------------------------------------------------------------------------
403
405 }
406
408 template <typename sequence1_t, typename sequence2_t>
409 void compute_matrix(sequence1_t & sequence1, sequence2_t & sequence2, align_cfg::band_fixed_size const & band)
410 requires (traits_t::is_banded)
411 {
412 // ----------------------------------------------------------------------------
413 // Initialisation phase: allocate memory and initialise first column.
414 // ----------------------------------------------------------------------------
415
416 // Allocate and initialise first column.
417 this->allocate_matrix(sequence1, sequence2, band, this->alignment_state);
418 using row_index_t = std::ranges::range_difference_t<sequence2_t>;
419 row_index_t last_row_index = this->score_matrix.band_row_index;
420 initialise_first_alignment_column(std::views::take(sequence2, last_row_index));
421
422 // ----------------------------------------------------------------------------
423 // 1st recursion phase: iterate as long as the band intersects with the first row.
424 // ----------------------------------------------------------------------------
425
426 row_index_t sequence2_size = std::ranges::distance(sequence2);
427 for (auto const & seq1_value : std::views::take(sequence1, this->score_matrix.band_col_index))
428 {
429 compute_alignment_column<true>(seq1_value, std::views::take(sequence2, ++last_row_index));
430 // Only if band reached last row of matrix the last cell might be tracked.
431 finalise_last_cell_in_column(last_row_index >= sequence2_size);
432 }
433
434 // ----------------------------------------------------------------------------
435 // 2nd recursion phase: iterate until the end of the matrix.
436 // ----------------------------------------------------------------------------
437
438 size_t first_row_index = 0;
439 for (auto const & seq1_value : std::views::drop(sequence1, this->score_matrix.band_col_index))
440 {
441 // In the second phase the band moves in every column one base down on the second sequence.
442 compute_alignment_column<false>(seq1_value, sequence2 | views::slice(first_row_index++, ++last_row_index));
443 // Only if band reached last row of matrix the last cell might be tracked.
444 finalise_last_cell_in_column(last_row_index >= sequence2_size);
445 }
446
447 // ----------------------------------------------------------------------------
448 // Wrap up phase: track score in last column and prepare the alignment result.
449 // ----------------------------------------------------------------------------
450
452 }
453
466 template <typename sequence2_t>
467 auto initialise_first_alignment_column(sequence2_t && sequence2)
468 {
469 // Get the initial column.
470 alignment_column = this->current_alignment_column();
471 assert(!alignment_column.empty()); // Must contain at least one element.
472
473 // Initialise first cell.
475 this->init_origin_cell(*alignment_column_it, this->alignment_state);
476
477 // Initialise the remaining cells of this column.
478 for (auto it = std::ranges::begin(sequence2); it != std::ranges::end(sequence2); ++it)
479 this->init_column_cell(*++alignment_column_it, this->alignment_state);
480
481 // Finalise the last cell of the initial column.
482 bool at_last_row = true;
483 if constexpr (traits_t::is_banded) // If the band reaches until the last row of the matrix.
484 at_last_row = static_cast<size_t>(this->score_matrix.band_row_index) == this->score_matrix.num_rows - 1;
485
486 finalise_last_cell_in_column(at_last_row);
487 }
488
504 template <bool initialise_first_cell, typename sequence1_value_t, typename sequence2_t>
505 void compute_alignment_column(sequence1_value_t const & seq1_value, sequence2_t && sequence2)
506 {
507 this->next_alignment_column(); // move to next column and set alignment column iterator accordingly.
508 alignment_column = this->current_alignment_column();
510
511 auto seq2_it = std::ranges::begin(sequence2);
512
513 if constexpr (initialise_first_cell) // Initialise first cell if it intersects with the first row of the matrix.
514 {
515 this->init_row_cell(*alignment_column_it, this->alignment_state);
516 }
517 else // Compute first cell of banded column if it does not intersect with the first row of the matrix.
518 {
519 this->compute_first_band_cell(*alignment_column_it,
520 this->alignment_state,
521 this->scoring_scheme.score(seq1_value, *seq2_it));
522 ++seq2_it;
523 }
524
525 for (; seq2_it != std::ranges::end(sequence2); ++seq2_it)
526 this->compute_cell(*++alignment_column_it,
527 this->alignment_state,
528 this->scoring_scheme.score(seq1_value, *seq2_it));
529 }
530
541 constexpr void finalise_last_cell_in_column(bool const at_last_row) noexcept
542 {
543 if (at_last_row)
544 this->check_score_of_last_row_cell(*alignment_column_it, this->alignment_state);
545
546 if constexpr (traits_t::is_debug)
548 }
549
551 constexpr void finalise_alignment() noexcept
552 {
553 // ----------------------------------------------------------------------------
554 // Check for the optimum in last cell/column.
555 // ----------------------------------------------------------------------------
556
557 this->check_score_of_cells_in_last_column(alignment_column, this->alignment_state);
558 this->check_score_of_last_cell(*alignment_column_it, this->alignment_state);
559 }
560
587 template <typename index_t, typename sequence1_t, typename sequence2_t, typename callback_t>
588 requires (!traits_t::is_vectorised)
589 constexpr void make_alignment_result([[maybe_unused]] index_t const idx,
590 [[maybe_unused]] sequence1_t & sequence1,
591 [[maybe_unused]] sequence2_t & sequence2,
592 callback_t & callback)
593 {
594 using result_value_t = typename alignment_result_value_type_accessor<alignment_result_t>::type;
595
596 // ----------------------------------------------------------------------------
597 // Build the alignment result
598 // ----------------------------------------------------------------------------
599
601 "The configuration must contain at least one align_cfg::output_* element.");
602
603 result_value_t res{};
604
605 if constexpr (traits_t::output_sequence1_id)
606 res.sequence1_id = idx;
607
608 if constexpr (traits_t::output_sequence2_id)
609 res.sequence2_id = idx;
610
611 // Choose what needs to be computed.
612 if constexpr (traits_t::compute_score)
613 res.score = this->alignment_state.optimum.score;
614
616 {
617 using alignment_coordinate_t = detail::advanceable_alignment_coordinate<>;
618 res.end_positions = alignment_coordinate_t{column_index_type{this->alignment_state.optimum.column_index},
619 row_index_type{this->alignment_state.optimum.row_index}};
620 // At some point this needs to be refactored so that it is not necessary to adapt the coordinate.
621 if constexpr (traits_t::is_banded)
622 res.end_positions.second += res.end_positions.first - this->trace_matrix.band_col_index;
623 }
624
626 {
627 // Get a aligned sequence builder for banded or un-banded case.
628 aligned_sequence_builder builder{sequence1, sequence2};
629
630 detail::matrix_coordinate const optimum_coordinate{
631 detail::row_index_type{this->alignment_state.optimum.row_index},
632 detail::column_index_type{this->alignment_state.optimum.column_index}};
633 auto trace_res = builder(this->trace_matrix.trace_path(optimum_coordinate));
634 res.begin_positions.first = trace_res.first_sequence_slice_positions.first;
635 res.begin_positions.second = trace_res.second_sequence_slice_positions.first;
636
638 res.alignment = std::move(trace_res.alignment);
639 }
640
641 // Store the matrices in debug mode.
642 if constexpr (traits_t::is_debug)
643 {
644 res.score_debug_matrix = std::move(score_debug_matrix);
645 if constexpr (traits_t::compute_sequence_alignment) // compute alignment
646 res.trace_debug_matrix = std::move(trace_debug_matrix);
647 }
648
649 callback(std::move(res));
650 }
651
677 template <typename indexed_sequence_pair_range_t, typename callback_t>
679 constexpr auto make_alignment_result(indexed_sequence_pair_range_t && index_sequence_pairs, callback_t & callback)
680 {
681 using result_value_t = typename alignment_result_value_type_accessor<alignment_result_t>::type;
682
683 size_t simd_index = 0;
684 for (auto && [sequence_pairs, alignment_index] : index_sequence_pairs)
685 {
686 (void)sequence_pairs;
687 result_value_t res{};
688
689 if constexpr (traits_t::output_sequence1_id)
690 res.sequence1_id = alignment_index;
691
692 if constexpr (traits_t::output_sequence2_id)
693 res.sequence2_id = alignment_index;
694
695 if constexpr (traits_t::compute_score)
696 res.score = this->alignment_state.optimum.score[simd_index]; // Just take this
697
699 {
700 res.end_positions.first = this->alignment_state.optimum.column_index[simd_index];
701 res.end_positions.second = this->alignment_state.optimum.row_index[simd_index];
702 }
703
704 callback(std::move(res));
705 ++simd_index;
706 }
707 }
708
718 {
719 using std::get;
720
721 auto column = this->current_alignment_column();
722
723 auto coord = get<1>(column.front()).coordinate;
724 if constexpr (traits_t::is_banded)
725 coord.second += coord.first - this->score_matrix.band_col_index;
726
727 matrix_offset offset{row_index_type{static_cast<std::ptrdiff_t>(coord.second)},
728 column_index_type{static_cast<std::ptrdiff_t>(coord.first)}};
729
731 | std::views::transform(
732 [](auto const & tpl)
733 {
734 using std::get;
735 return get<0>(tpl).current;
736 }),
737 score_debug_matrix.begin() + offset);
738
739 // if traceback is enabled.
741 {
743 column
744 | std::views::transform(
745 [](auto const & tpl)
746 {
747 using std::get;
748 auto trace = get<1>(tpl).current;
749
750 if (auto _up = (trace & trace_directions::up_open); _up == trace_directions::carry_up_open)
751 trace = trace ^ trace_directions::carry_up_open; // remove silent up open signal
752 else if (_up == trace_directions::up_open)
753 trace = trace ^ trace_directions::up; // display up open only with single bit.
754
755 if (auto _left = (trace & trace_directions::left_open);
757 trace = trace ^ trace_directions::carry_left_open; // remove silent left open signal
758 else if (_left == trace_directions::left_open)
759 trace = trace ^ trace_directions::left; // display left open only with single bit.
760
761 return trace;
762 }),
763 trace_debug_matrix.begin() + offset);
764 }
765 }
766
779};
780
781} // namespace seqan3::detail
Provides seqan3::detail::align_config_band.
Provides seqan3::align_cfg::scoring_scheme.
Provides seqan3::detail::align_result_selector.
Provides seqan3::aligned_allocator.
Provides seqan3::detail::aligned_sequence_builder.
Includes customized exception types for the alignment module .
Provides concepts needed internally for the alignment algorithms.
Provides helper type traits for the configuration and execution of the alignment algorithm.
T begin(T... args)
Configuration element for setting a fixed size band.
Definition align_config_band.hpp:60
Allocates uninitialized storage whose memory-alignment is specified by alignment.
Definition aligned_allocator.hpp:74
Implements an internal alignment coordinate that can be used as an argument to the std::ranges::iota_...
Definition advanceable_alignment_coordinate.hpp:63
Builds the alignment for a given pair of sequences and the respective trace.
Definition aligned_sequence_builder.hpp:114
The alignment algorithm type to compute standard pairwise alignment using dynamic programming.
Definition alignment_algorithm.hpp:75
constexpr alignment_algorithm(alignment_algorithm &&)=default
Defaulted.
constexpr alignment_algorithm & operator=(alignment_algorithm const &)=default
Defaulted.
constexpr void finalise_last_cell_in_column(bool const at_last_row) noexcept
Finalises the last cell of the current alignment column.
Definition alignment_algorithm.hpp:541
trace_debug_matrix_t trace_debug_matrix
The debug matrix for the traces.
Definition alignment_algorithm.hpp:776
constexpr alignment_algorithm(alignment_algorithm const &)=default
Defaulted.
typename traits_t::alignment_result_type alignment_result_t
The alignment result type.
Definition alignment_algorithm.hpp:98
::is_vectorised constexpr auto make_alignment_result(indexed_sequence_pair_range_t &&index_sequence_pairs, callback_t &callback)
Creates a new alignment result from the current alignment optimum and for the given indexed sequence ...
Definition alignment_algorithm.hpp:679
void compute_matrix(sequence1_t &sequence1, sequence2_t &sequence2, align_cfg::band_fixed_size const &band)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition alignment_algorithm.hpp:409
void compute_alignment_column(sequence1_value_t const &seq1_value, sequence2_t &&sequence2)
Computes a single alignment column.
Definition alignment_algorithm.hpp:505
constexpr void compute_single_pair(size_t const idx, sequence1_t &&sequence1, sequence2_t &&sequence2, callback_t &callback)
Computes the pairwise sequence alignment for a single pair of sequences.
Definition alignment_algorithm.hpp:282
score_debug_matrix_t score_debug_matrix
The debug matrix for the scores.
Definition alignment_algorithm.hpp:774
constexpr auto convert_batch_of_sequences_to_simd_vector(sequence_range_t &sequences)
Converts a batch of sequences to a sequence of simd vectors.
Definition alignment_algorithm.hpp:248
alignment_column_iterator_t alignment_column_it
Stores the state of the currently processed alignment column.
Definition alignment_algorithm.hpp:772
constexpr alignment_algorithm & operator=(alignment_algorithm &&)=default
Defaulted.
constexpr void check_valid_band_parameter(sequence1_t &&sequence1, sequence2_t &&sequence2, align_cfg::band_fixed_size const &band)
Checks if the band parameters are valid for the given sequences.
Definition alignment_algorithm.hpp:327
constexpr void finalise_alignment() noexcept
Checks the last cell, respectively column for the alignment optimum.
Definition alignment_algorithm.hpp:551
decltype(_alignment_column_t()) alignment_column_t
The type of an alignment column as defined by the respective matrix policy.
Definition alignment_algorithm.hpp:94
auto initialise_first_alignment_column(sequence2_t &&sequence2)
Initialises the first column of the alignment matrix.
Definition alignment_algorithm.hpp:467
~alignment_algorithm()=default
Defaulted.
constexpr alignment_algorithm(config_t const &cfg)
Constructs the algorithm with the passed configuration.
Definition alignment_algorithm.hpp:136
static auto _alignment_column_t() -> decltype(std::declval< alignment_algorithm_t >().current_alignment_column())
Helper function to access ((some_policy *)this)->current_alignment_column().
std::pair< size_t, size_t > max_size_in_collection
The maximal size within the first and the second sequence collection.
Definition alignment_algorithm.hpp:778
std::shared_ptr< config_t > cfg_ptr
The alignment configuration stored on the heap.
Definition alignment_algorithm.hpp:768
alignment_column_t alignment_column
Stores the currently processed alignment column.
Definition alignment_algorithm.hpp:770
constexpr alignment_algorithm()=default
Defaulted.
constexpr void initialise_debug_matrices(sequence1_t &sequence1, sequence2_t &sequence2)
Initialises the debug matrices for the given sequences.
Definition alignment_algorithm.hpp:363
constexpr void make_alignment_result(index_t const idx, sequence1_t &sequence1, sequence2_t &sequence2, callback_t &callback)
Creates a new alignment result from the current alignment optimum and for the given pair of sequences...
Definition alignment_algorithm.hpp:589
void compute_matrix(sequence1_t &sequence1, sequence2_t &sequence2)
Compute the alignment by iterating over the alignment matrix in a column wise manner.
Definition alignment_algorithm.hpp:380
std::ranges::iterator_t< alignment_column_t > alignment_column_iterator_t
The iterator type over the alignment column.
Definition alignment_algorithm.hpp:96
void dump_alignment_column()
Dumps the current alignment matrix in the debug score matrix and if requested debug trace matrix.
Definition alignment_algorithm.hpp:717
::is_vectorised &&std::invocable< callback_t, alignment_result_t > void operator()(indexed_sequence_pairs_t &&indexed_sequence_pairs, callback_t &&callback)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition alignment_algorithm.hpp:203
A two dimensional matrix used inside of alignment algorithms.
Definition two_dimensional_matrix.hpp:62
Thrown if the configuration of the alignment algorithm is invalid.
Definition alignment/exception.hpp:32
T copy(T... args)
Provides seqan3::detail::deferred_crtp_base.
Provides seqan3::views::elements.
Provides seqan3::detail::empty_type.
Provides various type traits for use on functions.
@ band
ID for the band option.
@ column
The corresponding alignment coordinate will be incrementable/decrementable in the column index.
@ column
Accesses matrix in column major order.
@ carry_left_open
Carry bit for the last left open even if it is not the maximum value.
@ up
Trace comes from the above entry.
@ left
Trace comes from the left entry.
@ carry_up_open
Carry bit for the last up open even if it is not the maximum value.
@ left_open
Trace comes from the left entry, while opening the gap.
@ up_open
Trace comes from the above entry, while opening the gap.
typename deferred_crtp_base_t::template invoke< derived_t > invoke_deferred_crtp_base
Template alias to instantiate the deferred crtp base with the derived class.
Definition deferred_crtp_base.hpp:94
@ offset
Sequence (seqan3::field::seq) relative start position (0-based), unsigned value.
constexpr auto slice
A view adaptor that returns a half-open interval on the underlying range.
Definition slice.hpp:175
A helper concept to check if a type is a sequence pair.
The generic simd concept.
Refines the seqan3::simd::simd_concept requiring the underlying scalar type to model std::integral.
The internal SeqAn3 namespace.
Definition aligned_sequence_concept.hpp:26
constexpr auto const & get(configuration< configs_t... > const &config) noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition configuration.hpp:412
T push_back(T... args)
Provides seqan3::simd::simd_type.
Provides seqan3::simd::simd_traits.
A traits type for the alignment algorithm that exposes static information stored within the alignment...
Definition alignment/pairwise/detail/type_traits.hpp:80
static constexpr bool is_banded
Flag indicating whether banded alignment mode is enabled.
Definition alignment/pairwise/detail/type_traits.hpp:120
static constexpr bool is_vectorised
Flag to indicate vectorised mode.
Definition alignment/pairwise/detail/type_traits.hpp:112
std::conditional_t< is_vectorised, simd_type_t< original_score_type >, original_score_type > score_type
The score type for the alignment algorithm.
Definition alignment/pairwise/detail/type_traits.hpp:133
static constexpr bool output_sequence2_id
Flag indicating whether the id of the second sequence shall be returned.
Definition alignment/pairwise/detail/type_traits.hpp:165
static constexpr bool compute_sequence_alignment
Flag indicating whether the sequence alignment shall be computed.
Definition alignment/pairwise/detail/type_traits.hpp:161
static constexpr size_t alignments_per_vector
The number of alignments that can be computed in one simd vector.
Definition alignment/pairwise/detail/type_traits.hpp:146
static constexpr bool compute_begin_positions
Flag indicating whether the begin positions shall be computed.
Definition alignment/pairwise/detail/type_traits.hpp:158
static constexpr bool is_debug
Flag indicating whether debug mode is enabled.
Definition alignment/pairwise/detail/type_traits.hpp:122
static constexpr bool output_sequence1_id
Flag indicating whether the id of the first sequence shall be returned.
Definition alignment/pairwise/detail/type_traits.hpp:163
decltype(determine_alignment_result_type()) alignment_result_type
The alignment result type if present. Otherwise seqan3::detail::empty_type.
Definition alignment/pairwise/detail/type_traits.hpp:137
static constexpr bool compute_end_positions
Flag indicating whether the end positions shall be computed.
Definition alignment/pairwise/detail/type_traits.hpp:156
static constexpr bool compute_score
Flag indicating whether the score shall be computed.
Definition alignment/pairwise/detail/type_traits.hpp:154
A strong type for designated initialisation of the column index of a matrix.
Definition matrix_coordinate.hpp:29
An empty class type used in meta programming.
Definition empty_type.hpp:20
A representation of a location or offset within a two-dimensional matrix.
Definition matrix_coordinate.hpp:87
Strong type for setting the column dimension of a matrix.
Definition two_dimensional_matrix.hpp:29
Strong type for setting the row dimension of a matrix.
Definition two_dimensional_matrix.hpp:37
A strong type for designated initialisation of the row index of a matrix.
Definition matrix_coordinate.hpp:58
Provides seqan3::detail::to_simd view.
Provides the declaration of seqan3::detail::trace_directions.
Provides seqan3::simd::simd_concept.
Hide me