SeqAn3 3.1.0
The Modern C++ library for sequence analysis.
alignment_matrix_policy.hpp
Go to the documentation of this file.
1// -----------------------------------------------------------------------------------------------------
2// Copyright (c) 2006-2021, Knut Reinert & Freie Universität Berlin
3// Copyright (c) 2016-2021, Knut Reinert & MPI für molekulare Genetik
4// This file may be used, modified and/or redistributed under the terms of the 3-clause BSD-License
5// shipped with this file and also available at: https://github.com/seqan/seqan3/blob/master/LICENSE.md
6// -----------------------------------------------------------------------------------------------------
7
13#pragma once
14
15#include <limits>
16#include <tuple>
17
23
24namespace seqan3::detail
25{
26
46template <typename alignment_algorithm_t, typename score_matrix_t, typename trace_matrix_t>
47class alignment_matrix_policy
48{
49private:
51 friend alignment_algorithm_t;
52
56 constexpr alignment_matrix_policy() = default;
57 constexpr alignment_matrix_policy(alignment_matrix_policy const &) = default;
58 constexpr alignment_matrix_policy(alignment_matrix_policy &&) = default;
59 constexpr alignment_matrix_policy & operator=(alignment_matrix_policy const &) = default;
60 constexpr alignment_matrix_policy & operator=(alignment_matrix_policy &&) = default;
61 ~alignment_matrix_policy() = default;
62
64 template <typename configuration_t>
65 alignment_matrix_policy(configuration_t const & /*config*/)
66 {}
68
81 template <typename sequence1_t, typename sequence2_t>
82 constexpr void allocate_matrix(sequence1_t && sequence1, sequence2_t && sequence2)
83 {
84 score_matrix = score_matrix_t{sequence1, sequence2};
85 trace_matrix = trace_matrix_t{sequence1, sequence2};
86
87 initialise_matrix_iterator();
88 }
89
111 template <typename sequence1_t, typename sequence2_t, typename score_t>
112 constexpr void allocate_matrix(sequence1_t && sequence1,
113 sequence2_t && sequence2,
114 align_cfg::band_fixed_size const & band,
115 alignment_algorithm_state<score_t> const & state)
116 {
117 assert(state.gap_extension_score <= 0); // We expect it to never be positive.
118
119 score_t inf = std::numeric_limits<score_t>::lowest() - state.gap_extension_score;
120 score_matrix = score_matrix_t{sequence1, sequence2, band, inf};
121 trace_matrix = trace_matrix_t{sequence1, sequence2, band};
122
123 initialise_matrix_iterator();
124 }
125
127 constexpr void initialise_matrix_iterator() noexcept
128 {
129 score_matrix_iter = score_matrix.begin();
130 trace_matrix_iter = trace_matrix.begin();
131 }
132
145 template <typename sequence1_t, typename sequence2_t>
146 constexpr auto slice_sequences(sequence1_t & sequence1,
147 sequence2_t & sequence2,
148 align_cfg::band_fixed_size const & band) const noexcept
149 {
150 size_t seq1_size = std::ranges::distance(sequence1);
151 size_t seq2_size = std::ranges::distance(sequence2);
152
153 auto trim_sequence1 = [&] () constexpr
154 {
155 size_t begin_pos = std::max<std::ptrdiff_t>(band.lower_diagonal - 1, 0);
156 size_t end_pos = std::min<std::ptrdiff_t>(band.upper_diagonal + seq2_size, seq1_size);
157 return sequence1 | views::slice(begin_pos, end_pos);
158 };
159
160 auto trim_sequence2 = [&] () constexpr
161 {
162 size_t begin_pos = std::abs(std::min<std::ptrdiff_t>(band.upper_diagonal + 1, 0));
163 size_t end_pos = std::min<std::ptrdiff_t>(seq1_size - band.lower_diagonal, seq2_size);
164 return sequence2 | views::slice(begin_pos, end_pos);
165 };
166
167 return std::tuple{trim_sequence1(), trim_sequence2()};
168 }
169
178 constexpr auto current_alignment_column() noexcept
179 {
180 assert(!std::ranges::empty(*score_matrix_iter));
181 assert(!std::ranges::empty(*trace_matrix_iter));
182
183 return views::zip(*score_matrix_iter, *trace_matrix_iter);
184 }
185
192 constexpr void next_alignment_column() noexcept
193 {
194 ++score_matrix_iter;
195 ++trace_matrix_iter;
196 }
197
198 score_matrix_t score_matrix{};
199 trace_matrix_t trace_matrix{};
200
201 typename score_matrix_t::iterator score_matrix_iter{};
202 typename trace_matrix_t::iterator trace_matrix_iter{};
203};
204} // namespace seqan3::detail
Provides seqan3::detail::align_config_band.
Provides seqan3::detail::alignment_algorithm_state.
Provides various type traits on generic types.
constexpr auto slice
A view adaptor that returns a half-open interval on the underlying range.
Definition: slice.hpp:183
constexpr auto zip
A zip view.
Definition: zip.hpp:29
T lowest(T... args)
Provides seqan3::views::slice.
Provides seqan3::views::zip.