21namespace seqan3::detail
31template <
typename word_t,
bool is_semi_global,
bool use_max_errors>
32class edit_distance_trace_matrix_full
36 template <std::ranges::viewable_range database_t,
37 std::ranges::viewable_range query_t,
38 typename align_config_t,
40 friend class edit_distance_unbanded;
45 edit_distance_trace_matrix_full() =
default;
46 edit_distance_trace_matrix_full(edit_distance_trace_matrix_full
const &) =
default;
47 edit_distance_trace_matrix_full(edit_distance_trace_matrix_full &&) =
default;
48 edit_distance_trace_matrix_full & operator=(edit_distance_trace_matrix_full
const &) =
default;
49 edit_distance_trace_matrix_full & operator=(edit_distance_trace_matrix_full &&) =
default;
50 ~edit_distance_trace_matrix_full() =
default;
54 template <
typename derived_t,
typename edit_traits>
55 friend class edit_distance_unbanded_trace_matrix_policy;
60 edit_distance_trace_matrix_full(
size_t const rows_size) : rows_size{rows_size}, columns{}
65 struct trace_path_iterator;
69 using word_type = word_t;
72 static constexpr auto word_size = bits_of<word_type>;
75 using value_type = detail::trace_directions;
78 using reference = value_type;
81 using size_type = size_t;
91 void reserve(
size_t const new_capacity)
93 columns.reserve(new_capacity);
98 reference
at(matrix_coordinate
const & coordinate)
const noexcept
100 size_t row = coordinate.row;
101 size_t col = coordinate.col;
103 assert(row < rows());
104 assert(col < cols());
106 column_type
const & column = columns[col];
108 if constexpr (use_max_errors)
109 if (!(row < column.max_rows))
114 if constexpr (is_semi_global)
120 return detail::trace_directions::left;
123 size_t const idx = (row - 1u) / word_size;
124 size_t const offset = (row - 1u) % word_size;
138 size_t rows() const noexcept
144 size_t cols() const noexcept
146 return columns.
size();
155 auto trace_path(matrix_coordinate
const & trace_begin)
const
157 if (trace_begin.row >= rows() || trace_begin.col >= cols())
158 throw std::invalid_argument{
"The given coordinate exceeds the matrix in vertical or horizontal direction."};
160 using path_t = std::ranges::subrange<trace_path_iterator, std::default_sentinel_t>;
161 return path_t{trace_path_iterator{
this, trace_begin}, std::default_sentinel};
166 struct max_errors_state
174 struct trace_matrix_state
185 struct column_type : enable_state_t<true, trace_matrix_state>, enable_state_t<use_max_errors, max_errors_state>
194 requires (!use_max_errors)
196 column_type column{};
197 column.left = std::move(left);
198 column.diagonal = std::move(diagonal);
199 column.up = std::move(up);
201 columns.push_back(std::move(column));
213 size_t const max_rows)
214 requires use_max_errors
216 column_type column{};
217 column.left = std::move(left);
218 column.diagonal = std::move(diagonal);
219 column.up = std::move(up);
220 column.max_rows = max_rows;
222 columns.push_back(std::move(column));
246template <
typename word_t,
bool is_semi_global,
bool use_max_errors>
247struct edit_distance_trace_matrix_full<word_t, is_semi_global, use_max_errors>::trace_path_iterator
255 using value_type = detail::trace_directions;
261 static constexpr value_type D = value_type::diagonal;
263 static constexpr value_type L = value_type::left;
265 static constexpr value_type U = value_type::up;
267 static constexpr value_type N = value_type::none;
273 constexpr value_type operator*()
const
275 value_type dir = parent->at(coordinate());
282 else if ((dir & U) == U)
289 [[nodiscard]]
constexpr matrix_coordinate
const & coordinate()
const
299 constexpr trace_path_iterator & operator++()
301 value_type dir = *(*this);
305 coordinate_.col = std::max<size_t>(coordinate_.col, 1) - 1;
307 else if ((dir & U) == U)
309 coordinate_.row = std::max<size_t>(coordinate_.row, 1) - 1;
311 else if ((dir & D) == D)
313 coordinate_.row = std::max<size_t>(coordinate_.row, 1) - 1;
314 coordinate_.col = std::max<size_t>(coordinate_.col, 1) - 1;
320 assert(dir != N || coordinate_.row == 0 || coordinate_.col == 0);
326 constexpr void operator++(
int)
336 friend bool operator==(trace_path_iterator
const & it, std::default_sentinel_t)
338 return *it == value_type::none;
342 friend bool operator==(std::default_sentinel_t, trace_path_iterator
const & it)
344 return it == std::default_sentinel;
348 friend bool operator!=(trace_path_iterator
const & it, std::default_sentinel_t)
350 return !(it == std::default_sentinel);
354 friend bool operator!=(std::default_sentinel_t, trace_path_iterator
const & it)
356 return it != std::default_sentinel;
361 edit_distance_trace_matrix_full
const * parent{
nullptr};
363 matrix_coordinate coordinate_{};
Provides utility functions for bit twiddling.
Forwards for seqan3::edit_distance_unbanded related types.
@ none
No flag is set.
Definition: debug_stream_type.hpp:32
@ offset
Sequence (seqan3::field::seq) relative start position (0-based), unsigned value.
typename decltype(detail::at< idx >(list_t{}))::type at
Return the type at given index from the type list.
Definition: traits.hpp:279
Provides the declaration of seqan3::detail::trace_directions.