28 namespace seqan3::detail
52 template <
typename alignment_algorithm_t, simd_concept score_t,
typename align_local_t = std::false_type>
53 class simd_affine_gap_policy
57 friend alignment_algorithm_t;
60 using alignment_state_t = alignment_algorithm_state<score_t>;
65 constexpr simd_affine_gap_policy() noexcept = default;
66 constexpr simd_affine_gap_policy(simd_affine_gap_policy const &) noexcept = default;
67 constexpr simd_affine_gap_policy(simd_affine_gap_policy &&) noexcept = default;
68 constexpr simd_affine_gap_policy & operator=(simd_affine_gap_policy const &) noexcept = default;
69 constexpr simd_affine_gap_policy & operator=(simd_affine_gap_policy &&) noexcept = default;
70 ~simd_affine_gap_policy() noexcept = default;
73 template <typename configuration_t>
74 simd_affine_gap_policy(configuration_t const & )
95 template <
typename cell_t>
96 constexpr
void compute_cell(cell_t && current_cell,
97 alignment_algorithm_state<score_t> & state,
98 score_t
const score)
const noexcept
102 auto & [score_cell, trace_cell] = current_cell;
105 score_t tmp = score_cell.diagonal + score;
107 if constexpr (with_trace)
109 auto mask = tmp < score_cell.up;
110 tmp = (mask) ? score_cell.up : tmp;
111 trace_cell.current = (mask) ? trace_cell.up : convert_to_simd(trace_directions::diagonal) | trace_cell.up;
113 mask = tmp < score_cell.r_left;
114 tmp = (mask) ? score_cell.r_left : tmp;
115 trace_cell.current = (mask) ? trace_cell.r_left : trace_cell.current | trace_cell.r_left;
119 tmp = (tmp < score_cell.up) ? score_cell.up : tmp;
120 tmp = (tmp < score_cell.r_left) ? score_cell.r_left : tmp;
123 if constexpr (align_local_t::value)
125 tmp = (tmp < simd::fill<score_t>(0))
126 ? (trace_cell.current = convert_to_simd(trace_directions::none), simd::fill<score_t>(0))
131 score_cell.current = tmp;
133 static_cast<alignment_algorithm_t
const &
>(*this).check_score_of_cell(current_cell, state);
136 tmp += state.gap_open_score;
137 score_cell.up += state.gap_extension_score;
138 score_cell.w_left = score_cell.r_left + state.gap_extension_score;
140 auto mask = score_cell.up < tmp;
141 score_cell.up = (mask) ? tmp : score_cell.up;
142 trace_cell.up = (mask) ? convert_to_simd(trace_directions::up_open) : convert_to_simd(trace_directions::up);
143 mask = score_cell.w_left < tmp;
144 score_cell.w_left = (mask) ? tmp : score_cell.w_left;
145 trace_cell.w_left = (mask) ? convert_to_simd(trace_directions::left_open)
146 : convert_to_simd(trace_directions::
left);
162 template <
typename alignment_configuration_t>
163 constexpr
void initialise_alignment_state(alignment_configuration_t
const & config) noexcept
165 using scalar_t =
typename simd_traits<score_t>::scalar_type;
166 auto scheme = config.get_or(align_cfg::gap_cost_affine{align_cfg::open_score{-10},
167 align_cfg::extension_score{-1}});
169 alignment_state.gap_extension_score = simd::fill<score_t>(
static_cast<scalar_t
>(scheme.extension_score));
170 alignment_state.gap_open_score = simd::fill<score_t>(
static_cast<scalar_t
>(scheme.extension_score +
177 constexpr score_t convert_to_simd(trace_directions
const direction)
const noexcept
179 using scalar_t =
typename simd_traits<score_t>::scalar_type;
181 return simd::fill<score_t>(
static_cast<scalar_t
>(direction));
184 alignment_state_t alignment_state{};