29 namespace seqan3::detail
34 struct search_configuration_validator
40 template <
typename query_t>
41 static void validate_query_type()
44 if constexpr(range_dimension_v<pure_query_t> == 1u)
46 static_assert(std::ranges::random_access_range<pure_query_t>,
47 "The query sequence must model random_access_range.");
48 static_assert(std::ranges::sized_range<pure_query_t>,
"The query sequence must model sized_range.");
52 static_assert(std::ranges::forward_range<pure_query_t>,
"The query collection must model forward_range.");
53 static_assert(std::ranges::sized_range<pure_query_t>,
"The query collection must model sized_range.");
54 static_assert(std::ranges::random_access_range<std::ranges::range_value_t<pure_query_t>>,
55 "Elements of the query collection must model random_access_range.");
56 static_assert(std::ranges::sized_range<std::ranges::range_value_t<pure_query_t>>,
57 "Elements of the query collection must model sized_range.");
100 std::ranges::forward_range queries_t,
103 requires std::ranges::forward_range<std::ranges::range_reference_t<queries_t>>
106 index_t
const & index,
109 auto updated_cfg = detail::search_configurator::add_defaults(cfg);
111 detail::search_configuration_validator::validate_query_type<queries_t>();
113 size_t queries_size = std::ranges::distance(queries);
114 auto indexed_queries = views::zip(std::views::iota(
size_t{0}, queries_size), queries);
116 using indexed_queries_t = decltype(indexed_queries);
118 using query_t = std::ranges::range_reference_t<indexed_queries_t>;
119 auto [algorithm, complete_config] = detail::search_configurator::configure_algorithm<query_t>(updated_cfg, index);
121 using complete_configuration_t = decltype(complete_config);
122 using traits_t = detail::search_traits<complete_configuration_t>;
123 using algorithm_result_t =
typename traits_t::search_result_type;
125 complete_configuration_t::template exists<search_cfg::parallel>(),
126 detail::execution_handler_parallel,
127 detail::execution_handler_sequential>;
130 auto select_execution_handler = [&] ()
132 if constexpr (std::same_as<execution_handler_t, detail::execution_handler_parallel>)
134 auto thread_count = get<search_cfg::parallel>(complete_config).thread_count;
136 throw std::runtime_error{
"You must configure the number of threads in seqan3::search_cfg::parallel."};
138 return execution_handler_t{*thread_count};
142 return execution_handler_t{};
147 if constexpr (traits_t::has_user_callback)
149 select_execution_handler().bulk_execute(algorithm,
151 get<search_cfg::on_result>(complete_config).callback);
155 using executor_t = detail::algorithm_executor_blocking<indexed_queries_t,
158 execution_handler_t>;
162 algorithm_result_t{},
163 select_execution_handler()}};
171 std::ranges::forward_range query_t,
173 inline auto search(query_t && query,
174 index_t
const & index,
181 template <fm_index_specialisation index_t,
typename configuration_t = decltype(search_cfg::default_configuration)>
182 inline auto search(
char const *
const queries,
183 index_t
const & index,
190 template <fm_index_specialisation index_t,
typename configuration_t = decltype(search_cfg::default_configuration)>
192 index_t
const & index,