SeqAn3 3.4.0-rc.1
The Modern C++ library for sequence analysis.
Loading...
Searching...
No Matches
policy_affine_gap_with_trace_recursion.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2006-2024 Knut Reinert & Freie Universität Berlin
2// SPDX-FileCopyrightText: 2016-2024 Knut Reinert & MPI für molekulare Genetik
3// SPDX-License-Identifier: BSD-3-Clause
4
10#pragma once
11
13
14namespace seqan3::detail
15{
16
22template <typename alignment_configuration_t>
23class policy_affine_gap_with_trace_recursion : protected policy_affine_gap_recursion<alignment_configuration_t>
24{
25protected:
27 using base_t = policy_affine_gap_recursion<alignment_configuration_t>;
28
29 // Import base types.
30 using typename base_t::affine_score_tuple_t;
31 using typename base_t::score_type;
32 using typename base_t::traits_type;
33
35 using trace_type = typename traits_type::trace_type;
37 using affine_trace_tuple_t = std::tuple<trace_type, trace_type, trace_type>;
39 using affine_cell_type = affine_cell_proxy<std::pair<affine_score_tuple_t, affine_trace_tuple_t>>;
40
41 // Import base member.
42 using base_t::first_column_is_free;
43 using base_t::first_row_is_free;
44 using base_t::gap_extension_score;
45 using base_t::gap_open_score;
46
50 policy_affine_gap_with_trace_recursion() = default;
51 policy_affine_gap_with_trace_recursion(policy_affine_gap_with_trace_recursion const &) = default;
52 policy_affine_gap_with_trace_recursion(policy_affine_gap_with_trace_recursion &&) = default;
53 policy_affine_gap_with_trace_recursion &
54 operator=(policy_affine_gap_with_trace_recursion const &) = default;
55 policy_affine_gap_with_trace_recursion &
56 operator=(policy_affine_gap_with_trace_recursion &&) = default;
57 ~policy_affine_gap_with_trace_recursion() = default;
58
60 explicit policy_affine_gap_with_trace_recursion(alignment_configuration_t const & config) : base_t{config}
61 {}
63
65 template <typename affine_cell_t>
66 affine_cell_type compute_inner_cell(score_type diagonal_score,
67 affine_cell_t previous_cell,
68 score_type const sequence_score) const noexcept
69 {
70 diagonal_score += sequence_score;
71 score_type horizontal_score = previous_cell.horizontal_score();
72 score_type vertical_score = previous_cell.vertical_score();
73 trace_directions best_trace = trace_directions::diagonal;
74
75 diagonal_score = (diagonal_score < vertical_score)
76 ? (best_trace = previous_cell.vertical_trace(), vertical_score)
77 : (best_trace |= previous_cell.vertical_trace(), diagonal_score);
78 diagonal_score =
79 (diagonal_score < horizontal_score)
80 ? (best_trace = previous_cell.horizontal_trace() | (best_trace & trace_directions::carry_up_open),
81 horizontal_score)
82 : (best_trace |= previous_cell.horizontal_trace(), diagonal_score);
83
84 score_type tmp = diagonal_score + gap_open_score;
85 vertical_score += gap_extension_score;
86 horizontal_score += gap_extension_score;
87
88 // store the vertical_score and horizontal_score value in the next path
89 trace_directions next_vertical_trace = trace_directions::up;
90 trace_directions next_horizontal_trace = trace_directions::left;
91
92 vertical_score =
93 (vertical_score < tmp) ? (next_vertical_trace = trace_directions::up_open, tmp) : vertical_score;
94 horizontal_score =
95 (horizontal_score < tmp) ? (next_horizontal_trace = trace_directions::left_open, tmp) : horizontal_score;
96
97 return {{diagonal_score, horizontal_score, vertical_score},
98 {best_trace, next_horizontal_trace, next_vertical_trace}};
99 }
100
102 affine_cell_type initialise_origin_cell() const noexcept
103 {
104 return {base_t::initialise_origin_cell(),
105 {trace_directions::none,
106 first_row_is_free ? trace_directions::none : trace_directions::left_open,
107 first_column_is_free ? trace_directions::none : trace_directions::up_open}};
108 }
109
111 template <typename affine_cell_t>
112 affine_cell_type initialise_first_column_cell(affine_cell_t previous_cell) const noexcept
113 {
114 return {base_t::initialise_first_column_cell(previous_cell),
115 {previous_cell.vertical_trace(),
116 trace_directions::left_open,
117 first_column_is_free ? trace_directions::none : trace_directions::up}};
118 }
119
121 template <typename affine_cell_t>
122 affine_cell_type initialise_first_row_cell(affine_cell_t previous_cell) const noexcept
123 {
124 return {base_t::initialise_first_row_cell(previous_cell),
125 {previous_cell.horizontal_trace(),
126 first_row_is_free ? trace_directions::none : trace_directions::left,
127 trace_directions::up_open}};
128 }
129};
130} // namespace seqan3::detail
Provides seqan3::detail::policy_affine_gap_recursion.
Hide me