28namespace seqan3::detail
52template <
typename alignment_algorithm_t, simd_concept score_t,
typename align_local_t = std::false_type>
53class 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>
97 compute_cell(cell_t && current_cell, alignment_algorithm_state<score_t> & state, score_t
const score)
const noexcept
101 auto & [score_cell, trace_cell] = current_cell;
104 score_t tmp = score_cell.diagonal + score;
106 if constexpr (with_trace)
108 auto mask = tmp < score_cell.up;
109 tmp = (mask) ? score_cell.up : tmp;
110 trace_cell.current = (mask) ? trace_cell.up : convert_to_simd(trace_directions::diagonal) | trace_cell.up;
112 mask = tmp < score_cell.r_left;
113 tmp = (mask) ? score_cell.r_left : tmp;
114 trace_cell.current = (mask) ? trace_cell.r_left : trace_cell.current | trace_cell.r_left;
118 tmp = (tmp < score_cell.up) ? score_cell.up : tmp;
119 tmp = (tmp < score_cell.r_left) ? score_cell.r_left : tmp;
122 if constexpr (align_local_t::value)
124 tmp = (tmp < simd::fill<score_t>(0))
126 ? (trace_cell.current = convert_to_simd(trace_directions::none), simd::fill<score_t>(0))
132 score_cell.current = tmp;
134 static_cast<alignment_algorithm_t
const &
>(*this).check_score_of_cell(current_cell, state);
137 tmp += state.gap_open_score;
138 score_cell.up += state.gap_extension_score;
139 score_cell.w_left = score_cell.r_left + state.gap_extension_score;
141 auto mask = score_cell.up < tmp;
142 score_cell.up = (mask) ? tmp : score_cell.up;
143 trace_cell.up = (mask) ? convert_to_simd(trace_directions::up_open) : convert_to_simd(trace_directions::up);
144 mask = score_cell.w_left < tmp;
145 score_cell.w_left = (mask) ? tmp : score_cell.w_left;
147 (mask) ? convert_to_simd(trace_directions::left_open) : 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;
167 config.get_or(align_cfg::gap_cost_affine{align_cfg::open_score{-10}, 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 =
171 simd::fill<score_t>(
static_cast<scalar_t
>(scheme.extension_score + scheme.open_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{};
Provides algorithms to modify seqan3::simd::simd_type.
Provides seqan3::align_config::gap_cost_affine.
Provides seqan3::detail::alignment_algorithm_state.
Provides seqan3::detail::alignment_optimum.
Provides seqan3::configuration and utility functions.
Provides seqan3::simd::simd_traits.
Provides the declaration of seqan3::detail::trace_directions.
Provides concepts that do not have equivalents in C++20.
Provides seqan3::simd::simd_concept.