SeqAn3  3.0.1
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 
76  template <typename sequence1_t, typename sequence2_t>
77  constexpr void allocate_matrix(sequence1_t && sequence1, sequence2_t && sequence2)
78  {
79  score_matrix = score_matrix_t{sequence1, sequence2};
80  trace_matrix = trace_matrix_t{sequence1, sequence2};
81 
82  initialise_matrix_iterator();
83  }
84 
106  template <typename sequence1_t, typename sequence2_t, typename score_t>
107  constexpr void allocate_matrix(sequence1_t && sequence1,
108  sequence2_t && sequence2,
109  static_band const & band,
110  alignment_algorithm_state<score_t> const & state)
111  {
112  assert(state.gap_extension_score <= 0); // We expect it to never be positive.
113 
114  score_t inf = std::numeric_limits<score_t>::lowest() - state.gap_extension_score;
115  score_matrix = score_matrix_t{sequence1, sequence2, band, inf};
116  trace_matrix = trace_matrix_t{sequence1, sequence2, band};
117 
118  initialise_matrix_iterator();
119  }
120 
122  constexpr void initialise_matrix_iterator() noexcept
123  {
124  score_matrix_iter = score_matrix.begin();
125  trace_matrix_iter = trace_matrix.begin();
126  }
127 
140  template <typename sequence1_t, typename sequence2_t>
141  constexpr auto slice_sequences(sequence1_t & sequence1,
142  sequence2_t & sequence2,
143  static_band const & band) const noexcept
144  {
145  size_t seq1_size = std::ranges::distance(sequence1);
146  size_t seq2_size = std::ranges::distance(sequence2);
147 
148  auto trim_sequence1 = [&] () constexpr
149  {
150  size_t begin_pos = std::max<std::ptrdiff_t>(band.lower_bound - 1, 0);
151  size_t end_pos = std::min<std::ptrdiff_t>(band.upper_bound + seq2_size, seq1_size);
152  return sequence1 | views::slice(begin_pos, end_pos);
153  };
154 
155  auto trim_sequence2 = [&] () constexpr
156  {
157  size_t begin_pos = std::abs(std::min<std::ptrdiff_t>(band.upper_bound + 1, 0));
158  size_t end_pos = std::min<std::ptrdiff_t>(seq1_size - band.lower_bound, seq2_size);
159  return sequence2 | views::slice(begin_pos, end_pos);
160  };
161 
162  return std::tuple{trim_sequence1(), trim_sequence2()};
163  }
164 
173  constexpr auto current_alignment_column() noexcept
174  {
175  assert(!std::ranges::empty(*score_matrix_iter));
176  assert(!std::ranges::empty(*trace_matrix_iter));
177 
178  return views::zip(*score_matrix_iter, *trace_matrix_iter);
179  }
180 
187  constexpr void next_alignment_column() noexcept
188  {
189  ++score_matrix_iter;
190  ++trace_matrix_iter;
191  }
192 
193  score_matrix_t score_matrix{};
194  trace_matrix_t trace_matrix{};
195 
196  typename score_matrix_t::iterator score_matrix_iter{};
197  typename trace_matrix_t::iterator trace_matrix_iter{};
198 };
199 } // 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.
static_band.hpp
Provides seqan3::band_static.
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