22 namespace seqan3::detail
30 template <
typename alignment_configuration_t,
typename ...policies_t>
32 requires is_type_specialisation_of_v<alignment_configuration_t, configuration>
34 class pairwise_alignment_algorithm_banded :
35 protected pairwise_alignment_algorithm<alignment_configuration_t, policies_t...>
39 using base_algorithm_t = pairwise_alignment_algorithm<alignment_configuration_t, policies_t...>;
42 using typename base_algorithm_t::traits_type;
43 using typename base_algorithm_t::alignment_result_type;
44 using typename base_algorithm_t::score_type;
46 static_assert(!std::same_as<alignment_result_type, empty_type>,
"Alignment result type was not configured.");
47 static_assert(traits_type::is_banded,
"Alignment configuration must have band configured.");
53 pairwise_alignment_algorithm_banded() =
default;
54 pairwise_alignment_algorithm_banded(pairwise_alignment_algorithm_banded
const &) =
default;
55 pairwise_alignment_algorithm_banded(pairwise_alignment_algorithm_banded &&) =
default;
56 pairwise_alignment_algorithm_banded & operator=(pairwise_alignment_algorithm_banded
const &) =
default;
57 pairwise_alignment_algorithm_banded & operator=(pairwise_alignment_algorithm_banded &&) =
default;
58 ~pairwise_alignment_algorithm_banded() =
default;
69 pairwise_alignment_algorithm_banded(alignment_configuration_t
const & config) : base_algorithm_t(config)
77 template <indexed_sequence_pair_range indexed_sequence_pairs_t,
typename callback_t>
79 requires std::invocable<callback_t, alignment_result_type>
81 void operator()(indexed_sequence_pairs_t && indexed_sequence_pairs, callback_t && callback)
85 for (
auto && [sequence_pair, idx] : indexed_sequence_pairs)
87 size_t sequence1_size = std::ranges::distance(get<0>(sequence_pair));
88 size_t const sequence2_size = std::ranges::distance(get<1>(sequence_pair));
90 auto && [alignment_matrix, index_matrix] = this->acquire_matrices(sequence1_size,
92 this->lowest_viable_score());
95 this->compare_and_set_optimum.set_target_indices(row_index_type{sequence2_size},
96 column_index_type{sequence1_size});
99 sequence1_size =
std::min(sequence1_size, this->upper_diagonal + sequence2_size);
101 using sequence1_difference_t = std::ranges::range_difference_t<decltype(get<0>(sequence_pair))>;
103 compute_matrix(
std::views::take(get<0>(sequence_pair),
static_cast<sequence1_difference_t
>(sequence1_size)),
104 get<1>(sequence_pair),
107 this->make_result_and_invoke(
std::forward<decltype(sequence_pair)>(sequence_pair),
110 this->optimal_coordinate,
117 template <indexed_sequence_pair_range indexed_sequence_pairs_t,
typename callback_t>
119 requires traits_type::is_vectorised && std::invocable<callback_t, alignment_result_type>
121 auto operator()(indexed_sequence_pairs_t && indexed_sequence_pairs, callback_t && callback)
123 using simd_collection_t =
std::vector<score_type, aligned_allocator<score_type,
alignof(score_type)>>;
124 using original_score_t =
typename traits_type::original_score_type;
127 auto seq1_collection = indexed_sequence_pairs | views::elements<0> | views::elements<0>;
128 auto seq2_collection = indexed_sequence_pairs | views::elements<0> | views::elements<1>;
130 this->initialise_tracker(seq1_collection, seq2_collection);
133 thread_local simd_collection_t simd_seq1_collection{};
134 thread_local simd_collection_t simd_seq2_collection{};
136 this->convert_batch_of_sequences_to_simd_vector(simd_seq1_collection,
138 this->scoring_scheme.padding_symbol);
139 this->convert_batch_of_sequences_to_simd_vector(simd_seq2_collection,
141 this->scoring_scheme.padding_symbol);
143 size_t const sequence1_size = std::ranges::distance(simd_seq1_collection);
144 size_t const sequence2_size = std::ranges::distance(simd_seq2_collection);
146 auto && [alignment_matrix, index_matrix] = this->acquire_matrices(sequence1_size,
148 this->lowest_viable_score());
150 compute_matrix(simd_seq1_collection, simd_seq2_collection, alignment_matrix, index_matrix);
153 for (
auto && [sequence_pair, idx] : indexed_sequence_pairs)
155 original_score_t score = this->optimal_score[index] -
156 (this->padding_offsets[index] * this->scoring_scheme.padding_match_score());
157 matrix_coordinate coordinate{row_index_type{
size_t{this->optimal_coordinate.row[index]}},
158 column_index_type{
size_t{this->optimal_coordinate.col[index]}}};
159 this->make_result_and_invoke(
std::forward<decltype(sequence_pair)>(sequence_pair),
223 template <std::ranges::forward_range sequence1_t,
224 std::ranges::forward_range sequence2_t,
225 std::ranges::input_range alignment_matrix_t,
226 std::ranges::input_range index_matrix_t>
228 requires std::ranges::forward_range<std::ranges::range_reference_t<alignment_matrix_t>> &&
229 std::ranges::forward_range<std::ranges::range_reference_t<index_matrix_t>>
231 void compute_matrix(sequence1_t && sequence1,
232 sequence2_t && sequence2,
233 alignment_matrix_t && alignment_matrix,
234 index_matrix_t && index_matrix)
240 this->reset_optimum();
242 auto alignment_matrix_it = alignment_matrix.begin();
243 auto indexed_matrix_it = index_matrix.begin();
245 using row_index_t = std::ranges::range_difference_t<sequence2_t>;
246 using column_index_t = std::ranges::range_difference_t<sequence1_t>;
248 row_index_t row_size = std::max<int32_t>(0, -this->lower_diagonal);
249 column_index_t
const column_size = std::max<int32_t>(0, this->upper_diagonal);
250 this->initialise_column(*alignment_matrix_it, *indexed_matrix_it,
std::views::take(sequence2, row_size));
258 this->compute_column(*++alignment_matrix_it,
259 *++indexed_matrix_it,
268 row_index_t first_row_index = 0u;
271 compute_band_column(*++alignment_matrix_it,
282 auto alignment_column = *alignment_matrix_it;
283 auto cell_index_column =
std::views::drop(*indexed_matrix_it, first_row_index);
285 auto alignment_column_it = alignment_column.begin();
286 auto cell_index_column_it = cell_index_column.begin();
288 this->track_last_column_cell(*alignment_column_it, *cell_index_column_it);
290 for (row_index_t last_row = std::min<row_index_t>(std::ranges::distance(sequence2), row_size);
291 first_row_index < last_row;
293 this->track_last_column_cell(*++alignment_column_it, *++cell_index_column_it);
295 this->track_final_cell(*alignment_column_it, *cell_index_column_it);
349 template <std::ranges::forward_range alignment_column_t,
350 std::ranges::input_range cell_index_column_t,
351 typename alphabet1_t,
352 std::ranges::input_range sequence2_t>
353 void compute_band_column(alignment_column_t && alignment_column,
354 cell_index_column_t && cell_index_column,
355 alphabet1_t
const & alphabet1,
356 sequence2_t && sequence2)
362 auto current_alignment_column_it = alignment_column.begin();
363 auto cell_index_column_it = cell_index_column.begin();
366 decltype(current_alignment_column_it) next_alignment_column_it{current_alignment_column_it};
367 auto cell = *current_alignment_column_it;
368 cell = this->track_cell(
369 this->initialise_band_first_cell(cell.best_score(),
370 *++next_alignment_column_it,
371 this->scoring_scheme.score(alphabet1, *std::ranges::begin(sequence2))),
372 *cell_index_column_it);
380 current_alignment_column_it = next_alignment_column_it;
381 auto cell = *current_alignment_column_it;
382 cell = this->track_cell(
383 this->compute_inner_cell(cell.best_score(),
384 *++next_alignment_column_it,
385 this->scoring_scheme.score(alphabet1, alphabet2)),
386 *++cell_index_column_it);
393 this->track_last_row_cell(*current_alignment_column_it, *cell_index_column_it);
typename decltype(detail::split_after< i >(list_t{}))::first_type take
Return a seqan3::type_list of the first n types in the input type list.
Definition: traits.hpp:368
typename decltype(detail::split_after< i >(list_t{}))::second_type drop
Return a seqan3::type_list of the types in the input type list, except the first n.
Definition: traits.hpp:388
constexpr auto get
A view calling get on each element in a range.
Definition: elements.hpp:114
constexpr auto slice
A view adaptor that returns a half-open interval on the underlying range.
Definition: slice.hpp:189
auto const move
A view that turns lvalue-references into rvalue-references.
Definition: move.hpp:74
Provides seqan3::detail::pairwise_alignment_algorithm.
Adaptations of concepts from the Ranges TS.
[DEPRECATED] Provides seqan3::views::take.
Provides seqan3::views::slice.