15 #include <type_traits>
20 namespace seqan3::detail
31 struct default_find_optimum_trait
53 template <
typename alignment_algorithm_t,
typename traits_type = default_find_optimum_trait>
54 class find_optimum_policy
58 friend alignment_algorithm_t;
63 constexpr find_optimum_policy() =
default;
64 constexpr find_optimum_policy(find_optimum_policy
const &) =
default;
65 constexpr find_optimum_policy(find_optimum_policy &&) =
default;
66 constexpr find_optimum_policy & operator=(find_optimum_policy
const &) =
default;
67 constexpr find_optimum_policy & operator=(find_optimum_policy &&) =
default;
68 ~find_optimum_policy() =
default;
83 template <
typename cell_t,
typename score_t>
84 constexpr
void check_score_of_cell([[maybe_unused]] cell_t
const & current_cell,
85 [[maybe_unused]] alignment_algorithm_state<score_t> & state)
const noexcept
87 if constexpr (traits_type::find_in_every_cell_type::value)
88 check_and_update(current_cell, state);
92 template <
typename other_alignment_algorithm_t,
typename score_t,
typename is_local_t>
93 friend class affine_gap_policy;
95 template <
typename other_alignment_algorithm_t,
typename score_t,
typename is_local_t>
96 friend class simd_affine_gap_policy;
99 template <
typename other_alignment_algorithm_t,
typename other_traits_type>
100 friend class affine_gap_init_policy;
114 template <
typename cell_t,
typename score_t>
115 constexpr
void check_score_of_last_row_cell([[maybe_unused]] cell_t
const & last_row_cell,
116 [[maybe_unused]] alignment_algorithm_state<score_t> & state)
const
120 if constexpr (!traits_type::find_in_every_cell_type::value && traits_type::find_in_last_row_type::value)
121 check_and_update(last_row_cell, state);
136 template <
typename alignment_column_t,
typename score_t>
137 constexpr
void check_score_of_cells_in_last_column([[maybe_unused]] alignment_column_t && last_column,
138 [[maybe_unused]] alignment_algorithm_state<score_t> & state)
142 if constexpr (!traits_type::find_in_every_cell_type::value && traits_type::find_in_last_column_type::value)
143 for (
auto && cell : last_column)
144 check_and_update(cell, state);
159 template <
typename cell_t,
typename score_t>
160 constexpr
void check_score_of_last_cell([[maybe_unused]] cell_t
const & last_cell,
161 [[maybe_unused]] alignment_algorithm_state<score_t> & state)
const noexcept
164 if constexpr (!traits_type::find_in_every_cell_type::value &&
165 !traits_type::find_in_last_row_type::value &&
166 !traits_type::find_in_last_column_type::value)
168 check_and_update(last_cell, state);
180 template <
typename cell_t,
typename score_t>
181 constexpr
void check_and_update(cell_t
const & cell, alignment_algorithm_state<score_t> & state)
const noexcept
183 auto const & [score_cell, trace_cell] = cell;
184 state.optimum.update_if_new_optimal_score(score_cell.current,
185 column_index_type{trace_cell.coordinate.first},
186 row_index_type{trace_cell.coordinate.second});