25namespace seqan3::detail
41template <
typename score_t>
42class alignment_score_matrix_one_column_banded :
43 protected alignment_score_matrix_one_column_base<score_t>,
44 public alignment_matrix_column_major_range_base<alignment_score_matrix_one_column_banded<score_t>>
48 using matrix_base_t = alignment_score_matrix_one_column_base<score_t>;
50 using range_base_t = alignment_matrix_column_major_range_base<alignment_score_matrix_one_column_banded<score_t>>;
56 using typename matrix_base_t::element_type;
57 using typename range_base_t::alignment_column_type;
62 using matrix_base_t::num_cols;
63 using matrix_base_t::num_rows;
69 using value_type = alignment_score_matrix_proxy<score_t>;
71 using reference = value_type;
73 using iterator =
typename range_base_t::iterator;
75 using sentinel =
typename range_base_t::sentinel;
76 using typename matrix_base_t::size_type;
77 using typename matrix_base_t::underlying_type;
84 constexpr alignment_score_matrix_one_column_banded() =
default;
86 constexpr alignment_score_matrix_one_column_banded(alignment_score_matrix_one_column_banded
const &) =
default;
88 constexpr alignment_score_matrix_one_column_banded(alignment_score_matrix_one_column_banded &&) =
default;
90 constexpr alignment_score_matrix_one_column_banded &
91 operator=(alignment_score_matrix_one_column_banded
const &) =
default;
93 constexpr alignment_score_matrix_one_column_banded &
94 operator=(alignment_score_matrix_one_column_banded &&) =
default;
96 ~alignment_score_matrix_one_column_banded() =
default;
112 template <std::ranges::forward_range first_sequence_t, std::ranges::forward_range second_sequence_t>
113 constexpr alignment_score_matrix_one_column_banded(first_sequence_t && first,
114 second_sequence_t && second,
115 align_cfg::band_fixed_size
const & band,
116 score_t
const initial_value = score_t{})
118 matrix_base_t::num_cols =
static_cast<size_type
>(std::ranges::distance(first) + 1);
119 matrix_base_t::num_rows =
static_cast<size_type
>(std::ranges::distance(second) + 1);
121 band_col_index = std::min<int32_t>(std::max<int32_t>(band.upper_diagonal, 0), matrix_base_t::num_cols - 1);
123 std::min<int32_t>(std::abs(std::min<int32_t>(band.lower_diagonal, 0)), matrix_base_t::num_rows - 1);
125 band_size = band_col_index + band_row_index + 1;
127 matrix_base_t::pool.resize(band_size + 1, element_type{initial_value, initial_value});
132 int32_t band_col_index{};
134 int32_t band_row_index{};
140 constexpr alignment_column_type initialise_column(size_type
const column_index)
noexcept
142 int32_t slice_begin = std::max<int32_t>(0, band_col_index - column_index);
143 int32_t row_end_index = column_index - band_col_index + band_size;
144 int32_t slice_end = band_size - std::max<int32_t>(row_end_index - matrix_base_t::num_rows, 0);
146 assert(row_end_index >= 0);
147 assert(slice_begin >= 0);
148 assert(slice_end > 0);
149 assert(slice_begin < slice_end);
151 return alignment_column_type{*
this,
152 column_data_view_type{
std::addressof(matrix_base_t::pool[slice_begin]),
157 template <std::random_access_iterator iter_t>
158 constexpr value_type make_proxy(iter_t host_iter)
noexcept
160 return {std::get<0>(*host_iter),
161 std::get<0>(matrix_base_t::cache),
162 std::get<1>(*(host_iter + 1)),
163 std::get<1>(*(host_iter)),
164 std::get<1>(matrix_base_t::cache)};
168 template <std::random_access_iterator iter_t>
169 constexpr void on_column_iterator_creation(iter_t host_iter)
noexcept
172 std::get<0>(matrix_base_t::cache) = std::get<0>(*host_iter);
176 template <std::random_access_iterator iter_t>
177 constexpr void before_column_iterator_increment(iter_t SEQAN3_DOXYGEN_ONLY(host_iter))
noexcept
183 template <std::random_access_iterator iter_t>
184 constexpr void after_column_iterator_increment(iter_t host_iter)
noexcept
187 std::get<0>(matrix_base_t::cache) = std::get<0>(*host_iter);
Provides seqan3::detail::align_config_band.
Provides seqan3::detail::alignment_matrix_column_major_range_base.
Provides seqan3::detail::alignment_score_matrix_one_column_base.
Provides seqan3::detail::alignment_score_matrix_proxy.