25 namespace seqan3::detail
65 template <simd_concept simd_score_t, semialphabet alphabet_t,
typename alignment_t>
67 requires (seqan3::alphabet_size<alphabet_t> > 1) &&
68 (std::same_as<alignment_t, align_cfg::method_local> ||
69 std::same_as<alignment_t, align_cfg::method_global>)
71 class simd_match_mismatch_scoring_scheme
75 using scalar_type =
typename simd_traits<simd_score_t>::scalar_type;
77 using alphabet_ranks_type = simd_score_t;
81 static constexpr scalar_type padding_symbol =
static_cast<scalar_type
>(1u << (bits_of<scalar_type> - 1));
87 constexpr simd_match_mismatch_scoring_scheme() =
default;
89 constexpr simd_match_mismatch_scoring_scheme(simd_match_mismatch_scoring_scheme
const &) =
default;
91 constexpr simd_match_mismatch_scoring_scheme(simd_match_mismatch_scoring_scheme &&) =
default;
93 constexpr simd_match_mismatch_scoring_scheme & operator=(simd_match_mismatch_scoring_scheme
const &) =
default;
95 constexpr simd_match_mismatch_scoring_scheme & operator=(simd_match_mismatch_scoring_scheme &&) =
default;
97 ~simd_match_mismatch_scoring_scheme() =
default;
100 template <
typename scoring_scheme_t>
104 constexpr
explicit simd_match_mismatch_scoring_scheme(scoring_scheme_t
const & scoring_scheme)
106 initialise_from_scalar_scoring_scheme(scoring_scheme);
110 template <
typename scoring_scheme_t>
114 constexpr simd_match_mismatch_scoring_scheme & operator=(scoring_scheme_t
const & scoring_scheme)
116 initialise_from_scalar_scoring_scheme(scoring_scheme);
150 constexpr simd_score_t score(alphabet_ranks_type
const & ranks1, alphabet_ranks_type
const & ranks2)
153 typename simd_traits<simd_score_t>::mask_type mask;
156 if constexpr (std::same_as<alignment_t, align_cfg::method_global>)
157 mask = (ranks1 ^ ranks2) <= simd::fill<simd_score_t>(0);
159 mask = (ranks1 ^ ranks2) == simd::fill<simd_score_t>(0);
161 return mask ? match_score : mismatch_score;
166 constexpr
auto padding_match_score() noexcept
168 return match_score[0];
172 template <
typename alphabet_ranks_t>
174 requires std::same_as<std::remove_cvref_t<alphabet_ranks_t>, alphabet_ranks_type>
176 constexpr alphabet_ranks_t make_score_profile(alphabet_ranks_t && ranks)
const noexcept
178 return std::forward<alphabet_ranks_t>(ranks);
197 template <
typename scoring_scheme_t>
198 constexpr
void initialise_from_scalar_scoring_scheme(scoring_scheme_t
const & scoring_scheme)
200 using score_t = decltype(std::declval<scoring_scheme_t const &>().score(alphabet_t{}, alphabet_t{}));
201 using simd_scalar_t =
typename simd_traits<simd_score_t>::scalar_type;
209 if constexpr (
sizeof(simd_scalar_t) <
sizeof(score_t))
215 "for the selected scalar type of the simd type."};
219 match_score = simd::fill<simd_score_t>(
static_cast<simd_scalar_t
>(scalar_match_score));
220 mismatch_score = simd::fill<simd_score_t>(
static_cast<simd_scalar_t
>(scalar_mismatch_score));
223 simd_score_t match_score;
224 simd_score_t mismatch_score;
Provides algorithms to modify seqan3::simd::simd_type.
Provides global and local alignment configurations.
Core alphabet concept and free function/type trait wrappers.
Provides utility functions for bit twiddling.
Adaptions of concepts from the Cereal library.
constexpr auto assign_rank_to
Assign a rank to an alphabet object.
Definition: concept.hpp:291
A concept that requires that type be able to score two letters.
Provides seqan3::scoring_scheme_for.
Provides seqan3::simd::simd_concept.