SeqAn3 3.3.0-rc.1
The Modern C++ library for sequence analysis.
policy_affine_gap_recursion.hpp
Go to the documentation of this file.
1// -----------------------------------------------------------------------------------------------------
2// Copyright (c) 2006-2022, Knut Reinert & Freie Universität Berlin
3// Copyright (c) 2016-2022, 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
14#pragma once
15
16#include <tuple>
17
24
25namespace seqan3::detail
26{
27
43template <typename alignment_configuration_t>
45{
46protected:
57
62
67
77
87 explicit policy_affine_gap_recursion(alignment_configuration_t const & config)
88 {
89 // Get the gap scheme from the config or choose -1 and -10 as default.
90 auto const & selected_gap_scheme =
92
93 gap_extension_score = maybe_convert_to_simd(selected_gap_scheme.extension_score);
94 gap_open_score = maybe_convert_to_simd(selected_gap_scheme.open_score) + gap_extension_score;
95
96 auto method_global_config = config.get_or(align_cfg::method_global{});
97 first_row_is_free = method_global_config.free_end_gaps_sequence1_leading;
98 first_column_is_free = method_global_config.free_end_gaps_sequence2_leading;
99 }
101
119 template <typename affine_cell_t>
121 affine_cell_t previous_cell,
122 score_type const sequence_score) const noexcept
123 {
124 diagonal_score += sequence_score;
125 score_type horizontal_score = previous_cell.horizontal_score();
126 score_type vertical_score = previous_cell.vertical_score();
127
128 diagonal_score = (diagonal_score < vertical_score) ? vertical_score : diagonal_score;
129 diagonal_score = (diagonal_score < horizontal_score) ? horizontal_score : diagonal_score;
130
131 score_type tmp = diagonal_score + gap_open_score;
132 vertical_score += gap_extension_score;
133 horizontal_score += gap_extension_score;
134
135 // store the vertical_score and horizontal_score value in the next path
136 vertical_score = (vertical_score < tmp) ? tmp : vertical_score;
137 horizontal_score = (horizontal_score < tmp) ? tmp : horizontal_score;
138
139 return {diagonal_score, horizontal_score, vertical_score};
140 }
141
153 {
154 return {score_type{},
157 }
158
173 template <typename affine_cell_t>
174 affine_cell_type initialise_first_column_cell(affine_cell_t previous_cell) const noexcept
175 {
176 score_type new_vertical = previous_cell.vertical_score() + gap_extension_score;
177 return {previous_cell.vertical_score(),
178 previous_cell.vertical_score() + gap_open_score,
179 first_column_is_free ? previous_cell.vertical_score() : new_vertical};
180 }
181
196 template <typename affine_cell_t>
197 affine_cell_type initialise_first_row_cell(affine_cell_t previous_cell) const noexcept
198 {
199 score_type new_horizontal_score = previous_cell.horizontal_score() + gap_extension_score;
200 return {previous_cell.horizontal_score(),
201 first_row_is_free ? previous_cell.horizontal_score() : new_horizontal_score,
202 previous_cell.horizontal_score() + gap_open_score};
203 }
204
216 {
217 if constexpr (simd_concept<score_type>)
218 assert(gap_open_score[0] <= 0 && gap_extension_score[0] <= 0);
219 else
220 assert(gap_open_score <= 0 && gap_extension_score <= 0);
221
224 }
225
233 template <typename score_t>
235 constexpr auto maybe_convert_to_simd(score_t && score) const noexcept
236 {
237 if constexpr (simd_concept<score_type>)
238 return simd::fill<score_type>(std::forward<score_t>(score));
239 else // Return unmodified.
240 return std::forward<score_t>(score);
241 }
242};
243} // namespace seqan3::detail
Provides seqan3::detail::affine_cell_proxy.
Provides algorithms to modify seqan3::simd::simd_type.
Provides seqan3::align_config::gap_cost_affine.
Provides helper type traits for the configuration and execution of the alignment algorithm.
A configuration element for the affine gap cost scheme.
Definition: align_config_gap_cost_affine.hpp:75
Sets the global alignment method.
Definition: align_config_method.hpp:122
A proxy for an affine score matrix cell.
Definition: affine_cell_proxy.hpp:117
decltype(auto) vertical_score() &noexcept
Access the vertical score of the wrapped score matrix cell.
Definition: affine_cell_proxy.hpp:234
decltype(auto) horizontal_score() &noexcept
Access the horizontal score of the wrapped score matrix cell.
Definition: affine_cell_proxy.hpp:213
Implements the alignment recursion function for the alignment algorithm using affine gap costs.
Definition: policy_affine_gap_recursion.hpp:45
affine_cell_type compute_inner_cell(score_type diagonal_score, affine_cell_t previous_cell, score_type const sequence_score) const noexcept
Computes an inner cell of the alignment matrix.
Definition: policy_affine_gap_recursion.hpp:120
policy_affine_gap_recursion(policy_affine_gap_recursion &&)=default
Defaulted.
bool first_row_is_free
Initialisation state of the first row of the alignment.
Definition: policy_affine_gap_recursion.hpp:64
policy_affine_gap_recursion & operator=(policy_affine_gap_recursion const &)=default
Defaulted.
affine_cell_type initialise_first_row_cell(affine_cell_t previous_cell) const noexcept
Initialises the first cell of a alignment matrix column.
Definition: policy_affine_gap_recursion.hpp:197
affine_cell_type initialise_origin_cell() const noexcept
Initialises the first cell of the alignment matrix in the top left corner of the matrix.
Definition: policy_affine_gap_recursion.hpp:152
score_type gap_extension_score
The score for a gap extension.
Definition: policy_affine_gap_recursion.hpp:59
typename traits_type::score_type score_type
The configured score type.
Definition: policy_affine_gap_recursion.hpp:52
score_type gap_open_score
The score for a gap opening including the gap extension.
Definition: policy_affine_gap_recursion.hpp:61
bool first_column_is_free
Initialisation state of the first column of the alignment.
Definition: policy_affine_gap_recursion.hpp:66
typename traits_type::original_score_type original_score_type
The configured original score type.
Definition: policy_affine_gap_recursion.hpp:50
score_type lowest_viable_score() const noexcept
Returns the lowest viable score.
Definition: policy_affine_gap_recursion.hpp:215
policy_affine_gap_recursion & operator=(policy_affine_gap_recursion &&)=default
Defaulted.
constexpr auto maybe_convert_to_simd(score_t &&score) const noexcept
Converts the given score type to a simd vector if the alignment is executed in vectorised mode.
Definition: policy_affine_gap_recursion.hpp:235
policy_affine_gap_recursion(policy_affine_gap_recursion const &)=default
Defaulted.
affine_cell_type initialise_first_column_cell(affine_cell_t previous_cell) const noexcept
Initialises a cell of the first alignment matrix column.
Definition: policy_affine_gap_recursion.hpp:174
policy_affine_gap_recursion(alignment_configuration_t const &config)
Construction and initialisation using the alignment configuration.
Definition: policy_affine_gap_recursion.hpp:87
A type that satisfies std::is_arithmetic_v<t>.
The generic simd concept.
The internal SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
A strong type of underlying type int32_t that represents the score (usually negative) of any characte...
Definition: align_config_gap_cost_affine.hpp:51
A strong type of underlying type int32_t that represents a score (usually negative) that is incurred ...
Definition: align_config_gap_cost_affine.hpp:34
A traits type for the alignment algorithm that exposes static information stored within the alignment...
Definition: alignment/pairwise/detail/type_traits.hpp:83
std::conditional_t< is_vectorised, simd_type_t< original_score_type >, original_score_type > score_type
The score type for the alignment algorithm.
Definition: alignment/pairwise/detail/type_traits.hpp:136
typename std::remove_reference_t< decltype(std::declval< configuration_t >().get_or(align_cfg::score_type< int32_t >{}))>::type original_score_type
The original score type selected by the user.
Definition: alignment/pairwise/detail/type_traits.hpp:134
Provides type traits for working with templates.
Provides seqan3::simd::simd_concept.