15 #include <type_traits> 17 #include <range/v3/algorithm/for_each.hpp> 37 struct default_find_optimum_trait
58 template <
typename derived_t,
typename traits_type = default_find_optimum_trait>
59 class find_optimum_policy
70 constexpr find_optimum_policy() =
default;
71 constexpr find_optimum_policy(find_optimum_policy
const &) =
default;
72 constexpr find_optimum_policy(find_optimum_policy &&) =
default;
73 constexpr find_optimum_policy & operator=(find_optimum_policy
const &) =
default;
74 constexpr find_optimum_policy & operator=(find_optimum_policy &&) =
default;
75 ~find_optimum_policy() =
default;
89 template <
typename score_t>
90 constexpr
void check_score([[maybe_unused]] alignment_optimum<score_t>
const & current,
91 [[maybe_unused]] alignment_optimum<score_t> & optimum)
const noexcept
93 if constexpr (traits_type::find_in_every_cell_type::value)
95 optimum =
std::max(optimum, current, alignment_optimum_compare_less{});
111 template <
typename score_t>
112 constexpr
void check_score_last_row([[maybe_unused]] alignment_optimum<score_t>
const & current,
113 [[maybe_unused]] alignment_optimum<score_t> & optimum)
const noexcept
115 if constexpr (traits_type::find_in_last_row_type::value)
116 optimum =
std::max(optimum, current, alignment_optimum_compare_less{});
131 template <std::ranges::B
idirectionalRange rng_t,
typename score_t>
132 constexpr
void check_score_last_column(rng_t
const & rng,
133 alignment_optimum<score_t> & optimum)
const noexcept
137 if constexpr (traits_type::find_in_last_column_type::value)
139 ranges::for_each(rng, [&](
auto && entry)
142 alignment_optimum<score_t>{get<0>(get<0>(entry)),
143 static_cast<alignment_coordinate
>(get<1>(entry))},
144 alignment_optimum_compare_less{});
151 alignment_optimum<score_t>{get<0>(get<0>(last)),
152 static_cast<alignment_coordinate
>(get<1>(last))},
153 alignment_optimum_compare_less{});
168 template <
typename optimum_type,
169 typename dimension_type,
171 typename gap_scheme_type>
172 constexpr
void balance_trailing_gaps([[maybe_unused]] optimum_type & total,
173 [[maybe_unused]] dimension_type
const dimension_first,
174 [[maybe_unused]] dimension_type
const dimension_second,
175 [[maybe_unused]] band_type
const & band,
176 [[maybe_unused]] gap_scheme_type
const & scheme)
181 if constexpr (!traits_type::find_in_last_row_type::value && !traits_type::find_in_every_cell_type::value)
183 cmp_int_type gap_size = dimension_first -
184 std::min(static_cast<cmp_int_type>(band.upper_bound + dimension_second),
185 static_cast<cmp_int_type>(dimension_first));
187 assert(gap_size >= 0);
188 total.score += scheme.score(gap_size);
192 if constexpr (!traits_type::find_in_last_column_type::value && !traits_type::find_in_every_cell_type::value)
195 cmp_int_type gap_size = dimension_second -
196 std::min(static_cast<cmp_int_type>(dimension_first - band.lower_bound),
197 static_cast<cmp_int_type>(dimension_second));
199 assert(gap_size >= 0);
200 total.score += scheme.score(gap_size);
::ranges::prev prev
Alias for ranges::prev. Returns the nth predecessor of the given iterator.
Definition: iterator:326
Provides C++20 additions to the <iterator> header.
Provides various shortcuts for common std::ranges functions.
Provides seqan3::detail::deferred_crtp_base.
Adaptations of concepts from the Ranges TS.
Definition: aligned_sequence_concept.hpp:35
auto const get
A view calling std::get on each element in a range.
Definition: get.hpp:66
::ranges::end end
Alias for ranges::end. Returns an iterator to the end of a range.
Definition: ranges:179
Provides seqan3::detail::alignment_optimum.