71 template <
typename index_t,
typename query_t,
typename configuration_t>
72 inline auto search_single(index_t
const & index, query_t & query, configuration_t
const & cfg)
75 detail::search_param
max_error{0, 0, 0, 0};
76 auto & [total, subs, ins, del] =
max_error;
77 if constexpr (contains<search_cfg::id::max_error>(cfg))
79 std::tie(total, subs, ins, del) = get<search_cfg::id::max_error>(cfg);
81 else if constexpr (contains<search_cfg::id::max_error_rate>(cfg))
85 std::tie(total, subs, ins, del) = std::apply([& query] (
auto && ... args)
87 return std::tuple{(args * query.size())...};
88 }, get<search_cfg::id::max_error_rate>(cfg));
97 std::vector<typename index_t::iterator_type> internal_hits;
98 auto internal_delegate = [&internal_hits, &
max_error] (
auto const & it)
100 internal_hits.push_back(it);
104 auto const & selected_mode = seqan3::get<search_cfg::id::mode>(cfg);
107 detail::search_param max_error2{
max_error};
108 max_error2.total = 0;
109 while (internal_hits.empty() && max_error2.total <=
max_error.total)
111 detail::search_algo<true>(index, query, max_error2, internal_delegate);
117 detail::search_param max_error2{
max_error};
118 max_error2.total = 0;
119 while (internal_hits.empty() && max_error2.total <=
max_error.total)
121 detail::search_algo<false>(index, query, max_error2, internal_delegate);
127 detail::search_param max_error2{
max_error};
128 max_error2.total = 0;
129 while (internal_hits.empty() && max_error2.total <=
max_error.total)
131 detail::search_algo<true>(index, query, max_error2, internal_delegate);
134 if (!internal_hits.empty())
136 internal_hits.clear();
137 uint8_t
const s = selected_mode;
138 max_error2.total += s - 1;
139 detail::search_algo<false>(index, query, max_error2, internal_delegate);
144 detail::search_algo<false>(index, query,
max_error, internal_delegate);
150 auto const &
output = seqan3::get<search_cfg::id::output>(cfg);
153 return internal_hits;
157 std::vector<typename index_t::size_type> hits;
158 auto const & selected_mode = seqan3::get<search_cfg::id::mode>(cfg);
162 if (!internal_hits.empty())
164 auto text_pos = internal_hits[0].lazy_locate();
165 hits.push_back(text_pos[0]);
170 for (
auto const & it : internal_hits)
172 for (
auto const & text_pos : it.locate())
173 hits.push_back(text_pos);
174 std::sort(hits.begin(), hits.end());
175 hits.erase(std::unique(hits.begin(), hits.end()), hits.end());
200 template <
typename index_t,
typename queries_t,
typename configuration_t>
201 inline auto search_all(index_t
const & index, queries_t & queries, configuration_t
const & cfg)
207 auto const & output = seqan3::get<search_cfg::id::output>(cfg);
208 using hit_t = std::conditional_t<std::Same<remove_cvref_t<decltype(output)>, detail::search_output_index_iterator>,
209 typename index_t::iterator_type,
210 typename index_t::size_type>;
215 std::vector<std::vector<hit_t>> hits;
216 hits.reserve(std::distance(queries.begin(), queries.end()));
217 for (
auto const query : queries)
219 hits.push_back(search_single(index, query, cfg));
226 return search_single(index, queries, cfg);
constexpr detail::align_config_output_adaptor< e > output
A configuration adaptor for alignment output.
Definition: align_config_output.hpp:114
Provides the algorithm to search in an index using search schemes.
Provides the concepts for seqan3::fm_index and seqan3::bi_fm_index and its traits and iterators...
constexpr detail::align_config_max_error_adaptor max_error
A configuration adaptor for maximal errors.
Definition: align_config_max_error.hpp:110
Specifies requirements of a Range type for which begin returns a type that models std::RandomAccessIt...
The concept std::Same<T, U> is satisfied if and only if T and U denote the same type.
Provides an approximate string matching algorithm based on simple backtracking. This should only be u...
Specifies requirements of a Range type for which begin returns a type that models std::ForwardIterato...
Definition: aligned_sequence_concept.hpp:288