29 namespace seqan3::detail
53 template <
typename alignment_algorithm_t, simd_concept score_t,
typename align_local_t = std::false_type>
54 class simd_affine_gap_policy
58 friend alignment_algorithm_t;
61 using alignment_state_t = alignment_algorithm_state<score_t>;
66 constexpr simd_affine_gap_policy() noexcept = default;
67 constexpr simd_affine_gap_policy(simd_affine_gap_policy const &) noexcept = default;
68 constexpr simd_affine_gap_policy(simd_affine_gap_policy &&) noexcept = default;
69 constexpr simd_affine_gap_policy & operator=(simd_affine_gap_policy const &) noexcept = default;
70 constexpr simd_affine_gap_policy & operator=(simd_affine_gap_policy &&) noexcept = default;
71 ~simd_affine_gap_policy() noexcept = default;
91 template <typename cell_t>
92 constexpr
void compute_cell(cell_t && current_cell,
93 alignment_algorithm_state<score_t> & state,
94 score_t const score) const noexcept
98 auto & [score_cell, trace_cell] = current_cell;
101 score_t tmp = score_cell.diagonal + score;
103 if constexpr (with_trace)
105 auto mask = tmp < score_cell.up;
106 tmp = (mask) ? score_cell.up : tmp;
107 trace_cell.current = (mask) ? trace_cell.up : convert_to_simd(trace_directions::diagonal) | trace_cell.up;
109 mask = tmp < score_cell.r_left;
110 tmp = (mask) ? score_cell.r_left : tmp;
111 trace_cell.current = (mask) ? trace_cell.r_left : trace_cell.current | trace_cell.r_left;
115 tmp = (tmp < score_cell.up) ? score_cell.up : tmp;
116 tmp = (tmp < score_cell.r_left) ? score_cell.r_left : tmp;
119 if constexpr (align_local_t::value)
121 tmp = (tmp < simd::fill<score_t>(0))
122 ? (trace_cell.current = convert_to_simd(trace_directions::none), simd::fill<score_t>(0))
127 score_cell.current = tmp;
129 static_cast<alignment_algorithm_t const &>(*this).check_score_of_cell(current_cell, state);
132 tmp += state.gap_open_score;
133 score_cell.up += state.gap_extension_score;
134 score_cell.w_left = score_cell.r_left + state.gap_extension_score;
136 auto mask = score_cell.up < tmp;
137 score_cell.up = (mask) ? tmp : score_cell.up;
138 trace_cell.up = (mask) ? convert_to_simd(trace_directions::up_open) : convert_to_simd(trace_directions::up);
139 mask = score_cell.w_left < tmp;
140 score_cell.w_left = (mask) ? tmp : score_cell.w_left;
141 trace_cell.w_left = (mask) ? convert_to_simd(trace_directions::left_open)
142 : convert_to_simd(trace_directions::
left);
158 template <
typename alignment_configuration_t>
159 constexpr
void initialise_alignment_state(alignment_configuration_t
const & config) noexcept
161 using scalar_t =
typename simd_traits<score_t>::scalar_type;
162 auto scheme = config.template value_or<align_cfg::gap>(gap_scheme{gap_score{-1}, gap_open_score{-10}});
164 alignment_state.gap_extension_score = simd::fill<score_t>(static_cast<scalar_t>(scheme.get_gap_score()));
165 alignment_state.gap_open_score = simd::fill<score_t>(static_cast<scalar_t>(scheme.get_gap_score() +
166 scheme.get_gap_open_score()));
172 constexpr score_t convert_to_simd(trace_directions
const direction)
const noexcept
174 using scalar_t =
typename simd_traits<score_t>::scalar_type;
176 return simd::fill<score_t>(static_cast<scalar_t>(direction));
179 alignment_state_t alignment_state{};