20 namespace seqan3::detail
45 template <
typename alignment_algorithm_t,
typename score_t,
typename align_local_t = std::false_type>
46 class 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;
80 template <typename cell_t>
81 constexpr
void compute_cell(cell_t && current_cell,
82 alignment_algorithm_state<score_t> & cache,
83 score_t const score) const noexcept
87 auto & [score_cell, trace_cell] = current_cell;
90 score_t tmp = score_cell.diagonal + score;
92 if constexpr (with_trace)
94 tmp = (tmp < score_cell.up) ? (trace_cell.current = trace_cell.up, score_cell.up)
95 : (trace_cell.current = trace_directions::diagonal | trace_cell.up, tmp);
96 tmp = (tmp < score_cell.r_left) ? (trace_cell.current = trace_cell.r_left, score_cell.r_left)
97 : (trace_cell.current |= trace_cell.r_left, tmp);
101 tmp = (tmp < score_cell.up) ? score_cell.up : tmp;
102 tmp = (tmp < score_cell.r_left) ? score_cell.r_left : tmp;
105 if constexpr (align_local_t::value)
106 tmp = (tmp < 0) ? (trace_cell.current = trace_directions::none, 0) : tmp;
109 score_cell.current = tmp;
111 static_cast<alignment_algorithm_t const &>(*this).check_score_of_cell(current_cell, cache);
114 tmp += cache.gap_open_score;
115 score_cell.up += cache.gap_extension_score;
116 score_cell.w_left = score_cell.r_left + cache.gap_extension_score;
118 score_cell.up = (score_cell.up < tmp) ? (trace_cell.up = trace_directions::up_open, tmp)
119 : (trace_cell.up = trace_directions::up, score_cell.up);
120 score_cell.w_left = (score_cell.w_left < tmp) ? (trace_cell.w_left = trace_directions::left_open, tmp)
121 : (trace_cell.w_left = trace_directions::left, score_cell.w_left);
137 template <
typename cell_t>
138 constexpr
void compute_first_band_cell(cell_t && current_cell,
139 alignment_algorithm_state<score_t> & cache,
140 score_t
const score)
const noexcept
145 auto & [score_cell, trace_cell] = current_cell;
146 score_cell.current = score_cell.diagonal + score;
148 score_cell.current = (score_cell.current < score_cell.r_left)
149 ? (trace_cell.current = trace_cell.r_left, score_cell.r_left)
150 : (trace_cell.current = trace_directions::diagonal, score_cell.current);
152 if constexpr (align_local_t::value)
154 score_cell.current = (score_cell.current < 0) ? (trace_cell.current = trace_directions::none, 0)
155 : score_cell.current;
158 static_cast<alignment_algorithm_t const &>(*this).check_score_of_cell(current_cell, cache);
162 score_cell.up = score_cell.current + cache.gap_open_score;
163 trace_cell.up = trace_directions::up_open;
179 template <
typename alignment_configuration_t>
180 constexpr
void initialise_alignment_state(alignment_configuration_t
const & config) noexcept
182 auto scheme = config.template value_or<align_cfg::gap>(gap_scheme{gap_score{-1}, gap_open_score{-10}});
184 alignment_state.gap_extension_score = static_cast<score_t>(scheme.get_gap_score());
185 alignment_state.gap_open_score = static_cast<score_t>(scheme.get_gap_score() + scheme.get_gap_open_score());
188 alignment_state_t alignment_state{};