21 namespace seqan3::detail
31 template <
typename word_t,
bool is_semi_global,
bool use_max_errors>
32 class 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)
61 : rows_size{rows_size}, columns{}
67 using word_type = word_t;
70 static constexpr
auto word_size = sizeof_bits<word_type>;
73 using value_type = detail::trace_directions;
76 using reference = value_type;
79 using size_type = size_t;
89 void reserve(
size_t const new_capacity)
91 columns.reserve(new_capacity);
96 reference
at(matrix_coordinate
const & coordinate)
const noexcept
98 size_t row = coordinate.row;
99 size_t col = coordinate.col;
101 assert(row < rows());
102 assert(col < cols());
104 column_type
const & column = columns[col];
106 if constexpr(use_max_errors)
107 if (!(row < column.max_rows))
112 if constexpr(is_semi_global)
118 return detail::trace_directions::left;
121 size_t const idx = (row - 1u) / word_size;
122 size_t const offset = (row - 1u) % word_size;
136 size_t rows() const noexcept
142 size_t cols() const noexcept
144 return columns.
size();
149 struct max_errors_state
157 struct trace_matrix_state
169 enable_state_t<true, trace_matrix_state>,
170 enable_state_t<use_max_errors, max_errors_state>
180 requires (!use_max_errors)
183 column_type column{};
198 size_t const max_rows)
200 requires use_max_errors
203 column_type column{};
207 column.max_rows = max_rows;