130template <
typename sequence_t,
typename alignment_config_t>
131 requires detail::align_pairwise_single_input<sequence_t>
132 && std::copy_constructible<std::remove_reference_t<sequence_t>>
133 && detail::is_type_specialisation_of_v<alignment_config_t, configuration>
138 if constexpr (std::is_lvalue_reference_v<sequence_t>)
144 static_assert(std::tuple_size_v<std::remove_reference_t<sequence_t>> == 2,
145 "Alignment configuration error: Expects exactly two sequences for pairwise alignments.");
147 static_assert(std::ranges::viewable_range<std::tuple_element_t<0, std::remove_reference_t<sequence_t>>>
148 && std::ranges::viewable_range<std::tuple_element_t<1, std::remove_reference_t<sequence_t>>>,
149 "Alignment configuration error: The tuple elements must model std::ranges::viewable_range.");
151 return align_pairwise(std::views::single(std::forward<sequence_t>(
seq)), config);
156template <
typename sequence_t,
typename alignment_config_t>
157 requires detail::align_pairwise_range_input<sequence_t>
158 && detail::is_type_specialisation_of_v<alignment_config_t, configuration>
159constexpr auto align_pairwise(sequence_t && sequences, alignment_config_t
const & config)
161 using first_seq_t = std::tuple_element_t<0, std::ranges::range_value_t<sequence_t>>;
162 using second_seq_t = std::tuple_element_t<1, std::ranges::range_value_t<sequence_t>>;
164 static_assert(std::ranges::random_access_range<first_seq_t> && std::ranges::sized_range<first_seq_t>,
165 "Alignment configuration error: The sequence must model random_access_range and sized_range.");
166 static_assert(std::ranges::random_access_range<second_seq_t> && std::ranges::sized_range<second_seq_t>,
167 "Alignment configuration error: The sequence must model random_access_range and sized_range.");
170 auto seq_view = std::forward<sequence_t>(sequences) | seqan3::detail::all;
172 auto && [algorithm, complete_config] = detail::alignment_configurator::configure<decltype(seq_view)>(config);
175 using traits_t = detail::alignment_configuration_traits<complete_config_t>;
177 auto indexed_sequence_chunk_view =
180 using indexed_sequences_t =
decltype(indexed_sequence_chunk_view);
181 using alignment_result_t =
typename traits_t::alignment_result_type;
183 detail::execution_handler_parallel,
184 detail::execution_handler_sequential>;
185 using executor_t = detail::
186 algorithm_executor_blocking<indexed_sequences_t,
decltype(algorithm), alignment_result_t, execution_handler_t>;
189 auto select_execution_handler = [parallel = complete_config.get_or(
align_cfg::parallel{})]()
191 if constexpr (std::same_as<execution_handler_t, detail::execution_handler_parallel>)
193 auto thread_count =
parallel.thread_count;
195 throw std::runtime_error{
"You must configure the number of threads in seqan3::align_cfg::parallel."};
197 return execution_handler_t{*thread_count};
201 return execution_handler_t{};
205 if constexpr (traits_t::is_one_way_execution)
206 select_execution_handler().bulk_execute(algorithm,
207 indexed_sequence_chunk_view,
208 get<align_cfg::on_result>(complete_config).callback);
210 return algorithm_result_generator_range{executor_t{std::move(indexed_sequence_chunk_view),
211 std::move(algorithm),
212 alignment_result_t{},
213 select_execution_handler()}};
Provides seqan3::detail::algorithm_executor_blocking.
Provides seqan3::detail::algorithm_result_generator_range.
Provides concepts needed internally for the alignment algorithms.
Provides helper type traits for the configuration and execution of the alignment algorithm.
Provides seqan3::detail::alignment_selector.
Provides seqan3::alignment_result.
Provides seqan3::detail::all.
Provides various type traits on generic types.
seqan3::detail::parallel_mode< std::integral_constant< seqan3::detail::align_config_id, seqan3::detail::align_config_id::parallel > > parallel
Enables the parallel execution of the alignment algorithm if possible for the given configuration.
Definition: align_config_parallel.hpp:38
constexpr auto align_pairwise(sequence_t &&seq, alignment_config_t const &config)
Computes the pairwise alignment for a pair of sequences or a range over sequence pairs.
Definition: align_pairwise.hpp:134
@ seq
The "sequence", usually a range of nucleotides or amino acids.
seqan::std::views::chunk chunk
A view adaptor that divides a range into chunks. <dl class="no-api">This entity is not part of the Se...
Definition: chunk.hpp:26
seqan::std::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:27
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
Provides seqan3::simd::simd_type.
Provides seqan3::simd::simd_traits.