21 namespace seqan3::detail
35 template <
typename alignment_algorithm_t>
36 class affine_gap_init_policy
40 friend alignment_algorithm_t;
43 bool first_row_is_free{};
45 bool first_column_is_free{};
51 constexpr affine_gap_init_policy() noexcept = default;
52 constexpr affine_gap_init_policy(affine_gap_init_policy const &) noexcept = default;
53 constexpr affine_gap_init_policy(affine_gap_init_policy &&) noexcept = default;
54 constexpr affine_gap_init_policy & operator=(affine_gap_init_policy const &) noexcept = default;
55 constexpr affine_gap_init_policy & operator=(affine_gap_init_policy &&) noexcept = default;
56 ~affine_gap_init_policy() noexcept = default;
59 template <typename config_t>
60 affine_gap_init_policy(config_t const & config)
62 bool is_local = config.template exists<align_cfg::method_local>();
63 auto method_global_config = config.get_or(align_cfg::method_global{});
64 first_row_is_free = method_global_config.free_end_gaps_sequence1_leading | is_local;
65 first_column_is_free = method_global_config.free_end_gaps_sequence2_leading | is_local;
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 (first_column_is_free)
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 (first_row_is_free)
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 (first_column_is_free)
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 (first_row_is_free)
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));