20namespace seqan3::detail
45template <
typename alignment_algorithm_t,
typename score_t,
typename align_local_t = std::false_type>
46class affine_gap_policy
50 friend alignment_algorithm_t;
53 using alignment_state_t = alignment_algorithm_state<score_t>;
59 constexpr affine_gap_policy() noexcept = default;
60 constexpr affine_gap_policy(affine_gap_policy const &) noexcept = default;
61 constexpr affine_gap_policy(affine_gap_policy &&) noexcept = default;
62 constexpr affine_gap_policy & operator=(affine_gap_policy const &) noexcept = default;
63 constexpr affine_gap_policy & operator=(affine_gap_policy &&) noexcept = default;
64 ~affine_gap_policy() noexcept = default;
67 template <typename configuration_t>
68 affine_gap_policy(configuration_t const & )
85 template <
typename cell_t>
87 compute_cell(cell_t && current_cell, alignment_algorithm_state<score_t> & cache, score_t
const score)
const noexcept
91 auto & [score_cell, trace_cell] = current_cell;
94 score_t tmp = score_cell.diagonal + score;
96 if constexpr (with_trace)
98 tmp = (tmp < score_cell.up) ? (trace_cell.current = trace_cell.up, score_cell.up)
99 : (trace_cell.current = trace_directions::diagonal | trace_cell.up, tmp);
100 tmp = (tmp < score_cell.r_left)
101 ? (trace_cell.current = trace_cell.r_left | (trace_cell.current & trace_directions::carry_up_open),
103 : (trace_cell.current |= trace_cell.r_left, tmp);
107 tmp = (tmp < score_cell.up) ? score_cell.up : tmp;
108 tmp = (tmp < score_cell.r_left) ? score_cell.r_left : tmp;
111 if constexpr (align_local_t::value)
112 tmp = (tmp < 0) ? (trace_cell.current = trace_directions::none, 0) : tmp;
115 score_cell.current = tmp;
117 static_cast<alignment_algorithm_t
const &
>(*this).check_score_of_cell(current_cell, cache);
120 tmp += cache.gap_open_score;
121 score_cell.up += cache.gap_extension_score;
122 score_cell.w_left = score_cell.r_left + cache.gap_extension_score;
124 score_cell.up = (score_cell.up < tmp) ? (trace_cell.up = trace_directions::up_open, tmp)
125 : (trace_cell.up = trace_directions::up, score_cell.up);
126 score_cell.w_left = (score_cell.w_left < tmp) ? (trace_cell.w_left = trace_directions::left_open, tmp)
127 : (trace_cell.w_left = trace_directions::left, score_cell.w_left);
143 template <
typename cell_t>
144 constexpr void compute_first_band_cell(cell_t && current_cell,
145 alignment_algorithm_state<score_t> & cache,
146 score_t
const score)
const noexcept
151 auto & [score_cell, trace_cell] = current_cell;
152 score_cell.current = score_cell.diagonal + score;
154 score_cell.current = (score_cell.current < score_cell.r_left)
155 ? (trace_cell.current = trace_cell.r_left, score_cell.r_left)
156 : (trace_cell.current = trace_directions::diagonal, score_cell.current);
158 if constexpr (align_local_t::value)
161 (score_cell.current < 0) ? (trace_cell.current = trace_directions::none, 0) : score_cell.current;
164 static_cast<alignment_algorithm_t
const &
>(*this).check_score_of_cell(current_cell, cache);
168 score_cell.up = score_cell.current + cache.gap_open_score;
169 trace_cell.up = trace_directions::up_open;
184 template <
typename alignment_configuration_t>
185 constexpr void initialise_alignment_state(alignment_configuration_t
const & config)
noexcept
188 config.get_or(align_cfg::gap_cost_affine{align_cfg::open_score{-10}, align_cfg::extension_score{-1}});
190 alignment_state.gap_extension_score =
static_cast<score_t
>(scheme.extension_score);
191 alignment_state.gap_open_score =
static_cast<score_t
>(scheme.extension_score + scheme.open_score);
194 alignment_state_t alignment_state{};
Provides seqan3::align_config::gap_cost_affine.
Provides seqan3::detail::alignment_algorithm_state.
Provides the declaration of seqan3::detail::trace_directions.
Provides concepts that do not have equivalents in C++20.