SeqAn3  3.0.2
The Modern C++ library for sequence analysis.
alignment_matrix_policy.hpp
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------------------------------
2 // Copyright (c) 2006-2020, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2020, 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 
24 namespace seqan3::detail
25 {
26 
46 template <typename alignment_algorithm_t, typename score_matrix_t, typename trace_matrix_t>
47 class alignment_matrix_policy
48 {
49 private:
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
zip.hpp
Provides seqan3::views::zip.
basic.hpp
Provides various type traits on generic types.
tuple
std::numeric_limits::lowest
T lowest(T... args)
slice.hpp
Provides seqan3::views::slice.
align_config_band.hpp
Provides seqan3::detail::align_config_band.
limits
alignment_algorithm_state.hpp
Provides seqan3::detail::alignment_algorithm_state.
seqan3::views::slice
constexpr auto slice
A view adaptor that returns a half-open interval on the underlying range.
Definition: slice.hpp:141