HIBF 1.0.0-rc.1
Loading...
Searching...
No Matches
hierarchical_binning.hpp
1// SPDX-FileCopyrightText: 2006-2024, Knut Reinert & Freie Universität Berlin
2// SPDX-FileCopyrightText: 2016-2024, Knut Reinert & MPI für molekulare Genetik
3// SPDX-License-Identifier: BSD-3-Clause
4
5#pragma once
6
7#include <cassert> // for assert
8#include <cstddef> // for size_t
9#include <memory> // for addressof
10#include <utility> // for pair
11#include <vector> // for vector
12
13#include <hibf/build/bin_size_in_bits.hpp> // for bin_size_in_bits
14#include <hibf/config.hpp> // for config
15#include <hibf/layout/data_store.hpp> // for data_store
17#include <hibf/platform.hpp> // for HIBF_WORKAROUND_GCC_BOGUS_MEMCPY
18
19namespace seqan::hibf::layout
20{
21
26{
27private:
31 data_store * data{nullptr};
32
34 size_t num_user_bins{};
36 size_t num_technical_bins{};
37
39 struct maximum_bin_tracker
40 {
41 size_t max_id{};
42 size_t max_size{};
43 size_t max_split_id{};
44 size_t max_split_size{};
45
46 void update_max(size_t const new_id, size_t const new_size)
47 {
48 if (new_size > max_size)
49 {
50 max_id = new_id;
51 max_size = new_size;
52 }
53 }
54
56 void update_split_max(size_t const new_id, size_t const new_size)
57 {
58 if (new_size > max_split_size)
59 {
60 max_split_id = new_id;
61 max_split_size = new_size;
62 }
63 }
64
78 size_t choose_max_bin(seqan::hibf::config const & config)
79 {
80 if (max_id == max_split_id) // Overall max bin is a split bin.
81 return max_id;
82
83 // Split cardinality `max_split_size` already accounts for fpr correction.
84 // The minimum size of the TBs of this IBF to ensure the maximum_false_positive_rate for split bins.
85 size_t const minimum_bits{build::bin_size_in_bits({.fpr = config.maximum_fpr,
86 .hash_count = config.number_of_hash_functions,
87 .elements = max_split_size})};
88
89 // The potential size of the TBs of this IBF given the allowed merged bin FPR.
90 size_t const merged_bits{build::bin_size_in_bits({.fpr = config.relaxed_fpr, //
91 .hash_count = config.number_of_hash_functions,
92 .elements = max_size})};
93
94 // If split and merged bits are the same, we prefer merged bins. Better for build parallelisation.
95 if ((minimum_bits > merged_bits))
96 return max_split_id;
97
98 return max_id;
99 }
100 };
101
102public:
109
118 config{config_},
119 data{std::addressof(data_)},
120 num_user_bins{data->positions.size()},
121 num_technical_bins{data->previous.empty() ? config.tmax : needed_technical_bins(num_user_bins)}
122 {
123 assert(data != nullptr);
124 }
125
127 size_t execute();
128
129private:
133 [[nodiscard]] size_t needed_technical_bins(size_t const requested_num_ub) const;
134
138 [[nodiscard]] size_t max_merge_levels(size_t const num_ubs_in_merge) const;
139
144 void initialization(md_vector<size_t> & matrix,
145 md_vector<size_t> & ll_matrix,
147
186 void
187 recursion(md_vector<size_t> & matrix, md_vector<size_t> & ll_matrix, md_vector<std::pair<size_t, size_t>> & trace);
188
189 void backtrack_merged_bin(size_t trace_j,
190 size_t const next_j,
191 size_t const bin_id,
192 maximum_bin_tracker & max_tracker,
193 bool is_first_row = false);
194
195 void backtrack_split_bin(size_t trace_j,
196 size_t const number_of_bins,
197 size_t const bin_id,
198 maximum_bin_tracker & max_tracker);
199
201 size_t backtracking(md_vector<std::pair<size_t, size_t>> const & trace);
202
203 data_store initialise_libf_data(size_t const trace_j) const;
204
205 void process_merged_bin(data_store & libf_data, size_t const bin_id) const;
206
207 void update_libf_data(data_store & libf_data, size_t const bin_id) const;
208
209 size_t add_lower_level(data_store & libf_data) const;
210};
211
212} // namespace seqan::hibf::layout
Implements seqan::hibf::bin_size_in_bits.
Hierarchical binning algorithm.
Definition hierarchical_binning.hpp:26
size_t execute()
Executes the hierarchical binning algorithm and layouts user bins into technical bins.
hierarchical_binning & operator=(hierarchical_binning &&)=default
Defaulted.
hierarchical_binning(hierarchical_binning const &)=delete
Deleted. Would modify same data.
hierarchical_binning(data_store &data_, seqan::hibf::config const &config_)
The constructor from user bin names, their kmer counts and a config.
Definition hierarchical_binning.hpp:117
hierarchical_binning(hierarchical_binning &&)=default
Defaulted.
hierarchical_binning & operator=(hierarchical_binning const &)=delete
Deleted. Would modify same data.
constexpr size_t bin_size_in_bits(bin_size_parameters const &params)
Computes the bin size.
Definition bin_size_in_bits.hpp:35
Provides seqan::hibf::md_vector.
Provides platform and dependency checks.
The configuration used to build an (H)IBF.
Definition config.hpp:74
size_t number_of_hash_functions
The number of hash functions for the underlying Bloom Filters.
Definition config.hpp:132
double maximum_fpr
The desired maximum false positive rate of the underlying Bloom Filters. [RECOMMENDED_TO_ADAPT].
Definition config.hpp:150
double relaxed_fpr
Allow a higher FPR in non-accuracy-critical parts of the HIBF structure.
Definition config.hpp:178
Contains information used for the layout.
Definition data_store.hpp:25
Definition md_vector.hpp:21