44template <
typename alignment_configuration_t,
typename... policies_t>
45 requires is_type_specialisation_of_v<alignment_configuration_t, configuration>
56 static_assert(!std::same_as<alignment_result_type, empty_type>,
"Alignment result type was not configured.");
125 template <indexed_sequence_pair_range indexed_sequence_pairs_t,
typename callback_t>
126 requires std::invocable<callback_t, alignment_result_type>
127 void operator()(indexed_sequence_pairs_t && indexed_sequence_pairs, callback_t && callback)
133 size_t const sequence1_size = std::ranges::distance(get<0>(
sequence_pair));
134 size_t const sequence2_size = std::ranges::distance(get<1>(
sequence_pair));
136 auto && [alignment_matrix, index_matrix] = this->acquire_matrices(sequence1_size, sequence2_size);
142 this->optimal_coordinate,
150 template <indexed_sequence_pair_range indexed_sequence_pairs_t,
typename callback_t>
152 auto operator()(indexed_sequence_pairs_t && indexed_sequence_pairs, callback_t && callback)
158 auto seq1_collection = indexed_sequence_pairs | views::elements<0> | views::elements<0>;
159 auto seq2_collection = indexed_sequence_pairs | views::elements<0> | views::elements<1>;
161 this->initialise_tracker(seq1_collection, seq2_collection);
164 thread_local simd_collection_t simd_seq1_collection{};
165 thread_local simd_collection_t simd_seq2_collection{};
169 this->scoring_scheme.padding_symbol);
172 this->scoring_scheme.padding_symbol);
174 size_t const sequence1_size = std::ranges::distance(simd_seq1_collection);
175 size_t const sequence2_size = std::ranges::distance(simd_seq2_collection);
177 auto && [alignment_matrix, index_matrix] = this->acquire_matrices(sequence1_size, sequence2_size);
179 compute_matrix(simd_seq1_collection, simd_seq2_collection, alignment_matrix, index_matrix);
184 original_score_t score = this->optimal_score[index]
185 - (this->padding_offsets[index] * this->scoring_scheme.padding_match_score());
186 matrix_coordinate coordinate{
row_index_type{
size_t{this->optimal_coordinate.row[index]}},
191 std::move(coordinate),
218 template <
typename simd_sequence_t, std::ranges::forward_range sequence_collection_t, arithmetic padding_symbol_t>
219 requires std::ranges::output_range<simd_sequence_t, score_type>
221 sequence_collection_t & sequences,
222 padding_symbol_t
const & padding_symbol)
226 simd_sequence.clear();
227 for (
auto && simd_vector_chunk : sequences | views::to_simd<score_type>(padding_symbol))
244 template <std::ranges::forward_range sequence1_t,
245 std::ranges::forward_range sequence2_t,
246 std::ranges::input_range alignment_matrix_t,
247 std::ranges::input_range index_matrix_t>
248 requires std::ranges::forward_range<std::ranges::range_reference_t<alignment_matrix_t>>
249 && std::ranges::forward_range<std::ranges::range_reference_t<index_matrix_t>>
251 sequence2_t && sequence2,
252 alignment_matrix_t && alignment_matrix,
253 index_matrix_t && index_matrix)
259 this->reset_optimum();
261 auto alignment_matrix_it = alignment_matrix.begin();
262 auto indexed_matrix_it = index_matrix.begin();
270 for (
auto alphabet1 : sequence1)
272 *++indexed_matrix_it,
273 this->scoring_scheme_profile_column(alphabet1),
280 auto && alignment_column = *alignment_matrix_it;
281 auto && cell_index_column = *indexed_matrix_it;
283 auto alignment_column_it = alignment_column.begin();
284 auto cell_index_column_it = cell_index_column.begin();
286 this->track_last_column_cell(*alignment_column_it, *cell_index_column_it);
288 for ([[maybe_unused]]
auto && unused : sequence2)
289 this->track_last_column_cell(*++alignment_column_it, *++cell_index_column_it);
291 this->track_final_cell(*alignment_column_it, *cell_index_column_it);
312 template <std::ranges::input_range alignment_column_t,
313 std::ranges::input_range cell_index_column_t,
314 std::ranges::input_range sequence2_t>
316 cell_index_column_t && cell_index_column,
317 sequence2_t && sequence2)
323 auto first_column_it = alignment_column.begin();
324 auto cell_index_column_it = cell_index_column.begin();
325 *first_column_it = this->track_cell(this->initialise_origin_cell(), *cell_index_column_it);
331 for ([[maybe_unused]]
auto const & unused : sequence2)
335 this->track_cell(this->initialise_first_column_cell(*first_column_it), *++cell_index_column_it);
342 this->track_last_row_cell(*first_column_it, *cell_index_column_it);
363 template <std::ranges::input_range alignment_column_t,
364 std::ranges::input_range cell_index_column_t,
365 typename alphabet1_t,
366 std::ranges::input_range sequence2_t>
369 cell_index_column_t && cell_index_column,
370 alphabet1_t
const & alphabet1,
371 sequence2_t && sequence2)
379 auto alignment_column_it = alignment_column.begin();
380 auto cell_index_column_it = cell_index_column.begin();
382 auto cell = *alignment_column_it;
384 *alignment_column_it = this->track_cell(this->initialise_first_row_cell(cell), *cell_index_column_it);
390 for (
auto const & alphabet2 : sequence2)
392 auto cell = *++alignment_column_it;
394 *alignment_column_it = this->track_cell(
395 this->compute_inner_cell(
diagonal, cell, this->scoring_scheme.score(alphabet1, alphabet2)),
396 *++cell_index_column_it);
404 this->track_last_row_cell(*alignment_column_it, *cell_index_column_it);
Provides seqan3::aligned_allocator.
Provides helper type traits for the configuration and execution of the alignment algorithm.
T back_inserter(T... args)
Allocates uninitialized storage whose memory-alignment is specified by alignment.
Definition: aligned_allocator.hpp:77
The alignment algorithm type to compute standard pairwise alignment using dynamic programming.
Definition: pairwise_alignment_algorithm.hpp:47
pairwise_alignment_algorithm(alignment_configuration_t const &config)
Constructs and initialises the algorithm using the alignment configuration.
Definition: pairwise_alignment_algorithm.hpp:76
void compute_matrix(sequence1_t &&sequence1, sequence2_t &&sequence2, alignment_matrix_t &&alignment_matrix, index_matrix_t &&index_matrix)
Compute the actual alignment.
Definition: pairwise_alignment_algorithm.hpp:250
pairwise_alignment_algorithm & operator=(pairwise_alignment_algorithm const &)=default
Defaulted.
pairwise_alignment_algorithm(pairwise_alignment_algorithm &&)=default
Defaulted.
~pairwise_alignment_algorithm()=default
Defaulted.
pairwise_alignment_algorithm & operator=(pairwise_alignment_algorithm &&)=default
Defaulted.
pairwise_alignment_algorithm(pairwise_alignment_algorithm const &)=default
Defaulted.
pairwise_alignment_algorithm()=default
Defaulted.
typename traits_type::score_type score_type
The configured score type.
Definition: pairwise_alignment_algorithm.hpp:52
::is_vectorised &&std::invocable< callback_t, alignment_result_type > auto 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: pairwise_alignment_algorithm.hpp:152
void compute_column(alignment_column_t &&alignment_column, cell_index_column_t &&cell_index_column, alphabet1_t const &alphabet1, sequence2_t &&sequence2)
Initialise any column of the alignment matrix except the first one.
Definition: pairwise_alignment_algorithm.hpp:368
void initialise_column(alignment_column_t &&alignment_column, cell_index_column_t &&cell_index_column, sequence2_t &&sequence2)
Initialise the first column of the alignment matrix.
Definition: pairwise_alignment_algorithm.hpp:315
void convert_batch_of_sequences_to_simd_vector(simd_sequence_t &simd_sequence, sequence_collection_t &sequences, padding_symbol_t const &padding_symbol)
Converts a batch of sequences to a sequence of simd vectors.
Definition: pairwise_alignment_algorithm.hpp:220
typename traits_type::alignment_result_type alignment_result_type
The configured alignment result type.
Definition: pairwise_alignment_algorithm.hpp:54
void operator()(indexed_sequence_pairs_t &&indexed_sequence_pairs, callback_t &&callback)
Computes the pairwise sequence alignment for the given range over indexed sequence pairs.
Definition: pairwise_alignment_algorithm.hpp:127
Provides seqan3::views::elements.
Provides seqan3::detail::empty_type.
@ diagonal
Trace comes from the diagonal entry.
A helper concept to check if a type is a sequence pair.
The basis for seqan3::alphabet, but requires only rank interface (not char).
The generic simd concept.
The internal SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
A traits type for the alignment algorithm that exposes static information stored within the alignment...
Definition: alignment/pairwise/detail/type_traits.hpp:83
static constexpr bool is_vectorised
Flag to indicate vectorised mode.
Definition: alignment/pairwise/detail/type_traits.hpp:115
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:136
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:149
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:140
typename std::remove_reference_t< decltype(std::declval< configuration_t >().get_or(align_cfg::score_type< int32_t >{}))>::type original_score_type
The original score type selected by the user.
Definition: alignment/pairwise/detail/type_traits.hpp:134
A strong type for designated initialisation of the column index of a matrix.
Definition: matrix_coordinate.hpp:32
A strong type for designated initialisation of the row index of a matrix.
Definition: matrix_coordinate.hpp:61
Provides seqan3::detail::to_simd view.
Provides traits to inspect some information of a type, for example its name.