24 namespace seqan3::detail
50 template <
typename trace_t,
bool coordinate_only = false>
51 class alignment_trace_matrix_full_banded :
52 protected alignment_trace_matrix_base<trace_t>,
53 public alignment_matrix_column_major_range_base<alignment_trace_matrix_full_banded<trace_t, coordinate_only>>
56 static_assert(std::same_as<trace_t, trace_directions> || simd_concept<trace_t>,
57 "Value type must either be a trace_directions object or a simd vector.");
60 using matrix_base_t = alignment_trace_matrix_base<trace_t>;
62 using range_base_t = alignment_matrix_column_major_range_base<alignment_trace_matrix_full_banded<trace_t,
68 using typename matrix_base_t::element_type;
69 using typename matrix_base_t::coordinate_type;
70 using typename range_base_t::alignment_column_type;
73 decltype(std::views::iota(coordinate_type{}, coordinate_type{})),
76 std::views::iota(coordinate_type{}, coordinate_type{})))>;
82 using value_type = alignment_trace_matrix_proxy<coordinate_type,
85 detail::ignore_t
const,
88 using reference = value_type;
90 using iterator =
typename range_base_t::iterator;
92 using sentinel =
typename range_base_t::sentinel;
93 using typename matrix_base_t::size_type;
99 constexpr alignment_trace_matrix_full_banded() =
default;
102 constexpr alignment_trace_matrix_full_banded(alignment_trace_matrix_full_banded
const &) =
default;
104 constexpr alignment_trace_matrix_full_banded(alignment_trace_matrix_full_banded &&) =
default;
106 constexpr alignment_trace_matrix_full_banded & operator=(alignment_trace_matrix_full_banded
const &) =
default;
108 constexpr alignment_trace_matrix_full_banded & operator=(alignment_trace_matrix_full_banded &&) =
default;
110 ~alignment_trace_matrix_full_banded() =
default;
127 template <std::ranges::forward_range first_sequence_t, std::ranges::forward_range second_sequence_t>
128 constexpr alignment_trace_matrix_full_banded(first_sequence_t && first,
129 second_sequence_t && second,
130 align_cfg::band_fixed_size
const & band,
131 [[maybe_unused]] trace_t
const initial_value = trace_t{})
133 matrix_base_t::num_cols =
static_cast<size_type
>(std::ranges::distance(first) + 1);
134 matrix_base_t::num_rows =
static_cast<size_type
>(std::ranges::distance(second) + 1);
136 band_col_index = std::min<int32_t>(std::max<int32_t>(band.upper_diagonal, 0),
137 matrix_base_t::num_cols - 1);
138 band_row_index = std::min<int32_t>(std::abs(std::min<int32_t>(band.lower_diagonal, 0)),
139 matrix_base_t::num_rows - 1);
140 band_size = band_col_index + band_row_index + 1;
143 if constexpr (!coordinate_only)
145 matrix_base_t::data =
typename matrix_base_t::pool_type{number_rows{
static_cast<size_type
>(band_size)},
146 number_cols{matrix_base_t::num_cols}};
147 matrix_base_t::cache_left.resize(band_size + 1, initial_value);
153 auto trace_path(matrix_coordinate
const & trace_begin)
155 static_assert(!coordinate_only,
"Requested trace but storing the trace was disabled!");
157 using matrix_iter_t = std::ranges::iterator_t<typename matrix_base_t::pool_type>;
158 using trace_iterator_t = trace_iterator_banded<matrix_iter_t>;
159 using path_t = std::ranges::subrange<trace_iterator_t, std::default_sentinel_t>;
161 if (trace_begin.row >=
static_cast<size_t>(band_size) || trace_begin.col >= matrix_base_t::num_cols)
164 return path_t{trace_iterator_t{matrix_base_t::data.begin() + matrix_offset{trace_begin},
165 column_index_type{band_col_index}},
166 std::default_sentinel};
170 int32_t band_col_index{};
172 int32_t band_row_index{};
178 constexpr alignment_column_type initialise_column(size_type
const column_index) noexcept
180 int32_t slice_begin = std::max<int32_t>(0, band_col_index - column_index);
181 int32_t row_end_index = column_index - band_col_index + band_size;
182 int32_t slice_end = band_size - std::max<int32_t>(row_end_index - matrix_base_t::num_rows, 0);
184 assert(row_end_index >= 0);
185 assert(slice_begin >= 0);
186 assert(slice_end > 0);
187 assert(slice_begin < slice_end);
189 coordinate_type row_begin{column_index_type{column_index}, row_index_type{
static_cast<size_type
>(slice_begin)}};
190 coordinate_type row_end{column_index_type{column_index}, row_index_type{
static_cast<size_type
>(slice_end)}};
191 if constexpr (coordinate_only)
193 return alignment_column_type{*
this,
194 column_data_view_type{std::views::iota(
std::move(row_begin),
199 matrix_coordinate band_begin{row_index_type{
static_cast<size_type
>(slice_begin)},
200 column_index_type{column_index}};
201 size_type slice_size = slice_end - slice_begin;
203 auto col = views::zip(
207 return alignment_column_type{*
this, column_data_view_type{
std::move(col)}};
212 template <std::random_access_iterator iter_t>
213 constexpr value_type make_proxy(iter_t host_iter) noexcept
215 if constexpr (coordinate_only)
217 return {*host_iter, std::ignore, std::ignore, std::ignore, std::ignore};
221 return {std::get<2>(*host_iter),
222 std::get<0>(*host_iter),
223 std::get<1>(*(host_iter + 1)),
224 std::get<1>(*host_iter),
225 matrix_base_t::cache_up