SeqAn3 3.1.0
The Modern C++ library for sequence analysis.
alignment_optimum.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 <seqan3/std/concepts>
16#include <type_traits>
17
24
25namespace seqan3::detail
26{
27
41template <typename score_t>
42struct 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
80template <arithmetic score_t>
81struct alignment_optimum<score_t>
82{
83 size_t column_index{};
84 size_t row_index{};
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
98template <simd_concept score_t>
99struct 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
125alignment_optimum() -> alignment_optimum<int32_t>;
126
128template <typename column_index_t, typename row_index_t, typename score_t>
129alignment_optimum(column_index_t, row_index_t, score_t) -> alignment_optimum<score_t>;
131
132} // namespace seqan3::detail
Provides algorithms to modify seqan3::simd::simd_type.
The <concepts> header from C++20's standard library.
Provides concepts for core language types and relations that don't have concepts in C++20 (yet).
T lowest(T... args)
Provides seqan3::detail::matrix_index, seqan3::detail::matrix_coordinate and associated strong types.
Provides seqan3::simd::simd_traits.
Provides type traits for working with templates.
Provides seqan3::simd::simd_concept.