25 namespace seqan3::detail
43 template <
typename alignment_configuration_t>
44 class policy_affine_gap_recursion
48 using traits_type = alignment_configuration_traits<alignment_configuration_t>;
50 using score_type =
typename traits_type::score_type;
52 using affine_cell_type = affine_cell_proxy<std::tuple<score_type, score_type, score_type>>;
55 score_type gap_extension_score{};
57 score_type gap_open_score{};
60 bool first_row_is_free{};
62 bool first_column_is_free{};
67 policy_affine_gap_recursion() =
default;
68 policy_affine_gap_recursion(policy_affine_gap_recursion
const &) =
default;
69 policy_affine_gap_recursion(policy_affine_gap_recursion &&) =
default;
70 policy_affine_gap_recursion & operator=(policy_affine_gap_recursion
const &) =
default;
71 policy_affine_gap_recursion & operator=(policy_affine_gap_recursion &&) =
default;
72 ~policy_affine_gap_recursion() =
default;
83 explicit policy_affine_gap_recursion(alignment_configuration_t
const & config)
86 auto const & selected_gap_scheme = config.get_or(align_cfg::gap_cost_affine{align_cfg::open_score{-10},
87 align_cfg::extension_score{-1}});
89 if constexpr (simd::simd_concept<score_type>)
91 gap_extension_score = simd::fill<score_type>(selected_gap_scheme.extension_score);
92 gap_open_score = simd::fill<score_type>(selected_gap_scheme.open_score) + gap_extension_score;
96 gap_extension_score =
static_cast<score_type
>(selected_gap_scheme.extension_score);
97 gap_open_score =
static_cast<score_type
>(selected_gap_scheme.open_score) + gap_extension_score;
100 auto method_global_config = config.get_or(align_cfg::method_global{});
101 first_row_is_free = method_global_config.free_end_gaps_sequence1_leading;
102 first_column_is_free = method_global_config.free_end_gaps_sequence2_leading;
123 template <
typename affine_cell_t>
125 requires is_type_specialisation_of_v<affine_cell_t, affine_cell_proxy>
127 affine_cell_type compute_inner_cell(score_type diagonal_score,
128 affine_cell_t previous_cell,
129 score_type
const sequence_score)
const noexcept
131 diagonal_score += sequence_score;
132 score_type horizontal_score = previous_cell.horizontal_score();
133 score_type vertical_score = previous_cell.vertical_score();
135 diagonal_score = (diagonal_score < vertical_score) ? vertical_score : diagonal_score;
136 diagonal_score = (diagonal_score < horizontal_score) ? horizontal_score : diagonal_score;
138 score_type tmp = diagonal_score + gap_open_score;
139 vertical_score += gap_extension_score;
140 horizontal_score += gap_extension_score;
143 vertical_score = (vertical_score < tmp) ? tmp : vertical_score;
144 horizontal_score = (horizontal_score < tmp) ? tmp : horizontal_score;
146 return {diagonal_score, horizontal_score, vertical_score};
159 affine_cell_type initialise_origin_cell() const noexcept
161 return {score_type{},
162 first_row_is_free ? score_type{} : gap_open_score,
163 first_column_is_free ? score_type{} : gap_open_score};
180 template <
typename affine_cell_t>
182 requires is_type_specialisation_of_v<affine_cell_t, affine_cell_proxy>
184 affine_cell_type initialise_first_column_cell(affine_cell_t previous_cell)
const noexcept
186 score_type new_vertical = previous_cell.vertical_score() + gap_extension_score;
187 return {previous_cell.vertical_score(),
188 previous_cell.vertical_score() + gap_open_score,
189 first_column_is_free ? previous_cell.vertical_score() : new_vertical};
206 template <
typename affine_cell_t>
208 requires is_type_specialisation_of_v<affine_cell_t, affine_cell_proxy>
210 affine_cell_type initialise_first_row_cell(affine_cell_t previous_cell)
const noexcept
212 score_type new_horizontal_score = previous_cell.horizontal_score() + gap_extension_score;
213 return {previous_cell.horizontal_score(),
214 first_row_is_free ? previous_cell.horizontal_score() : new_horizontal_score,
215 previous_cell.horizontal_score() + gap_open_score};
228 score_type lowest_viable_score() const noexcept
230 assert(gap_open_score <= 0 && gap_extension_score <= 0);