15#include <seqan3/search/views/minimiser_hash.hpp>
27template <
typename index_t>
28void search_singular_ibf(search_arguments
const & arguments, index_t && index)
30 constexpr bool is_ibf = std::same_as<index_t, raptor_index<index_structure::ibf>>
31 || std::same_as<index_t, raptor_index<index_structure::ibf_compressed>>;
33 auto cereal_worker = [&]()
35 load_index(index, arguments);
37 auto cereal_handle =
std::async(std::launch::async, cereal_worker);
39 seqan3::sequence_file_input<dna4_traits, seqan3::fields<seqan3::field::id, seqan3::field::seq>> fin{
40 arguments.query_file};
41 using record_type =
typename decltype(fin)::record_type;
44 sync_out synced_out{arguments};
48 auto worker = [&](
size_t const start,
size_t const end)
50 timer<concurrent::no> local_compute_minimiser_timer{};
51 timer<concurrent::no> local_query_ibf_timer{};
52 timer<concurrent::no> local_generate_results_timer{};
54 auto counter = [&index]()
57 return index.ibf().template counting_agent<uint16_t>();
59 return index.ibf().membership_agent();
64 auto hash_adaptor = seqan3::views::minimiser_hash(arguments.shape,
65 seqan3::window_size{arguments.window_size},
66 seqan3::seed{adjust_seed(arguments.shape_weight)});
68 for (
auto && [
id, seq] : records | seqan3::views::slice(start, end))
70 result_string.clear();
72 result_string +=
'\t';
74 auto minimiser_view = seq | hash_adaptor | std::views::common;
75 local_compute_minimiser_timer.start();
76 minimiser.assign(minimiser_view.begin(), minimiser_view.end());
77 local_compute_minimiser_timer.stop();
79 size_t const minimiser_count{minimiser.size()};
80 size_t const threshold = thresholder.get(minimiser_count);
84 local_query_ibf_timer.start();
85 auto & result = counter.bulk_count(minimiser);
86 local_query_ibf_timer.stop();
87 size_t current_bin{0};
88 local_generate_results_timer.start();
89 for (
auto && count : result)
91 if (count >= threshold)
101 local_query_ibf_timer.start();
102 auto & result = counter.bulk_contains(minimiser, threshold);
103 local_query_ibf_timer.stop();
104 local_generate_results_timer.start();
105 for (
auto && count : result)
108 result_string +=
',';
112 if (
auto & last_char = result_string.back(); last_char ==
',')
115 result_string +=
'\n';
117 synced_out.write(result_string);
118 local_generate_results_timer.stop();
121 arguments.compute_minimiser_timer += local_compute_minimiser_timer;
122 arguments.query_ibf_timer += local_query_ibf_timer;
123 arguments.generate_results_timer += local_generate_results_timer;
126 for (
auto && chunked_records : fin | seqan3::views::chunk((1ULL << 20) * 10))
129 arguments.query_file_io_timer.start();
131 arguments.query_file_io_timer.stop();
133 cereal_handle.wait();
135 do_parallel(worker, records.size(), arguments.threads);
Provides raptor::adjust_seed.
T back_inserter(T... args)
Definition: threshold.hpp:22
Provides raptor::dna4_traits.
Provides raptor::do_parallel.
Provides raptor::load_index.
Provides raptor::sync_out.
Provides raptor::threshold::threshold.