SeqAn3  3.0.1
The Modern C++ library for sequence analysis.
alignment_optimum.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 <type_traits>
16 
23 #include <seqan3/std/concepts>
24 
25 namespace seqan3::detail
26 {
27 
41 template <typename score_t>
42 struct alignment_optimum
43 #if SEQAN3_DOXYGEN_ONLY(1)0
44 {
46  using index_t = IMPLEMENTATION_DEFINED;
47 
49  index_t column_index{};
51  index_t row_index{};
53  score_t score = IMPLEMENTATION_DEFINED;
54 
71  template <typename column_index_t, typename row_index_t>
72  void update_if_new_optimal_score(score_t const & compare_score,
73  column_index_type<column_index_t> column_index,
74  row_index_type<row_index_t> row_index) noexcept;
75 }
76 #endif //SEQAN3_DOXYGEN_ONLY(1): This code block is only dis
77 ;
78 
80 template <arithmetic score_t>
81 struct alignment_optimum<score_t>
82 {
83  size_t column_index{};
84  size_t row_index{};
85  score_t score{std::numeric_limits<score_t>::lowest()};
86 
87  template <std::integral column_index_t, std::integral row_index_t>
88  constexpr void update_if_new_optimal_score(score_t const & compare_score,
89  column_index_type<column_index_t> column_index,
90  row_index_type<row_index_t> row_index) noexcept
91  {
92  score = (compare_score > score)
93  ? (this->column_index = column_index.get(), this->row_index = row_index.get(), compare_score)
94  : score;
95  }
96 };
97 
98 template <simd_concept score_t>
99 struct alignment_optimum<score_t>
100 {
101  using scalar_t = typename simd_traits<score_t>::scalar_type;
102 
103  score_t column_index{};
104  score_t row_index{};
105  score_t score{simd::fill<score_t>(std::numeric_limits<scalar_t>::lowest())};
106 
107  template <std::integral column_index_t, std::integral row_index_t>
108  constexpr void update_if_new_optimal_score(score_t const & compare_score,
109  column_index_type<column_index_t> column_index,
110  row_index_type<row_index_t> row_index) noexcept
111  {
112  auto mask = compare_score > score;
113  score = mask ? compare_score : score;
114  this->column_index = mask ? simd::fill<score_t>(column_index.get()) : this->column_index;
115  this->row_index = mask ? simd::fill<score_t>(row_index.get()) : this->row_index;
116  }
117 };
119 
124 alignment_optimum() -> alignment_optimum<int32_t>;
126 
128 template <typename column_index_t, typename row_index_t, typename score_t>
129 alignment_optimum(column_index_t, row_index_t, score_t) -> alignment_optimum<score_t>;
131 
132 } // namespace seqan3::detail
matrix_coordinate.hpp
Provides seqan3::detail::alignment_coordinate and associated strong types.
template_inspection.hpp
Provides seqan3::type_list and auxiliary type traits.
concept.hpp
Provides seqan3::simd::simd_concept.
concepts
The Concepts library.
std::numeric_limits::lowest
T lowest(T... args)
simd_algorithm.hpp
Provides algorithms to modify seqan3::simd::simd_type.
simd_traits.hpp
Provides seqan3::simd::simd_traits.
core_language.hpp
Provides concepts for core language types and relations that don't have concepts in C++20 (yet).
std::numeric_limits