16#include <seqan3/utility/simd/algorithm.hpp>
17#include <seqan3/utility/simd/simd.hpp>
18#include <seqan3/utility/simd/simd_traits.hpp>
22namespace seqan3::detail
41struct max_score_updater_simd_global
60 template <
typename score_t,
typename coordinate_t>
61 requires (std::assignable_from<score_t &, score_t const &> &&
62 requires (coordinate_t coordinate)
64 requires simd_concept<
decltype(coordinate.col)>;
65 requires simd_concept<
decltype(coordinate.row)>;
67 void operator()(score_t & optimal_score,
68 coordinate_t
const & optimal_coordinate,
69 score_t current_score,
70 coordinate_t
const & current_coordinate)
const noexcept
73 (optimal_coordinate.col == current_coordinate.col) && (optimal_coordinate.row == current_coordinate.row);
74 optimal_score = (mask) ? std::move(current_score) : optimal_score;
82template <
typename alignment_configuration_t, std::semiregular optimum_updater_t>
83 requires is_type_specialisation_of_v<alignment_configuration_t, configuration>
86 typename alignment_configuration_traits<alignment_configuration_t>::score_type &,
87 typename alignment_configuration_traits<alignment_configuration_t>::matrix_coordinate_type &,
88 typename alignment_configuration_traits<alignment_configuration_t>::score_type,
89 typename alignment_configuration_traits<alignment_configuration_t>::matrix_coordinate_type>
90class policy_optimum_tracker_simd :
protected policy_optimum_tracker<alignment_configuration_t, optimum_updater_t>
94 using base_policy_t = policy_optimum_tracker<alignment_configuration_t, optimum_updater_t>;
97 using typename base_policy_t::score_type;
98 using typename base_policy_t::traits_type;
101 using scalar_type =
typename simd::simd_traits<score_type>::scalar_type;
103 using original_score_type =
typename traits_type::original_score_type;
105 static_assert(simd_concept<score_type>,
"Must be a simd type!");
108 using base_policy_t::compare_and_set_optimum;
109 using base_policy_t::optimal_coordinate;
110 using base_policy_t::optimal_score;
117 policy_optimum_tracker_simd() =
default;
118 policy_optimum_tracker_simd(policy_optimum_tracker_simd
const &) =
default;
119 policy_optimum_tracker_simd(policy_optimum_tracker_simd &&) =
default;
120 policy_optimum_tracker_simd & operator=(policy_optimum_tracker_simd
const &) =
default;
121 policy_optimum_tracker_simd & operator=(policy_optimum_tracker_simd &&) =
default;
122 ~policy_optimum_tracker_simd() =
default;
132 policy_optimum_tracker_simd(alignment_configuration_t
const & config) : base_policy_t{config}
134 base_policy_t::test_last_row_cell =
true;
135 base_policy_t::test_last_column_cell =
true;
191 template <std::ranges::input_range sequence1_collection_t, std::ranges::input_range sequence2_collection_t>
192 void initialise_tracker(sequence1_collection_t & sequence1_collection,
193 sequence2_collection_t & sequence2_collection)
195 using index_t =
typename traits_type::matrix_index_type;
196 using scalar_index_t =
typename simd_traits<index_t>::scalar_type;
198 scalar_index_t largest_sequence1_size{};
199 scalar_index_t largest_sequence2_size{};
204 size_t sequence_count{};
205 for (
auto && [sequence1, sequence2] : views::
zip(sequence1_collection, sequence2_collection))
207 sequence1_sizes[sequence_count] = std::ranges::distance(sequence1);
208 sequence2_sizes[sequence_count] = std::ranges::distance(sequence2);
209 largest_sequence1_size =
std::max(largest_sequence1_size, sequence1_sizes[sequence_count]);
210 largest_sequence2_size =
std::max(largest_sequence2_size, sequence2_sizes[sequence_count]);
217 for (
size_t index = 0; index != sequence_count; ++index)
219 assert(sequence1_sizes[index] <= largest_sequence1_size);
220 assert(sequence2_sizes[index] <= largest_sequence2_size);
222 padding_offsets[index] =
std::min(largest_sequence1_size - sequence1_sizes[index],
223 largest_sequence2_size - sequence2_sizes[index]);
224 sequence1_sizes[index] += padding_offsets[index];
225 sequence2_sizes[index] += padding_offsets[index];
229 optimal_coordinate.col = simd::load<index_t>(sequence1_sizes.data());
230 optimal_coordinate.row = simd::load<index_t>(sequence2_sizes.data());
seqan::stl::views::zip zip
A view adaptor that takes several views and returns tuple-like values from every i-th element of each...
Definition zip.hpp:24
Provides lazy template instantiation traits.
Provides seqan3::detail::policy_optimum_tracker.
Provides seqan3::views::zip.