24namespace seqan3::detail
49template <
typename trace_t,
bool coordinate_only = false>
50class alignment_trace_matrix_full :
51 protected alignment_trace_matrix_base<trace_t>,
52 public alignment_matrix_column_major_range_base<alignment_trace_matrix_full<trace_t, coordinate_only>>
55 static_assert(std::same_as<trace_t, trace_directions> || simd_concept<trace_t>,
56 "Value type must either be a trace_directions object or a simd vector.");
59 using matrix_base_t = alignment_trace_matrix_base<trace_t>;
62 alignment_matrix_column_major_range_base<alignment_trace_matrix_full<trace_t, coordinate_only>>;
68 using typename matrix_base_t::coordinate_type;
69 using typename matrix_base_t::element_type;
70 using typename range_base_t::alignment_column_type;
72 using column_data_view_type =
74 decltype(std::views::iota(coordinate_type{}, coordinate_type{})),
77 std::views::iota(coordinate_type{}, coordinate_type{})))>;
85 alignment_trace_matrix_proxy<coordinate_type,
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() =
default;
100 constexpr alignment_trace_matrix_full(alignment_trace_matrix_full
const &) =
default;
101 constexpr alignment_trace_matrix_full(alignment_trace_matrix_full &&) =
default;
102 constexpr alignment_trace_matrix_full & operator=(alignment_trace_matrix_full
const &) =
default;
103 constexpr alignment_trace_matrix_full & operator=(alignment_trace_matrix_full &&) =
default;
104 ~alignment_trace_matrix_full() =
default;
119 template <std::ranges::forward_range first_sequence_t, std::ranges::forward_range second_sequence_t>
120 constexpr alignment_trace_matrix_full(first_sequence_t && first,
121 second_sequence_t && second,
122 [[maybe_unused]] trace_t
const initial_value = trace_t{})
124 matrix_base_t::num_cols =
static_cast<size_type
>(std::ranges::distance(first) + 1);
125 matrix_base_t::num_rows =
static_cast<size_type
>(std::ranges::distance(second) + 1);
127 if constexpr (!coordinate_only)
130 matrix_base_t::data =
typename matrix_base_t::pool_type{number_rows{matrix_base_t::num_rows},
131 number_cols{matrix_base_t::num_cols}};
132 matrix_base_t::cache_left.resize(matrix_base_t::num_rows, initial_value);
143 auto trace_path(matrix_coordinate
const & trace_begin)
145 static_assert(!coordinate_only,
"Requested trace but storing the trace was disabled!");
147 using matrix_iter_t = std::ranges::iterator_t<typename matrix_base_t::pool_type>;
148 using trace_iterator_t = trace_iterator<matrix_iter_t>;
149 using path_t = std::ranges::subrange<trace_iterator_t, std::default_sentinel_t>;
151 if (trace_begin.row >= matrix_base_t::num_rows || trace_begin.col >= matrix_base_t::num_cols)
152 throw std::invalid_argument{
"The given coordinate exceeds the matrix in vertical or horizontal direction."};
154 return path_t{trace_iterator_t{matrix_base_t::data.begin() + matrix_offset{trace_begin}},
155 std::default_sentinel};
160 constexpr alignment_column_type initialise_column(size_type
const column_index)
noexcept
162 coordinate_type row_begin{column_index_type{column_index}, row_index_type{0u}};
163 coordinate_type row_end{column_index_type{column_index}, row_index_type{matrix_base_t::num_rows}};
164 if constexpr (coordinate_only)
166 return alignment_column_type{
168 column_data_view_type{std::views::iota(std::move(row_begin), std::move(row_end))}};
172 matrix_coordinate current_position{row_index_type{0u}, column_index_type{column_index}};
176 std::views::iota(std::move(row_begin), std::move(row_end)));
177 return alignment_column_type{*
this, column_data_view_type{col}};
182 template <std::random_access_iterator iter_t>
183 constexpr value_type make_proxy(iter_t host_iter)
noexcept
185 if constexpr (coordinate_only)
187 return {*host_iter, std::ignore, std::ignore, std::ignore, std::ignore};
192 std::get<2>(*host_iter),
193 std::get<0>(*host_iter),
194 std::get<1>(*host_iter),
195 std::get<1>(*host_iter),
196 matrix_base_t::cache_up,
Provides seqan3::detail::alignment_matrix_column_major_range_base.
Provides seqan3::detail::alignment_trace_matrix_base.
Provides seqan3::detail::alignment_trace_matrix_proxy.
seqan::std::views::zip zip
A view adaptor that takes several views and returns tuple-like values from every i-th element of each...
Definition: zip.hpp:27
Provides seqan3::detail::trace_iterator.
Provides seqan3::views::zip.