20 namespace seqan3::detail
31 struct default_affine_init_traits
50 template <
typename alignment_algorithm_t,
typename traits_type = default_affine_init_traits>
51 class affine_gap_init_policy
55 friend alignment_algorithm_t;
61 constexpr affine_gap_init_policy() noexcept = default;
62 constexpr affine_gap_init_policy(affine_gap_init_policy const &) noexcept = default;
63 constexpr affine_gap_init_policy(affine_gap_init_policy &&) noexcept = default;
64 constexpr affine_gap_init_policy & operator=(affine_gap_init_policy const &) noexcept = default;
65 constexpr affine_gap_init_policy & operator=(affine_gap_init_policy &&) noexcept = default;
66 ~affine_gap_init_policy() noexcept = default;
83 template <typename cell_t, typename score_t>
84 constexpr auto init_origin_cell(cell_t && origin_cell, alignment_algorithm_state<score_t> & state) const noexcept
88 auto & [score_cell, trace_cell] = origin_cell;
91 score_cell.current = convert_to_simd_maybe<score_t>(0);
92 trace_cell.current = convert_to_simd_maybe<score_t>(trace_directions::none);
94 static_cast<alignment_algorithm_t const &>(*this).check_score_of_cell(origin_cell, state);
97 if constexpr (traits_type::free_second_leading_t::value)
99 score_cell.up = convert_to_simd_maybe<score_t>(0);
100 trace_cell.up = convert_to_simd_maybe<score_t>(trace_directions::none);
104 score_cell.up = state.gap_open_score;
105 trace_cell.up = convert_to_simd_maybe<score_t>(trace_directions::up_open);
109 if constexpr (traits_type::free_first_leading_t::value)
111 score_cell.w_left = convert_to_simd_maybe<score_t>(0);
112 trace_cell.w_left = convert_to_simd_maybe<score_t>(trace_directions::none);
116 score_cell.w_left = state.gap_open_score;
117 trace_cell.w_left = convert_to_simd_maybe<score_t>(trace_directions::left_open);
135 template <
typename cell_t,
typename score_t>
136 constexpr
auto init_column_cell(cell_t && column_cell, alignment_algorithm_state<score_t> & state)
const noexcept
140 auto & [score_cell, trace_cell] = column_cell;
142 score_cell.current = score_cell.up;
143 trace_cell.current = trace_cell.up;
145 static_cast<alignment_algorithm_t const &>(*this).check_score_of_cell(column_cell, state);
148 if constexpr (traits_type::free_second_leading_t::value)
150 score_cell.up = convert_to_simd_maybe<score_t>(0);
154 score_cell.up += state.gap_extension_score;
155 trace_cell.up = convert_to_simd_maybe<score_t>(trace_directions::up);
158 score_cell.w_left = score_cell.current + state.gap_open_score;
159 trace_cell.w_left = convert_to_simd_maybe<score_t>(trace_directions::left_open);
176 template <
typename cell_t,
typename score_t>
177 constexpr
auto init_row_cell(cell_t && row_cell, alignment_algorithm_state<score_t> & state)
const noexcept
181 auto & [score_cell, trace_cell] = row_cell;
183 score_cell.current = score_cell.r_left;
184 trace_cell.current = trace_cell.r_left;
186 static_cast<alignment_algorithm_t const &>(*this).check_score_of_cell(row_cell, state);
188 score_cell.up = score_cell.current + state.gap_open_score;
189 trace_cell.up = convert_to_simd_maybe<score_t>(trace_directions::up_open);
191 if constexpr (traits_type::free_first_leading_t::value)
193 score_cell.w_left = convert_to_simd_maybe<score_t>(0);
194 trace_cell.w_left = convert_to_simd_maybe<score_t>(trace_directions::none);
198 score_cell.w_left = score_cell.r_left + state.gap_extension_score;
199 trace_cell.w_left = convert_to_simd_maybe<score_t>(trace_directions::left);
215 template <
typename score_t,
typename value_t>
216 constexpr
auto convert_to_simd_maybe(value_t
const value)
const noexcept
218 if constexpr (simd_concept<score_t>)
220 using scalar_t =
typename simd_traits<score_t>::scalar_type;
221 return simd::fill<score_t>(static_cast<scalar_t>(value));