33 uint8_t
const kmer_size{arguments.shape.size()};
34 size_t const kmers_per_window = arguments.window_size - kmer_size + 1;
38 threshold_kind = threshold_kinds::percentage;
39 threshold_percentage = arguments.percentage;
41 else if (kmers_per_window == 1u)
43 threshold_kind = threshold_kinds::lemma;
44 size_t const kmer_lemma_minuend = arguments.query_length + 1u;
45 size_t const kmer_lemma_subtrahend = (arguments.errors + 1u) * kmer_size;
46 kmer_lemma = kmer_lemma_minuend > kmer_lemma_subtrahend ? kmer_lemma_minuend - kmer_lemma_subtrahend : 0;
50 threshold_kind = threshold_kinds::probabilistic;
51 size_t const kmers_per_pattern = arguments.query_length - kmer_size + 1;
52 minimal_number_of_minimizers = kmers_per_pattern / kmers_per_window;
53 maximal_number_of_minimizers = arguments.query_length - arguments.window_size + 1;
54 precomp_correction = precompute_correction(arguments);
55 precomp_thresholds = precompute_threshold(arguments);
59 size_t get(
size_t const minimiser_count)
const noexcept
61 switch (threshold_kind)
63 case threshold_kinds::lemma:
65 case threshold_kinds::percentage:
66 return static_cast<size_t>(minimiser_count * threshold_percentage);
69 assert(threshold_kind == threshold_kinds::probabilistic);
70 size_t const index =
std::clamp(minimiser_count, minimal_number_of_minimizers, maximal_number_of_minimizers)
71 - minimal_number_of_minimizers;
72 return precomp_thresholds[index] + precomp_correction[index];
78 enum class threshold_kinds
85 threshold_kinds threshold_kind{threshold_kinds::probabilistic};
89 size_t minimal_number_of_minimizers{};
90 size_t maximal_number_of_minimizers{};
91 double threshold_percentage{};